[squeak-dev] OrderedCollection>>size fails in debugger

Levente Uzonyi leves at elte.hu
Sun Jul 10 17:53:44 UTC 2011


On Mon, 11 Jul 2011, Ben Coman wrote:

> I am writing some code that uses OrderedCollection and was tracing through it 
> with the debugger when the debugger itself threw a DNU exception.  I narrowed 
> down reproduction of this to executing the following line, clicking <Debug> 
> then eight times <Into> :
>>     self halt. OrderedCollection new: 5.
>
> As far as I can determine, the root cause is that 
> "OrderedCollectionInspector>>fieldList" calls "object size" which has the 
> following implementation:
>>     OrderedCollection>>size
>>        ^ lastIndex - firstIndex + 1
>
> where "lastIndex" is nil (and also "firstIndex" is nil).
> To narrow it down further, the error can also be reproduced by executing the 
> following:
>> OrderedCollectionInspector openOn: OrderedCollection basicNew.
>
> I fixed this with:
>>     OrderedCollection>>size
>>        lastIndex ifNil: [ ^0 ].
>>        ^ lastIndex - firstIndex + 1
>
> It would be more correct to also have included "firstIndex ifNil: [ ^0 ]" but 
> I assume both conditions occur at the same time, so I left it out for 
> performance. 
> Not knowing how performance issue are balanced in Squeak, I was concerned 
> that the "size" method might be called very often, and that even this one 
> extra line might want to be avoided - I assume that  this case only occurs in 
> debugging at times when the object has not been fully initialized, and this 
> error would not occur from application code.  So I went looking for an

Right.

> alternative.  Back in the caller, rather than:
>>     OrderedCollection>>fieldList
>>         object ifNil: [ ^ OrderedCollection new].
>>         ^ self baseFieldList ,
>>             (object size <= (self i1 + self i2)
> <snip>
>
> this corrected the problem:
>>     OrderedCollection>>fieldList
>>         object ifNil: [ ^ OrderedCollection new].
>>        [ object size ] on: Exception do: [ ^ self baseFieldList ].
>>         ^ self baseFieldList ,
>>             (object size <= (self i1 + self i2)
> <snip>
> I assume this would also be required for 
> OrderedCollection>>selectedObjectIndex.

Yes, OrderedCollectionInspector should be changed, because that's what 
causes the problem. I'd simply create an #objectSize method for it and use 
that instead of object size.

> However now in the debugger inst-var sub-pane, selecting self shows "<error 
> in printString: evaluate "self printString" to debug>, and in so doing 
> reveals that the "self size" call fails in:
>>     OrderedCollection>>do: elementBlock separatedBy: separatorBlock
>>         1 to: self size do:

IMHO this is not a problem. #printString doesn't have to work for 
uninitialized objects.


Levente

> indicating a similar fix is potentially required for the following methods:
>   OrderedCollection>>add: newObject afterIndex: index
>   OrderedCollection>>add: newObject beforeIndex: index
>   OrderedCollection>>at: index ifAbsentPut: block
>   OrderedCollection>>collect: aBlock
>   OrderedCollection>>copyReplaceFrom: start to: stop with: 
> replacementCollection
>   OrderedCollection>>makeRoomAtFirst
>   OrderedCollection>>makeRoomAtLast
>   OrderedCollection>>postCopyFrom: startIndex to: endIndex
>   OrderedCollection>>with: otherCollection collect: twoArgBlock
>   OrderedCollection>>withIndexCollect: elementAndIndexBlock
> which is not as clean as modifying OrderedCollection>>size, and still a bit 
> uncertain.
>
> What is the community's thoughts on this?
>
> Finally, if any of these are desirable fixes, I would appreciate using my 
> first contribution as a practice for submitting to the Inbox (if someone 
> could direct me to some documentation that describes how to do this.)
>
> cheers, Ben
>
>
>
>
>
>
>



More information about the Squeak-dev mailing list