OS: Mac OS X 10.3.3 VM: unix - Squeak3.6beta of '4 July 2003' [latest update: #5411] Image: Squeak3.6 [latest update: #5424]
(ByteArray with: 255 with: 255) unsignedShortAt: 1 return -1, it seem to me that the correct result is 65535
Alain
On Friday 02 April 2004 2:07 pm, Alain Fischer wrote:
OS: Mac OS X 10.3.3 VM: unix - Squeak3.6beta of '4 July 2003' [latest update: #5411] Image: Squeak3.6 [latest update: #5424]
(ByteArray with: 255 with: 255) unsignedShortAt: 1 return -1, it seem to me that the correct result is 65535
Well, that would be consistent with:
(ByteArray with: 255 with: 255) unsignedShortAt: 1 bigEndian: true
I believe the problem is in the FFIPlugin definition of primitiveFFIIntegerAt where it says:
byteSize < 4 ifTrue:[ "short/byte" byteSize = 1 ifTrue:[value _ interpreterProxy byteAt: addr] ifFalse:[ value _ self cCode: '*((short int *) addr)' inSmalltalk: [interpreterProxy halfWordAt: addr]]. isSigned ifTrue:["sign extend value" mask _ 1 << (byteSize * 8 - 1). value _ (value bitAnd: mask-1) - (value bitAnd: mask)]. "note: byte/short never exceed SmallInteger range" value _ interpreterProxy integerObjectOf: value.
And of course value is an int, so the sign extension always happens.
I think it should read something like this instead:
byteSize < 4 ifTrue:[ "short/byte" byteSize = 1 ifTrue:[value _ interpreterProxy byteAt: addr] ifFalse:[ isSigned ifTrue: [ "sign extend value" value := self cCode: '*((short int *) addr)' inSmalltalk: [ value := interpreterProxy halfWordAt: addr. mask := 1 << (byteSize * 8 - 1). value := (value bitAnd: mask-1) - (value bitAnd: mask) ]] ifFalse: [ "unsigned value" value := self cCode: '(int)*((unsigned short int *) addr)' inSmalltalk: [ value := interpreterProxy halfWordAt: addr ]] ]. "note: byte/short never exceed SmallInteger range" value _ interpreterProxy integerObjectOf: value. ]
After all, there's no reason to do explicit sign extension in C.
squeak-dev@lists.squeakfoundation.org