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 Pharo-project@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
_______________________________________________ Pharo-project mailing list Pharo-project@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project