[Vm-dev] VM Maker: VMMaker.oscog-EstebanLorenzano.1717.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Mar 9 07:33:36 UTC 2016
Esteban Lorenzano uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-EstebanLorenzano.1717.mcz
==================== Summary ====================
Name: VMMaker.oscog-EstebanLorenzano.1717
Author: EstebanLorenzano
Time: 9 March 2016, 8:31:33.743422 am
UUID: 271f0af9-e85c-4afc-bf17-c4aa735ddaaa
Ancestors: VMMaker.oscog-eem.1716
using *machine methods instead singned64... and positive64...
=============== Diff against VMMaker.oscog-eem.1716 ===============
Item was changed:
----- Method: ThreadedFFIPlugin>>primitiveFFIIntegerAt (in category 'primitives') -----
primitiveFFIIntegerAt
"Answer a (signed or unsigned) n byte integer from the given byte offset
in the receiver, using the platform's endianness."
| isSigned byteSize byteOffset rcvr addr value mask valueOop |
<var: 'value' type: #usqLong>
<var: 'mask' type: #usqLong>
<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 between: 1 and: 8)
and: [(byteSize bitAnd: byteSize - 1) = 0 "a.k.a. isPowerOfTwo"]]) ifFalse:
[^interpreterProxy primitiveFail].
addr := self ffiAddressOf: rcvr startingAt: byteOffset size: byteSize.
interpreterProxy failed ifTrue:[^0].
byteSize <= 2
ifTrue:
[byteSize = 1
ifTrue: [value := self cCoerceSimple: (interpreterProxy byteAt: addr) to: #'unsigned char']
ifFalse: [value := self cCoerceSimple: (interpreterProxy shortAt: addr) to: #'unsigned short']]
ifFalse:
[byteSize = 4
+ ifTrue: [value := self cCoerceSimple: (interpreterProxy long32At: addr) to: #'unsigned int']
- ifTrue: [value := interpreterProxy long32At: addr]
ifFalse: [value := interpreterProxy long64At: addr]].
byteSize < BytesPerWord
ifTrue:
[isSigned ifTrue: "sign extend value"
[mask := 1 << (byteSize * 8 - 1).
value := (value bitAnd: mask-1) - (value bitAnd: mask)].
"note: byte/short (&long if BytesPerWord=8) never exceed SmallInteger range"
valueOop := interpreterProxy integerObjectOf: value]
ifFalse: "general 64 bit integer; note these never fail"
[valueOop := isSigned
+ ifTrue:[interpreterProxy signedMachineIntegerFor: value]
+ ifFalse:[interpreterProxy positiveMachineIntegerFor: value]].
- ifTrue:[interpreterProxy signed64BitIntegerFor: value]
- ifFalse:[interpreterProxy positive64BitIntegerFor: value]].
^interpreterProxy pop: 4 thenPush: valueOop!
More information about the Vm-dev
mailing list