Alex 

the vm should check condition from time to time and the place where it can 
check is at every message send. 
Since == is not a message send, when you write code with == or not even if it 
is semantically equivalent 
its execution may be different (it looks hackish).

Stef

On Oct 12, 2011, at 6:29 PM, Alexandre Bergel wrote:

> Excellent description. 
> Just wondering: when the scheduling really happens? I thought that it is when 
> you do a #yield or wait explicitely since scheduling is not preemptive. 
> 
> Cheers,
> Alexandre
> 
> 
> On 12 Oct 2011, at 12:49, 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
>> 
> 
> -- 
> _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:
> Alexandre Bergel  http://www.bergel.eu
> ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.
> 
> 
> 
> 
> 
> 


Reply via email to