On Mon, Dec 21, 2009 at 12:56:01AM +0100, Bert Freudenberg wrote:
On 21.12.2009, at 00:44, David T. Lewis wrote:
On Sun, Dec 20, 2009 at 02:45:59PM -0800, John M McIntosh wrote:
Ok, I have to ask, is this correct? Er 4 or 8 or does it matter, do we have other '4' values embedded in the interpreter? byteSizeOf: oop | slots | self flag: #Dan. (self isIntegerObject: oop) ifTrue:[^0]. slots := self slotSizeOf: oop. (self isBytesNonInt: oop) ifTrue:[^slots] ifFalse:[^slots * 4]
No, this is not correct, good catch. It should be:
byteSizeOf: oop | slots | self flag: #Dan. (self isIntegerObject: oop) ifTrue:[^0]. slots := self slotSizeOf: oop. (self isBytesNonInt: oop) ifTrue:[^slots] ifFalse:[^slots * ObjectMemory bytesPerWord]
I've clean a lot of this crud out of the interpreter, but there are bound to be a few more that we have not spotted yet.
Dave
Does "ObjectMemory bytesPerWord" compile to a constant?
Bert,
Obviously you are not using SlangBrowser ;-)
Yes, it answers a constant. The implementation is just this:
/* Answer the size of an object memory word in bytes. */ sqInt bytesPerWord(void) { return BytesPerWord; }
The method is inlined, so it basically translates into the CPP macro BytesPerWord. Thus #bytesSizeOf: is translated as follows (this is with MemoryAccess enabled so you can see the the full C code, not just the macros):
sqInt byteSizeOf(sqInt oop) { sqInt slots; sqInt header; sqInt sz;
flag("Dan"); if ((oop & 1)) { return 0; } /* begin slotSizeOf: */ if ((oop & 1)) { slots = 0; goto l1; } /* begin lengthOf: */ header = ((sqInt) ((((sqInt *) ((sqMemoryBase) + oop)))[0])); /* begin lengthOf:baseHeader:format: */ if ((header & TypeMask) == HeaderTypeSizeAndClass) { sz = (((sqInt) ((((sqInt *) ((sqMemoryBase) + (oop - (BytesPerWord * 2)))))[0]))) & LongSizeMask; } else { sz = header & SizeMask; } sz -= header & Size4Bit; if (((((usqInt) header) >> 8) & 15) <= 4) { slots = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord; goto l2; } if (((((usqInt) header) >> 8) & 15) < 8) { slots = ((usqInt) (sz - BaseHeaderSize)) >> 2; goto l2; } else { slots = (sz - BaseHeaderSize) - (((((usqInt) header) >> 8) & 15) & 3); goto l2; } slots = null; l2: /* end lengthOf: */; l1: /* end slotSizeOf: */; if (((((usqInt) (((sqInt) ((((sqInt *) ((sqMemoryBase) + oop)))[0])))) >> 8) & 15) >= 8) { return slots; } else { return slots * ( 4); } }
Dave