[Vm-dev] [COG] primitiveClosureValue assert is failing with StackVM (possible BUG in bytecodes!!)

stephane ducasse stephane.ducasse at gmail.com
Wed Dec 22 21:56:36 UTC 2010


Mariano 

I really want to thank you for your stubborness (probably not positive in english), I wish I could spend the time you spend on gdb and other and learn as much as you do. Keep pushing.

Stef


On Dec 22, 2010, at 10:34 PM, Eliot Miranda wrote:

> Hi Mariano,
> 
>     indeed it's a bug.  Your fix (objectMemory is: rcvr instanceOf: (self splObj: ClassBlockClosure) compactClassIndex: ClassBlockClosureCompactIndex) is the correct one.  There are a few other places where this needs to be done also.  I'll roll out new code soon.
> 
> best
> Eliot
> 
> On Wed, Dec 22, 2010 at 12:03 PM, Mariano Martinez Peck <marianopeck at gmail.com> wrote:
>  
> Hi Eliot. If I compile a StackVM, and I just press the left arrow in a code pane of a OB windows, in a pharo image, I get an asser that fails:
> (oop & 1) 19202
> 
> Sorry I bother with these asserts, but I am trying to solve the crashes I have and I think starting for the asserts is a good idea.
> 
> The assert that fails is in primitiveClosureValue()  the part:
> 
> blockClosure = longAt(GIV(stackPointer) + (GIV(argumentCount) * BytesPerWord));
>     /* begin quickFetchInteger:ofObject: */
>     oop = longAt((blockClosure + BaseHeaderSize) + (ClosureNumArgsIndex << ShiftForWord));
>     assert((oop & 1));
>     numArgs = (oop >> 1);
>     if (!(GIV(argumentCount) == numArgs)) {
>         /* begin primitiveFail */
>         if (GIV(primFailCode) == 0) {
>             GIV(primFailCode) = 1;
>         }
>         return;
>     } 
> 
> 
> numArgs results to be a large number (using #printNum:   was 718613205), and if I try to do a #printOop:  I got a " 0x55aa55aa0x55aa55aa is not on the heap" 
> 
> Now, of course, the "if (!(GIV(argumentCount) == numArgs)) " fails.
> 
> What it is funny is that I did a #printOop: of blockClosure instVar, and this is what I get:  0x1f59b578: a(n) Association
> 
> Association? WTF ?   so...I guess something weird is happening. I continue debugging it..and I noticed that:
> 
> - Several classes were called in addition to Association,like Character. These seems to be compact classes and implement #value and #value:   ;)
> - Both, #bytecodePrimValue and #bytecodePrimValueWithArg  were not calling #primitiveClosureValue. So, "isBlock" was false...
> 
> I tried modifying #bytecodePrimValueWithArg and #bytecodePrimValue  this line:
> 
> isBlock := objectMemory is: rcvr instanceOf: ClassBlockClosure compactClassIndex: ClassBlockClosureCompactIndex.
> 
> to this one:
> 
> isBlock := objectMemory is: rcvr instanceOf: (self splObj: ClassBlockClosure) compactClassIndex: ClassBlockClosureCompactIndex.
> 
> WIth this change, at least, the assert doesn't fail anymore. I made progress (maybe). But still, for normal closures, "isBlock" seems to be false. So.....all block values are being managed as a normal send ????
> 
> Now, I don't understand why ClassBlockClosureCompactIndex  is 0. I think this may be the problem. Why it is not 12? (in Pharo  Smalltalk compactClassesArray at: 12 ->>> BlockClosure.)
> I notice that ObjectMemory >> initializeCompactClassIndices  does:
> 
>     ClassBlockClosureCompactIndex := 0 "12". "Prospective.  Currently TranslatedMethod class"
> 
> 
> Notice that this ZERO changes the sematic of #is: oop instanceOf: classOop compactClassIndex: compactClassIndex
> called from the #bytecodePrimValue and bytecodePrimValueWithArg
> 
> Finally, I changed the mentioned line to this:
> 
> isBlock := objectMemory is: rcvr instanceOf: (self splObj: ClassBlockClosure) compactClassIndex: 12.
>    
> and finally, with block closures, it is calling the primitive, and for Association it doesn't fail the assert.  ahh and the image doesn't crash ;)
> 
> I don't know if this is a bug, if my solution was ok, nor it impact. Please let me know.
> 
> Cheers
> 
> Mariano
> 
> 
> 
> 
> 
> 



More information about the Vm-dev mailing list