[squeak-dev] Re: Using #= for integer comparison instead of #==
Andreas Raab
andreas.raab at gmx.de
Wed Nov 17 02:34:44 UTC 2010
On 11/16/2010 4:21 PM, Levente Uzonyi wrote:
> On Tue, 16 Nov 2010, Eliot Miranda wrote:
>
>> Um, on Cog it sends a message if the method containing the #= has been
>> jitted. But the issue is /not/ whether there is a send or not. The issue
>
> Does it mean, that #= can't be used in "atomic" code anymore?
It never was. In the old (pre-closure) days you might have gotten away
with using #= only because of the context cache which would avoid
creating a new context if a previous one could be recycled. But code like:
obj := self someObject.
[0 = obj nextObject] whileFalse:[count := count + 1].
really should never have worked to begin with because:
* sending #= will create a context (unless recycled)
* the plus in the counter will create a context (unless count is in
SmallInt range)
* the addition may create a new object (unless count in SmallInt range)
* either one of the blocks should create contexts (unless optimized)
There's a long list of reasons why code such as the above is simply
broken. You *must* use an end marker, i.e.,
last := Object new. "end marker"
obj := self someObject.
[last == obj] whileFalse:[
count := count + 1.
obj := obj nextObject.
].
This will work because it counts between the beginning of memory and the
(arbitrary) end marker. Anything else basically should not be relied on
to work, jit or no.
Cheers,
- Andreas
More information about the Squeak-dev
mailing list
|