[Vm-dev] Re: [Pharo-project] Bug in WAMemoryItem>>sizeOfObject
Eliot Miranda
eliot.miranda at gmail.com
Thu Mar 15 17:53:35 UTC 2012
Hi Niko,
the header size calculation is also wrong. If the byte size if the
object body is > 255 bytes there needs to be an additional header size
word. So something like
byteSizeOfBody := anObject class isBytes
ifTrue: [....]
ifFalse: [.....].
headerSize := byteSizeOfBody > 255
ifTrue: [12]
ifFalse:
[anObject class indexIfCompact > 0
ifTrue: [4]
ifFalse: [8]].
On Wed, Mar 14, 2012 at 1:05 PM, <niko.schwarz at googlemail.com> wrote:
> Hi guys,
>
> I haven't checked if this bug exists already, so please ignore this if
> it's been reported before.
>
> Bug in WAMemoryItem:
>
> sizeOfObject: anObject
> | headerSize instanceSize variableSize |
> headerSize := anObject class indexIfCompact > 0
> ifTrue: [ 4 ]
> ifFalse: [ 8 ].
> instanceSize := anObject class instSize.
> variableSize := anObject class isBytes
> ifTrue: [ anObject basicSize ]
> ifFalse: [
> anObject class isWords
> ifTrue: [ Smalltalk wordSize * anObject
> basicSize ]
> ifFalse: [ Smalltalk wordSize * anObject
> basicSize // 2 ] ].
> ^ headerSize + instanceSize + variableSize
>
>
> In this snippet, the units that are added together in the last line are of
> different units.
>
> instanceSize is in unit "number of machine words", whereas variableSize
> and headerSize are in unit "bytes".
>
>
> The method is fixed here:
>
> sizeOfObject: anObject
> | headerSize instanceSize variableSize |
> headerSize := anObject class indexIfCompact > 0
> ifTrue: [ 4 ]
> ifFalse: [ 8 ].
> instanceSize := anObject class instSize * Smalltalk wordSize.
> variableSize := anObject class isBytes
> ifTrue: [ anObject basicSize ]
> ifFalse: [
> anObject class isWords
> ifTrue: [ Smalltalk wordSize * anObject
> basicSize ]
> ifFalse: [ Smalltalk wordSize * anObject
> basicSize // 2 ] ].
> ^ headerSize + instanceSize + variableSize
>
>
>
> Example:
>
> |m|
> dict := Dictionary new.
> m := WAMemory new. dict traverseWithMemory: m seen: IdentitySet new.
> m totalSize
>
> This will incorrectly spit out 10, but should return 16, on a 32 bit VM.
>
> Niko
>
> --
> http://scg.unibe.ch/staff/Schwarz
> twitter.com/nes1983
> Tel: +41786126354
>
>
>
--
best,
Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20120315/97bf9ea3/attachment-0001.htm
More information about the Vm-dev
mailing list