[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