[Vm-dev] VM Maker: VMMaker.oscog-EstebanLorenzano.1714.mcz
commits at source.squeak.org
commits at source.squeak.org
Tue Mar 8 17:18:16 UTC 2016
Esteban Lorenzano uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-EstebanLorenzano.1714.mcz
==================== Summary ====================
Name: VMMaker.oscog-EstebanLorenzano.1714
Author: EstebanLorenzano
Time: 8 March 2016, 6:16:11.06581 pm
UUID: e83d2c5f-76cd-47fc-ac29-6c4a25fa5deb
Ancestors: VMMaker.oscog-nice.1713
Remove wrong coertion. If coertion is present, this assertion fails:
ref := ByteArray new: 4.
ref integerAt: 1 put: -10 size: 4 signed: true.
self assert: (ref integerAt: 1 size: 4 signed: true) = -10
=============== Diff against VMMaker.oscog-nice.1713 ===============
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 := interpreterProxy long32At: addr]
- ifTrue: [value := self cCoerceSimple: (interpreterProxy long32At: addr) to: #'unsigned int']
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 signed64BitIntegerFor: value]
ifFalse:[interpreterProxy positive64BitIntegerFor: value]].
^interpreterProxy pop: 4 thenPush: valueOop!
More information about the Vm-dev
mailing list