On Wed, Oct 12, 2011 at 6:02 PM, Stéphane Ducasse <[email protected] > wrote:
> Mariano please enhance the comments and publish them :) > > I would like so.... but I would like that a real hacker tell me whether I am correct or not. > Stef > > On Oct 12, 2011, at 5:49 PM, Mariano Martinez Peck wrote: > > > > > > > On Wed, Oct 12, 2011 at 5:38 PM, Levente Uzonyi <[email protected]> wrote: > > On Wed, 12 Oct 2011, Clara Allende wrote: > > > > Hi guys, > > > > I'm wondering, why? > > > > ProtoObject>> ~~ anObject > > "Answer whether the receiver and the argument are not the same object > > (do not have the same object pointer)." > > > > self == anObject > > ifTrue: [^ false] > > ifFalse: [^ true] > > > > > > Hi Carla. I can think about two things. The first one, is the one Levente > said, performance. > > If you analyze the bycode of this method, you will see that it is > extremely fast because: > > > > 1) #== has an special associated bytecode, that is, them VM maps such > bytecode to an specific primitive and it is directly executed. It means that > the method #== is really never sent. > > 2) ifTrue:ifFalse: is also optimized (inlined) by the compiler. Again, it > method is never executed and instead the compiler replace a message send > bytecode with jump ones. > > > > Another possible reason (it may not be the case, but in another places it > is), is to prevent VM interruption for check other processes. In summary, > the VM checks whether it should execute another process of the queue after a > method execution. As you know, some parts of the scheduling process is done > at the image side. And from there we lack a way to say to the VM, "please > execute this method without checking others processes". Hence, in a few yet > very specific places of PRocess, Scheduler, Semaphore, etc, #== is used as a > mean of executing something WITHOUT being interrupted. I can imagine that it > may happen the same with #~~. So if you implement such method with a #not, > you will indeed send a message, proving a possibilty to be interrupted. > > > > Another reasons, similar to the previous one, is that sometimes #== is > also used as a way to avoid executing method. So..there are some methods (I > don't remember if #allInstancesDo: or #allObjectsDo:) will loop forever > because the loop condition would be creating objects (remember that method > execution creates objects such as MethodContext). > > So...again, I think it may happen the same with #~~. > > > > That being said, I agree that the method deserve a GOOD comment > explaining the reasons of such optimization. > > > > Cheers > > > > > > Instead of: > > ProtoObject>> ~~ anObject > > "Answer whether the receiver and the argument are not the same object > > (do not have the same object pointer)." > > > > ^(self == anObject) not > > > > And why? > > Object >> ~= anObject > > "Answer whether the receiver and the argument do not represent the > > same object." > > > > ^self = anObject == false > > > > Instead of > > Object>> ~= anObject > > "Answer whether the receiver and the argument do not represent the > > same object." > > > > ^(self = anObject) not. > > > > Is there any particular reason for this that I'm missing? > > > > Performance. > > > > > > Levente > > > > Thanks in advance! > > -- > > > > "*Most good programmers do programming not because they expect to get > paid > > or get adulation by the public, but because it is fun to program.*" > > > > Linus Torvalds > > > > > > > > > > > > -- > > Mariano > > http://marianopeck.wordpress.com > > > > > -- Mariano http://marianopeck.wordpress.com
