cyclic looping with [0 == object] whileFalse: [object :=objectnextObject].

Rob Withers reefedjib at yahoo.com
Tue Nov 6 00:15:07 UTC 2007


----- Original Message ----- 
From: "John M McIntosh" <johnmci at smalltalkconsulting.com>
To: "The general-purpose Squeak developers list" 
<squeak-dev at lists.squeakfoundation.org>
Sent: Monday, November 05, 2007 11:18 AM
Subject: Re: cyclic looping with [0 == object] whileFalse: [object 
:=objectnextObject].


>
> On Nov 5, 2007, at 10:44 AM, Rob Withers wrote:
>
>> I thought of a possibility.  It could be that I am creating objects 
>> (BlockContexts and MethodContexts) as fast as I process them in  this 
>> loop. If the loop is creating objects, then they are bound to  be at the 
>> end of memory and I am bound to not be able to catch up  to them.  In 
>> this case, my #ifTrue: msg is a real msg creating a  real BlockContext 
>> each time through the loop, because of my  Compiler changes, and the 
>> associated MethodContexts are being  created too.  (My addition of 
>> anOrderedCollection>>#add:/#addLast:/ #grow... are being recorded as 
>> well). Each time through a new  instance of the BlockContext is being 
>> created.
>>
>> That sucks.  I can't do anything about it.
>
> As an optimization methodContexts are recycled and reused, this  feature 
> decreases the time take
> to make a new context. When a method returns the local context is  then 
> stuffed onto the free context chain.
> However on a GC the free context chain is GCed also. So usually you  are 
> not making a new object (MethodContexts ) for the message  activation.

In my test code, I am stuffing each object into an OrderedCollection, so 
they won't be recycled for sure.  I'll try printing them to the transcript 
to detect a 'cycle', but not hang on to them.

The question remains with the original code, which is not saving each 
object, why it is stuck processing more and more objects.  As I said, I 
changed the compiler to stop inlining #ifTrue: and this was the result of 
that (after recompileAll).   I would like to find out why, and see if it is 
something I have done wrong with #ifTrue: msg sending.

Is it as Mathieu Suen says?  Are they getting trapped in  the stack?

thanks,
Rob 




More information about the Squeak-dev mailing list