> On 24.10.2014, at 20:49, Eliot Miranda <[email protected]> wrote:
> 
> Hi Max,
> 
> On Fri, Oct 24, 2014 at 7:29 AM, Max Leske <[email protected] 
> <mailto:[email protected]>> wrote:
> 
> Hi
> 
> I have a rather strange problem with rehasing that occurred simultaneously 
> multiple times on the same day but not since. Luckily I’ve saved an image 
> with the debugger in it. The mean thing is: that doesn’t help me at all 
> because from what I can tell either the Debugger is broken or there’s a VM 
> problem.
> 
> I'm interested in taking a look at that image...  (and I'm relieved you saw 
> it on both the Cog and the Interpreter VMs ;-) )

Cool! I’ll send you a private message with a link to the image.

> 
> Note:
> The image is a Pharo 1.3 image. The problem occurred on two different VMs 
> independently, an NBCog VM (Croquet Closure Cog VM [CoInterpreter 
> VMMaker-oscog-EstebanLorenzano.166] 21.0) and a Squeak VM (Squeak3.10.2 of '5 
> June 2008' [latest update: #7179]).
> The operation during which this happened was the loading of an ImageSegment 
> (in both instances).
> 
> 
> Here’s what happened. I got a SubscriptOutOfBounds error during rehashing of 
> a Dictionary. When I look at the debugger it’s clear why the exception got 
> signaled but not how that situation could ever happen.
> 
> These are the top three contexts on the stack:
> 
> Array(Object)>>errorSubscriptBounds:
> Array(Object)>>at:put:
> CBConfiguration(Dictionary)>>noCheckAdd:
> 
> This is the #noCheckAdd: method”
> 
> noCheckAdd: anObject
>         "Must be defined separately for Dictionary because (self 
> findElementOrNil:) expects a key, not an association.  9/7/96 tk"
> 
>         array at: (self findElementOrNil: anObject key) put: anObject.
>         tally := tally + 1
> 
> and here’s #at:put: where the exception is signaled:
> 
> at: index put: value
>         <primitive: 61>
>         index isInteger ifTrue:
>                 [self class isVariable
>                         ifTrue: [(index >= 1 and: [index <= self size])
>                                         ifTrue: [self errorImproperStore]
>                                         ifFalse: [self errorSubscriptBounds: 
> index]] <——— signaled
>                         ifFalse: [self errorNotIndexable]].
>         index isNumber
>                 ifTrue: [^self at: index asInteger put: value]
>                 ifFalse: [self errorNonIntegerIndex]
> 
> Here’s the weird thing: according to the debugger ‘array' in #noCheckAdd: IS 
> NOT THE SAME INSTANCE as ‘self’ in #at:put:!!!!!! ????????? When I look at 
> the pointers to both arrays, the correct one is pointed to by the dictionary 
> while the other is only being referenced by the exception context:
> 
> Bad array:
> 1: SubscriptOutOfBounds: 88
> 2: Array(Object)>>errorSubscriptBounds:
> 3: Array(Object>>at:put:
> 4: an Inspector
> …
> 
> Good array:
> 1: aCBConfiguration(size 107)
> 
> 
> I really have no clue how this could have happened. I’d appreciate any 
> thoughts you might have…
> 
> Cheers,
> Max
> 
> 
> 
> -- 
> best,
> Eliot

Reply via email to