[squeak-dev] Error in ImageSegment primitive?

Eliot Miranda eliot.miranda at gmail.com
Sun May 7 16:24:02 UTC 2017


Hi Levente,


> On May 7, 2017, at 6:13 AM, Levente Uzonyi <leves at caesar.elte.hu> wrote:
> 
> IIRC Spur VMs do not support image segments. There should be code written in Smalltalk to do what the V3 VMs used to do (loading and saving).
> Wrong list btw. CC'd vm-dev.

That's not true.  I spent several me time getting them to pass certain tests.  The issue was the surrounding image level code that was assuming nextObject could be used to enumerate the results.  I didn't have the time or energy to fix this.  But the segment primitives should work. 

> 
> Levente
> 
>> On Sun, 7 May 2017, Max Leske wrote:
>> 
>> Hi,
>> 
>> I'm trying to store an image segment with the latest pharo.cog.spur VM (32 bits) but keep failing. The segment should produce a file of around 60 MB. With an old V3 VM this is no problem at all. There, the WordArrayForSegment instance has a size of 4094179 but with the new VM I always run out of space because the primitive returns nil and, therefore, the word array size is constantly being increased.
>> 
>> I've built a debug VM and am stepping through the code but I don't have a clear understanding of everything that's happening. The failure happens on line 46626 of gcc3x-cointerp.c:
>> 
>> newOop = (copy - segStart) / 8;
>> if (newOop > (identityHashHalfWordMask())) {
>>    return PrimErrLimitExceeded;  // <--------------- failure
>> }
>> 
>> What I don't understand, for example, is why "newOop" is checked against "identityHashHalfWordMask()" and not against the segment end ("endSeg"). Here's a list of the current values of the variables upon failure:
>> 
>> objOop    sqInt    180812096
>> segAddr    sqInt    494731288
>> segStart    sqInt    461176856
>> endSeg    sqInt    815841432
>> bodySize    usqInt    64
>> contextSize    sqInt    335672448
>> copy    sqInt    494731288
>> hash    sqInt    0
>> hash1    sqInt    4194302
>> i    sqInt    833574680
>> iLimiT    sqInt    833574688
>> methodHeader    sqInt    1193471
>> newOop    sqInt    4194304
>> numMediatedSlots    sqInt    833574688
>> numSlots    usqInt    14
>> oop    sqInt    142640272
>> 
>> As you can see, "endSeg" would be more than large enough to hold the object. Is it possible that there's an error here?
>> 
>> Cheers,
>> Max
> 


More information about the Squeak-dev mailing list