On Tue, 12 Jan 2010, Stéphane Ducasse wrote:
On Jan 12, 2010, at 1:20 PM, Lukas Renggli wrote:
- #copy is the normal copy operation. It should be used by default and
never overridden. It calls #postCopy that can be overridden to have
class specific copy semantics.
- #shallowCopy does a shallow copy. It should never be overridden and
only be used if you want to get these very specific semantics.
- #deepCopy does a deep copy. It should never be overridden and only
be used if you want to get these very specific semantics.
- #clone comes from eToys and Morphic (AFAIK). It implements some
other copy semantics than #copy. I don't think that anybody should
call this method, other than code that depends on this particular copy
behavior.
we should copy that in Object class comment and all the methods
where do you see that it is morphic related for me clone is only implemented
on character, Boolean, Object, SMalltInt symbol, UndefinedObject
Back in the old days, Squeak 1.1 didn't have primitive 148 (which is
now used by both #shallowCopy and #clone). #shallowCopy was the way to
create a "one-level copy" of an Object. It had the same code as today, but
with no primitive.
Primitive 148 was introduced somewhere between 1.1 and 1.19 (note that 1.2
came after 1.19). 1.19 (and probably earlier versions, but not 1.1) had
#clone which was primitive only and #shallowCopy which didn't use the
primitive. Morphic was being ported to Squeak at the time and it was the
only user of #clone. Morphs were copied by #clone which was pretty fast,
while other objects used #shallowCopy. Later the use of #clone started to
spread, until primitive 148 was added to #shallowCopy. Sends of #clone
were replaced with #shallowCopy and #copy, but #clone was kept, probably
for backwards compatibility.
#clone and #shallowCopy have a difference in their semantics. If the vm
cannot allocate enough space for the new object, #clone raises an error
immediately, while #shallowCopy signals the low space semaphore, so the
image or the user can do something, then retries the copying.
Levente
This is exactly the same problematic as with #=. There can't be just
one #=. Other clients might consider other things when comparing
objects.
Lukas
--
Lukas Renggli
http://www.lukas-renggli.ch
_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project