[Vm-dev] VM Maker Inbox: VMMaker.oscog-mt.3180.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Apr 12 13:25:06 UTC 2022


Marcel Taeumel uploaded a new version of VMMaker to project VM Maker Inbox:
http://source.squeak.org/VMMakerInbox/VMMaker.oscog-mt.3180.mcz

==================== Summary ====================

Name: VMMaker.oscog-mt.3180
Author: mt
Time: 12 April 2022, 3:24:49.887509 pm
UUID: adbe155e-2f5f-e643-a586-8da8ae54915c
Ancestors: VMMaker.oscog-mt.3179

Quickfix to make at least int32_t and uint32_t ranges work when pushing with Large(Positive|Negative)Integer arguments in an int64_t or uint64_t interface.

Note that SmallInteger does not cover int32_t or uint32_t in 32-bit builds.

The bigger issue is that #ffiArgByValue:in: is not prepared for an #ffiIntegerValueOf: that answers more than sqInt, which is the current word size. This would also effect, for example, int128_t and uint128_t types in a 64-bit build. But we do not have such types yet.

Overall, there is no good support for LargeInteger at this point. :-(

=============== Diff against VMMaker.oscog-mt.3179 ===============

Item was changed:
  ----- Method: ThreadedIA32FFIPlugin>>ffiPushSigned64:in: (in category 'marshalling') -----
  ffiPushSigned64: value in: calloutState
+ 	"<var: #value type: #sqLong> -- No support for reading more than 32-bits of a LargeInteger. See #ffiIntegerValueOf:."
- 	<var: #value type: #usqLong>
  	<var: #calloutState type: #'CalloutState *'>
  	<inline: #always>
  	calloutState currentArg + 8 > calloutState limit ifTrue:
  		[^FFIErrorCallFrameTooBig].
  	interpreterProxy
+ 		"longAt: calloutState currentArg put: (self cCoerceSimple: value to: #usqInt);"
+ 		longAt: calloutState currentArg put: value;
+ 		"longAt: calloutState currentArg + 4 put: (self cCoerceSimple: value >> 32 to: #usqInt)."
+ 		longAt: calloutState currentArg + 4 put: (value < 0 ifTrue: [16rFFFFFFFF] ifFalse: [0]).
- 		longAt: calloutState currentArg put: (self cCoerceSimple: value to: #usqInt);
- 		longAt: calloutState currentArg + 4 put: (self cCoerceSimple: value >> 32 to: #usqInt).
  	calloutState currentArg: calloutState currentArg + 8.
  	^0!

Item was changed:
  ----- Method: ThreadedIA32FFIPlugin>>ffiPushUnsigned64:in: (in category 'marshalling') -----
  ffiPushUnsigned64: value in: calloutState
+ 	"<var: #value type: #usqLong> -- No support for reading more than 32-bits of a LargeInteger. See #ffiIntegerValueOf:."
- 	<var: #value type: #usqLong>
  	<var: #calloutState type: #'CalloutState *'>
  	<inline: #always>
  	calloutState currentArg + 8 > calloutState limit ifTrue:
  		[^FFIErrorCallFrameTooBig].
  	interpreterProxy
+ 		"longAt: calloutState currentArg put: (self cCoerceSimple: value to: #usqInt);"
+ 		longAt: calloutState currentArg put: value;
+ 		"longAt: calloutState currentArg + 4 put: (self cCoerceSimple: value >> 32 to: #usqInt)."
+ 		longAt: calloutState currentArg + 4 put: 0.
- 		longAt: calloutState currentArg put: (self cCoerceSimple: value to: #usqInt);
- 		longAt: calloutState currentArg + 4 put: (self cCoerceSimple: value >> 32 to: #usqInt).
  	calloutState currentArg: calloutState currentArg + 8.
  	^0!



More information about the Vm-dev mailing list