[Vm-dev] VM Maker: VMMaker.oscog-eem.242.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Jan 2 18:37:38 UTC 2013
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!
More information about the Vm-dev
mailing list