allInstancesDo: aBlock
        "Evaluate the argument, aBlock, for each of the current instances of  
the
        receiver.
        
        Because aBlock might change the class of inst (for example, using  
become:),
        it is essential to compute next before aBlock value: inst."

        self ==  UndefinedObject ifTrue: [^ aBlock value: nil].
        self allInstances do: [:each |   aBlock value: each. ]

Works

On Aug 5, 2009, at 8:58 PM, Stéphane Ducasse wrote:

> the problem now is that
>
> allInstancesDo: aBlock
>       "Evaluate the argument, aBlock, for each of the current instances of
> the
>       receiver.
>       
>       Because aBlock might change the class of inst (for example, using
> become:),
>       it is essential to compute next before aBlock value: inst."
>       | inst next |
>       self ==  UndefinedObject ifTrue: [^ aBlock value: nil].
>       inst := self someInstance.
>       [inst == nil]
>               whileFalse:
>               [
>               next := inst nextInstance.
>               aBlock value: inst.
>               inst := next]
>
> is looping too.
>
> Stef
>
> On Aug 5, 2009, at 7:01 PM, Marcus Denker wrote:
>
>>
>> On 05.08.2009, at 12:42, Marcus Denker wrote:
>>>>>
>>>> Hmm, if that so, then we would expect to see an interpreter speed
>>>> degradation. But its not. :)
>>>
>>> Yes, see the other mail. The reason is that the allocation of
>>> contexts
>>> in case of blocks happens now at #value, whereas it used to be just
>>> done
>>> at the definiton point (#blockCopy).
>>>
>>> So nothing to worry about.
>>
>>
>> Eliot says:
>>
>> | So you can either
>> | - wait for the stack VM or
>> | - inline allInstancesDo: into allInstances or
>> | - implement allInstacesDo: specially in ContextPart or
>> | - implement a pair of primitives to answer allInstances and
>> allObject atomically.
>> |
>> | This latter approach allows much more flexibility in implementing
>> the garbage collector subsequently; for
>> | example segmenting the heap and adding and freeing segments as
>> required, which complicates the simple object
>> | ordering provided by the single heap but has much better memory
>> usage.
>>
>>
>> I vote for inling for now... this fixes the problem.
>>
>> allInstances
>>      "Answer a collection of all current instances of the receiver."
>>
>>      | all inst next |
>>      all := OrderedCollection new.
>>      inst := self someInstance.
>>      [inst == nil]
>>              whileFalse: [
>>              next := inst nextInstance.
>>              inst == all ifFalse: [all add: inst].
>>              inst := next].
>>      ^ all asArray
>>
>>
>>      Marcus
>>
>>
>> --
>> Marcus Denker - http://marcusdenker.de
>> PLEIAD Lab - Computer Science Department (DCC) - University of Chile
>>
>>
>> _______________________________________________
>> 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

Reply via email to