Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.242.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.242 Author: eem Time: 2 January 2013, 10:34:42.111 am UUID: 239a00e7-4aed-4e7b-b564-0088b6af5dd0 Ancestors: VMMaker.oscog-eem.241
Cog issue 115. Fix FFIPlugin/ThreadedFFIPlugin unsignedShortAt:
=============== Diff against VMMaker.oscog-eem.241 ===============
Item was changed: ----- Method: FFIPlugin>>primitiveFFIIntegerAt (in category 'primitives') ----- primitiveFFIIntegerAt "Return a (signed or unsigned) n byte integer from the given byte offset." | isSigned byteSize byteOffset rcvr addr value mask | <export: true> <inline: false> isSigned := interpreterProxy booleanValueOf: (interpreterProxy stackValue: 0). byteSize := interpreterProxy stackIntegerValue: 1. byteOffset := interpreterProxy stackIntegerValue: 2. rcvr := interpreterProxy stackObjectValue: 3. interpreterProxy failed ifTrue:[^0]. (byteOffset > 0 and:[byteSize = 1 or:[byteSize = 2 or:[byteSize = 4]]]) ifFalse:[^interpreterProxy primitiveFail]. addr := self ffiAddressOf: rcvr startingAt: byteOffset size: byteSize. interpreterProxy failed ifTrue:[^0]. byteSize < 4 ifTrue:[ "short/byte" byteSize = 1 ifTrue:[value := interpreterProxy byteAt: addr] + ifFalse:[ value := self cCode: '*((unsigned short int *) addr)' - ifFalse:[ value := self cCode: '*((short int *) addr)' inSmalltalk: [interpreterProxy shortAt: 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. ] ifFalse:[ "general 32 bit integer" value := interpreterProxy longAt: addr. isSigned ifTrue:[value := interpreterProxy signed32BitIntegerFor: value] ifFalse:[value := interpreterProxy positive32BitIntegerFor: value]. ]. interpreterProxy pop: 4. ^interpreterProxy push: value !
Item was changed: ----- Method: ThreadedFFIPlugin>>primitiveFFIIntegerAt (in category 'primitives') ----- primitiveFFIIntegerAt "Return a (signed or unsigned) n byte integer from the given byte offset." | isSigned byteSize byteOffset rcvr addr value mask | <export: true> <inline: false> isSigned := interpreterProxy booleanValueOf: (interpreterProxy stackValue: 0). byteSize := interpreterProxy stackIntegerValue: 1. byteOffset := interpreterProxy stackIntegerValue: 2. rcvr := interpreterProxy stackObjectValue: 3. interpreterProxy failed ifTrue:[^0]. (byteOffset > 0 and:[byteSize = 1 or:[byteSize = 2 or:[byteSize = 4]]]) ifFalse:[^interpreterProxy primitiveFail]. addr := self ffiAddressOf: rcvr startingAt: byteOffset size: byteSize. interpreterProxy failed ifTrue:[^0]. byteSize < 4 ifTrue:[ "short/byte" byteSize = 1 ifTrue:[value := interpreterProxy byteAt: addr] + ifFalse:[ value := self cCode: '*((unsigned short int *) addr)' - ifFalse:[ value := self cCode: '*((short int *) addr)' inSmalltalk: [interpreterProxy shortAt: 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. ] ifFalse:[ "general 32 bit integer" value := interpreterProxy longAt: addr. value := isSigned ifTrue:[interpreterProxy signed32BitIntegerFor: value] ifFalse:[interpreterProxy positive32BitIntegerFor: value]. ]. interpreterProxy pop: 4 thenPush: value!
vm-dev@lists.squeakfoundation.org