Ok, the problem was that I was doing: usedMemory := usedMemory + self internalByteSize: oop. that didn't work and always answered me the same number. Now, I had to do this: usedMemory := usedMemory + (self internalByteSize: oop). I don't understand why. Thanks Mariano On Thu, Apr 29, 2010 at 3:22 PM, Mariano Martinez Peck < marianopeck@gmail.com> wrote:
It's close but not entirely correct. The computation needs to include the extra header word for "large" instances (> 255 bytes). Squeak has three possible header sizes:
1 header word - used by compact classes 2 header words - used by regular classes 3 header words - used by "large" instances
BTW, SpaceTally>>spaceForInstancesOf:withInstanceCount: has the correct computation (except for 64 bit :-)
Ok, perfect. Thanks :)
Is there a way to know this
but from the VM side also ? how ? I really need it from the VM side :( but I have no idea how to do it.
It's easy to do in the VM, just use this:
primitiveByteSize "Answers the number of bytes the receiver occupies"
| nbytes| self export: true. oop := self popStack. nbytes := (self sizeBitsOf: oop) + (self extraHeaderBytes: oop). self pushInteger: nbytes.
I tried this and seems to work ok. I don't really need a primitive but an internal method that is called by a primitive. So, I did something like this:
internalByteSize: anOop
"Answers the number of bytes the receiver occupies" | nbytes| self inline: true. nbytes := (self sizeBitsOf: anOop) + (self extraHeaderBytes: anOop). ^ nbytes.
and then I call it like this for example:
oop := self firstAccessibleObject. [oop = nil] whileFalse: [ (self isIntegerObject: oop) ifFalse: [ size := self internalByteSize: oop. ......] oop := self accessibleObjectAfter: oop. ].
but internalByteSize ALWAYS return me the same value...do you know what can be wrong ?
Thanks in advance
Mariano