Thanks nicolas. I cannot remember this by hearth. For me this is really strange to have that rely on the way the execution engine make subtle differences between similar entity at the language level. I'm probably too idiot to understand why language semantics is mixed with optimization of the underlying execution engine. On Dec 31, 2010, at 3:15 PM, Nicolas Cellier wrote:
2010/12/31 <pharo@googlecode.com>:
Updates: Cc: marcus.denker
Comment #4 on issue 3498 by marianopeck: remove:ifAbsent: in linked list leads to interruption/sync problems http://code.google.com/p/pharo/issues/detail?id=3498
Stef, I am not Adrian, but yes, I think that can be the reasons. Just take the example of Andreas. When you do foo == nil, when that's compiled, it put a special bytcode for the == primitive (no method is send). It seems the scheduler can change processes during method sends. In most clases, this may not be a problem. But if you cahnge foo == nil, by foo isNil, it may be a point where it can be preempted. And maybe there are places where this cannot happen, probably the place where the the processes are managed or the code needed for that, like Andras said, process, delay, semaphore, etc.
What I don't understand is that I thought that the compiler replaces foo isNil by foo == nil. And if this is the case, then what has been explained doesn't make sense :(
No, only #ifNil: is a selector handled specially by Compiler.
Nicolas