Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem. 2228.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.2228
Author: eem
Time: 30 May 2017, 10:36:59.18841 am
UUID: 80a3d07d-f055-4eaf-992c-3e532eb50fb8
Ancestors: VMMaker.oscog-eem.2227
Implement shadow parameter space in the Win64 FFI plugin by always incrememting currentArg, even if passed in a register. Consequently eliminate the abstract superclasses for the X64 ABI; they no longer share more than a method or two.
=============== Diff against VMMaker.oscog-eem.2227 ===============
Item was removed:
- ThreadedFFICalloutState subclass: #ThreadedFFICalloutStateForX64
- instanceVariableNames: 'integerRegisterIndex floatRegisterIndex integerRegisters floatRegisters'
- classVariableNames: ''
- poolDictionaries: ''
- category: 'VMMaker-Plugins-FFI'!
-
- !ThreadedFFICalloutStateForX64 commentStamp: 'eem 2/16/2016 19:13' prior: 0!
- A ThreadedFFICalloutStateForX64 is a holder for the callout state maintained while marshalling an FFI call on an X64 (x86-64) system.!
Item was removed:
- ----- Method: ThreadedFFICalloutStateForX64 class>>instVarNamesAndTypesForTransla tionDo: (in category 'translation') -----
- instVarNamesAndTypesForTranslationDo: aBinaryBlock
- "enumerate aBinaryBlock with the names and C type strings for the inst vars to include in a ThreadedFFICalloutState struct."
-
- ThreadedFFICalloutState instVarNamesAndTypesForTranslationDo: aBinaryBlock.
- ThreadedFFICalloutStateForX64 instVarNames do:
- [:ivn|
- aBinaryBlock
- value: ivn
- value: (ivn caseOf: {
- ['integerRegisters'] -> [{#sqInt. '[NumIntRegArgs]'}].
- ['floatRegisters'] -> [{#double. '[NumFloatRegArgs]'}] }
- otherwise:
- [#sqInt])]!
Item was removed:
- ----- Method: ThreadedFFICalloutStateForX64 class>>pluginClass (in category 'translation') -----
- pluginClass
- ^self subclassResponsibility!
Item was removed:
- ----- Method: ThreadedFFICalloutStateForX64>>floatRegisterIndex (in category 'accessing') -----
- floatRegisterIndex
-
- ^ floatRegisterIndex!
Item was removed:
- ----- Method: ThreadedFFICalloutStateForX64>>floatRegisters (in category 'accessing') -----
- floatRegisters
- "Answer the value of floatRegisters"
-
- ^ floatRegisters!
Item was removed:
- ----- Method: ThreadedFFICalloutStateForX64>>incrementFloatRegisterIndex (in category 'accessing') -----
- incrementFloatRegisterIndex
- ^floatRegisterIndex := floatRegisterIndex + 1!
Item was removed:
- ----- Method: ThreadedFFICalloutStateForX64>>incrementIntegerRegisterIndex (in category 'accessing') -----
- incrementIntegerRegisterIndex
- ^integerRegisterIndex := integerRegisterIndex + 1!
Item was removed:
- ----- Method: ThreadedFFICalloutStateForX64>>initialize (in category 'initialize-release') -----
- initialize
- super initialize.
- integerRegisterIndex := floatRegisterIndex := 0.
- integerRegisters := CArrayAccessor on: (Array new: self class pluginClass numRegArgs).
- floatRegisters := CArrayAccessor on: (Array new: self class pluginClass numFloatRegArgs)!
Item was removed:
- ----- Method: ThreadedFFICalloutStateForX64>>integerRegisterIndex (in category 'accessing') -----
- integerRegisterIndex
-
- ^ integerRegisterIndex!
Item was removed:
- ----- Method: ThreadedFFICalloutStateForX64>>integerRegisters (in category 'accessing') -----
- integerRegisters
- "Answer the value of integerRegisters"
-
- ^ integerRegisters!
Item was changed:
+ ThreadedFFICalloutState subclass: #ThreadedFFICalloutStateForX64S ysV
+ instanceVariableNames: 'integerRegisterIndex floatRegisterIndex integerRegisters floatRegisters'
- ThreadedFFICalloutStateForX64 subclass: #ThreadedFFICalloutStateForX64S ysV
- instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'VMMaker-Plugins-FFI'!
+
+ !ThreadedFFICalloutStateForX64S ysV commentStamp: 'eem 5/30/2017 10:22' prior: 0!
+ A ThreadedFFICalloutStateForX64SysV is a holder for the callout state maintained while marshalling an FFI call on an X64 (x86-64) system using the System V ABI.!
Item was added:
+ ----- Method: ThreadedFFICalloutStateForX64SysV class>> instVarNamesAndTypesForTransla tionDo: (in category 'translation') -----
+ instVarNamesAndTypesForTranslationDo: aBinaryBlock
+ "enumerate aBinaryBlock with the names and C type strings for the inst vars to include in a ThreadedFFICalloutState struct."
+
+ ThreadedFFICalloutState instVarNamesAndTypesForTranslationDo: aBinaryBlock.
+ self instVarNames do:
+ [:ivn|
+ aBinaryBlock
+ value: ivn
+ value: (ivn caseOf: {
+ ['integerRegisters'] -> [{#sqInt. '[NumIntRegArgs]'}].
+ ['floatRegisters'] -> [{#double. '[NumFloatRegArgs]'}] }
+ otherwise:
+ [#char])]!
Item was added:
+ ----- Method: ThreadedFFICalloutStateForX64SysV>>floatRegisterIndex (in category 'accessing') -----
+ floatRegisterIndex
+
+ ^ floatRegisterIndex!
Item was added:
+ ----- Method: ThreadedFFICalloutStateForX64SysV>>floatRegisters (in category 'accessing') -----
+ floatRegisters
+ "Answer the value of floatRegisters"
+
+ ^ floatRegisters!
Item was added:
+ ----- Method: ThreadedFFICalloutStateForX64SysV>> incrementFloatRegisterIndex (in category 'accessing') -----
+ incrementFloatRegisterIndex
+ ^floatRegisterIndex := floatRegisterIndex + 1!
Item was added:
+ ----- Method: ThreadedFFICalloutStateForX64SysV>> incrementIntegerRegisterIndex (in category 'accessing') -----
+ incrementIntegerRegisterIndex
+ ^integerRegisterIndex := integerRegisterIndex + 1!
Item was added:
+ ----- Method: ThreadedFFICalloutStateForX64SysV>>initialize (in category 'initialize-release') -----
+ initialize
+ super initialize.
+ integerRegisterIndex := floatRegisterIndex := 0.
+ integerRegisters := CArrayAccessor on: (Array new: ThreadedX64SysVFFIPlugin numRegArgs).
+ floatRegisters := CArrayAccessor on: (Array new: ThreadedX64SysVFFIPlugin numFloatRegArgs)!
Item was added:
+ ----- Method: ThreadedFFICalloutStateForX64SysV>>integerRegisterIndex (in category 'accessing') -----
+ integerRegisterIndex
+
+ ^ integerRegisterIndex!
Item was added:
+ ----- Method: ThreadedFFICalloutStateForX64SysV>>integerRegisters (in category 'accessing') -----
+ integerRegisters
+ "Answer the value of integerRegisters"
+
+ ^ integerRegisters!
Item was changed:
+ ThreadedFFICalloutState subclass: #ThreadedFFICalloutStateForX64W in64
+ instanceVariableNames: 'integerRegisterIndex floatRegisterIndex floatRegisterSignature integerRegisters floatRegisters'
- ThreadedFFICalloutStateForX64 subclass: #ThreadedFFICalloutStateForX64W in64
- instanceVariableNames: 'floatRegisterSignature'
classVariableNames: ''
poolDictionaries: ''
category: 'VMMaker-Plugins-FFI'!
+
+ !ThreadedFFICalloutStateForX64W in64 commentStamp: 'eem 5/30/2017 10:22' prior: 0!
+ A ThreadedFFICalloutStateForX64Win64 is a holder for the callout state maintained while marshalling an FFI call on an X64 (x86-64) system using the _WIN64 ABI.!
Item was changed:
----- Method: ThreadedFFICalloutStateForX64Win64 class>> instVarNamesAndTypesForTransla tionDo: (in category 'translation') -----
instVarNamesAndTypesForTranslationDo: aBinaryBlock
"enumerate aBinaryBlock with the names and C type strings for the inst vars to include in a ThreadedFFICalloutState struct."
+ ThreadedFFICalloutState instVarNamesAndTypesForTranslationDo: aBinaryBlock.
+ self instVarNames do:
- ThreadedFFICalloutStateForX64 instVarNamesAndTypesForTranslationDo: aBinaryBlock.
- ThreadedFFICalloutStateForX64Win64 instVarNames do:
[:ivn|
aBinaryBlock
value: ivn
value: (ivn caseOf: {
+ ['integerRegisters'] -> [{#sqInt. '[NumIntRegArgs]'}].
+ ['floatRegisters'] -> [{#double. '[NumFloatRegArgs]'}] }
- ['floatRegisterSignature'] -> [#int] }
otherwise:
+ [#char])]!
- [#sqInt])]!
Item was added:
+ ----- Method: ThreadedFFICalloutStateForX64Win64>>floatRegisterIndex (in category 'accessing') -----
+ floatRegisterIndex
+
+ ^ floatRegisterIndex!
Item was added:
+ ----- Method: ThreadedFFICalloutStateForX64Win64>>floatRegisters (in category 'accessing') -----
+ floatRegisters
+ "Answer the value of floatRegisters"
+
+ ^ floatRegisters!
Item was changed:
----- Method: ThreadedFFICalloutStateForX64Win64>>initialize (in category 'initialize-release') -----
initialize
super initialize.
+ integerRegisterIndex := floatRegisterIndex := floatRegisterSignature := 0.
+ integerRegisters := CArrayAccessor on: (Array new: ThreadedX64Win64FFIPlugin numRegArgs).
+ floatRegisters := CArrayAccessor on: (Array new: ThreadedX64Win64FFIPlugin numFloatRegArgs)!
- floatRegisterSignature := 0.!
Item was added:
+ ----- Method: ThreadedFFICalloutStateForX64Win64>>integerRegisterIndex (in category 'accessing') -----
+ integerRegisterIndex
+
+ ^ integerRegisterIndex!
Item was added:
+ ----- Method: ThreadedFFICalloutStateForX64Win64>>integerRegisters (in category 'accessing') -----
+ integerRegisters
+ "Answer the value of integerRegisters"
+
+ ^ integerRegisters!
Item was removed:
- ThreadedFFIPlugin subclass: #ThreadedX64FFIPlugin
- instanceVariableNames: ''
- classVariableNames: 'NumFloatRegArgs NumIntRegArgs WordSize'
- poolDictionaries: ''
- category: 'VMMaker-Plugins-FFI'!
-
- !ThreadedX64FFIPlugin commentStamp: 'eem 2/19/2016 15:03' prior: 0!
- This is an abstract superclass for the System V and WIN64 x86-64 ABIs that share a lot of code other than for structure passing.!
Item was removed:
- ----- Method: ThreadedX64FFIPlugin class>>calloutStateClass (in category 'translation') -----
- calloutStateClass
- ^ThreadedFFICalloutStateForX64!
Item was removed:
- ----- Method: ThreadedX64FFIPlugin class>>identifyingPredefinedMacros (in category 'translation') -----
- identifyingPredefinedMacros
- "Answer the predefined macros that identify the platforms a subclass handles, if any.
- If the subclass isn't yet ready for production (a work in progress) simply answer nil.
- Override to filter-out this abstract class."
- ^nil!
Item was removed:
- ----- Method: ThreadedX64FFIPlugin class>>initialize (in category 'class initialization') -----
- initialize
- WordSize := 8.
- NumIntRegArgs := 6.
- NumFloatRegArgs := 8!
Item was removed:
- ----- Method: ThreadedX64FFIPlugin class>>moduleName (in category 'translation') -----
- moduleName
- ^'X64SysVFFIPlugin'!
Item was removed:
- ----- Method: ThreadedX64FFIPlugin class>>numFloatRegArgs (in category 'accessing') -----
- numFloatRegArgs
- ^NumFloatRegArgs!
Item was removed:
- ----- Method: ThreadedX64FFIPlugin class>>numRegArgs (in category 'accessing') -----
- numRegArgs
- ^NumIntRegArgs!
Item was removed:
- ----- Method: ThreadedX64FFIPlugin>>ffiPushDoubleFloat:in: (in category 'marshalling') -----
- ffiPushDoubleFloat: value in: calloutState
- <var: #value type: #double>
- <var: #calloutState type: #'CalloutState *'>
- <inline: true>
-
- calloutState floatRegisterIndex < NumFloatRegArgs
- ifTrue:
- [calloutState floatRegisters at: calloutState floatRegisterIndex put: value.
- calloutState incrementFloatRegisterIndex]
- ifFalse:
- [calloutState currentArg + WordSize > calloutState limit ifTrue:
- [^FFIErrorCallFrameTooBig].
- interpreterProxy storeFloatAtPointer: calloutState currentArg from: value.
- calloutState currentArg: calloutState currentArg + WordSize].
- ^0!
Item was removed:
- ----- Method: ThreadedX64FFIPlugin>>ffiPushPointer:in: (in category 'marshalling') -----
- ffiPushPointer: pointer in: calloutState
- <var: #pointer type: #'void *'>
- <var: #calloutState type: #'CalloutState *'>
- <inline: true>
- calloutState integerRegisterIndex < NumIntRegArgs
- ifTrue:
- [calloutState integerRegisters at: calloutState integerRegisterIndex put: pointer asInteger.
- calloutState incrementIntegerRegisterIndex]
- ifFalse:
- [calloutState currentArg + WordSize > calloutState limit ifTrue:
- [^FFIErrorCallFrameTooBig].
- interpreterProxy longAt: calloutState currentArg put: pointer.
- calloutState currentArg: calloutState currentArg + WordSize].
- ^0!
Item was removed:
- ----- Method: ThreadedX64FFIPlugin>>ffiPushSignedByte:in: (in category 'marshalling') -----
- ffiPushSignedByte: value in: calloutState
- <var: #calloutState type: #'CalloutState *'>
- <inline: true>
- calloutState integerRegisterIndex < NumIntRegArgs
- ifTrue:
- [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #'signed char').
- calloutState incrementIntegerRegisterIndex]
- ifFalse:
- [calloutState currentArg + WordSize > calloutState limit ifTrue:
- [^FFIErrorCallFrameTooBig].
- interpreterProxy longAt: calloutState currentArg put: (self cCoerceSimple: value to: #'signed char').
- calloutState currentArg: calloutState currentArg + WordSize].
- ^0!
Item was removed:
- ----- Method: ThreadedX64FFIPlugin>>ffiPushSignedChar:in: (in category 'marshalling') -----
- ffiPushSignedChar: value in: calloutState
- <var: #calloutState type: #'CalloutState *'>
- <inline: true>
- calloutState integerRegisterIndex < NumIntRegArgs
- ifTrue:
- [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #'signed char').
- calloutState incrementIntegerRegisterIndex]
- ifFalse:
- [calloutState currentArg + WordSize > calloutState limit ifTrue:
- [^FFIErrorCallFrameTooBig].
- interpreterProxy longAt: calloutState currentArg put: (self cCoerceSimple: value to: #'signed char').
- calloutState currentArg: calloutState currentArg + WordSize].
- ^0!
Item was removed:
- ----- Method: ThreadedX64FFIPlugin>>ffiPushSignedInt:in: (in category 'marshalling') -----
- ffiPushSignedInt: value in: calloutState
- <var: #calloutState type: #'CalloutState *'>
- <inline: true>
- calloutState integerRegisterIndex < NumIntRegArgs
- ifTrue:
- [calloutState integerRegisters at: calloutState integerRegisterIndex put: value.
- calloutState incrementIntegerRegisterIndex]
- ifFalse:
- [calloutState currentArg + WordSize > calloutState limit ifTrue:
- [^FFIErrorCallFrameTooBig].
- interpreterProxy longAt: calloutState currentArg put: value.
- calloutState currentArg: calloutState currentArg + WordSize].
- ^0
- !
Item was removed:
- ----- Method: ThreadedX64FFIPlugin>>ffiPushSignedLongLong:in: (in category 'marshalling') -----
- ffiPushSignedLongLong: value in: calloutState
- <var: #value type: #sqLong>
- <var: #calloutState type: #'CalloutState *'>
- <inline: true>
- calloutState integerRegisterIndex < NumIntRegArgs
- ifTrue:
- [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #usqInt).
- calloutState incrementIntegerRegisterIndex]
- ifFalse:
- [calloutState currentArg + WordSize > calloutState limit ifTrue: [^FFIErrorCallFrameTooBig].
- interpreterProxy longAt: calloutState currentArg put: value.
- calloutState currentArg: calloutState currentArg + WordSize].
- ^0!
Item was removed:
- ----- Method: ThreadedX64FFIPlugin>>ffiPushSignedShort:in: (in category 'marshalling') -----
- ffiPushSignedShort: value in: calloutState
- <var: #calloutState type: #'CalloutState *'>
- <inline: true>
- calloutState integerRegisterIndex < NumIntRegArgs
- ifTrue:
- [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #'signed short').
- calloutState incrementIntegerRegisterIndex]
- ifFalse:
- [calloutState currentArg + WordSize > calloutState limit ifTrue:
- [^FFIErrorCallFrameTooBig].
- interpreterProxy longAt: calloutState currentArg put: (self cCoerceSimple: value to: #'signed short').
- calloutState currentArg: calloutState currentArg + WordSize].
- ^0!
Item was removed:
- ----- Method: ThreadedX64FFIPlugin>>ffiPushSingleFloat:in: (in category 'marshalling') -----
- ffiPushSingleFloat: value in: calloutState
- <var: #value type: #float>
- <var: #calloutState type: #'CalloutState *'>
- <inline: true>
-
- calloutState floatRegisterIndex < NumFloatRegArgs
- ifTrue:
- [(self cCoerce: calloutState floatRegisters + calloutState floatRegisterIndex to: #'float *') at: 0 put: value.
- calloutState incrementFloatRegisterIndex]
- ifFalse:
- [calloutState currentArg + WordSize > calloutState limit ifTrue:
- [^FFIErrorCallFrameTooBig].
- interpreterProxy storeFloatAtPointer: calloutState currentArg from: value.
- calloutState currentArg: calloutState currentArg + WordSize].
- ^0!
Item was removed:
- ----- Method: ThreadedX64FFIPlugin>>ffiPushStructure:ofSize: typeSpec:ofLength:in: (in category 'marshalling') -----
- ffiPushStructure: pointer ofSize: structSize typeSpec: argSpec ofLength: argSpecSize in: calloutState
- <var: #pointer type: #'void *'>
- <var: #argSpec type: #'sqInt *'>
- <var: #calloutState type: #'CalloutState *'>
- <inline: true>
- self subclassResponsibility!
Item was removed:
- ----- Method: ThreadedX64FFIPlugin>>ffiPushUnsignedByte:in: (in category 'marshalling') -----
- ffiPushUnsignedByte: value in: calloutState
- <var: #calloutState type: #'CalloutState *'>
- <inline: true>
- calloutState integerRegisterIndex < NumIntRegArgs
- ifTrue:
- [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #'unsigned char').
- calloutState incrementIntegerRegisterIndex]
- ifFalse:
- [calloutState currentArg + WordSize > calloutState limit ifTrue:
- [^FFIErrorCallFrameTooBig].
- interpreterProxy longAt: calloutState currentArg put: (self cCoerceSimple: value to: #'unsigned char').
- calloutState currentArg: calloutState currentArg + WordSize].
- ^0
- !
Item was removed:
- ----- Method: ThreadedX64FFIPlugin>>ffiPushUnsignedChar:in: (in category 'marshalling') -----
- ffiPushUnsignedChar: value in: calloutState
- <var: #calloutState type: #'CalloutState *'>
- <inline: true>
- calloutState integerRegisterIndex < NumIntRegArgs
- ifTrue:
- [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #'unsigned char').
- calloutState incrementIntegerRegisterIndex]
- ifFalse:
- [calloutState currentArg + WordSize > calloutState limit ifTrue:
- [^FFIErrorCallFrameTooBig].
- interpreterProxy longAt: calloutState currentArg put: (self cCoerceSimple: value to: #'unsigned char').
- calloutState currentArg: calloutState currentArg + WordSize].
- ^0!
Item was removed:
- ----- Method: ThreadedX64FFIPlugin>>ffiPushUnsignedInt:in: (in category 'marshalling') -----
- ffiPushUnsignedInt: value in: calloutState
- <var: #calloutState type: #'CalloutState *'>
- <inline: true>
- calloutState integerRegisterIndex < NumIntRegArgs
- ifTrue:
- [calloutState integerRegisters at: calloutState integerRegisterIndex put: value.
- calloutState incrementIntegerRegisterIndex]
- ifFalse:
- [calloutState currentArg + WordSize > calloutState limit ifTrue:
- [^FFIErrorCallFrameTooBig].
- interpreterProxy longAt: calloutState currentArg put: value.
- calloutState currentArg: calloutState currentArg + WordSize].
- ^0
-
- !
Item was removed:
- ----- Method: ThreadedX64FFIPlugin>>ffiPushUnsignedLongLong:in: (in category 'marshalling') -----
- ffiPushUnsignedLongLong: value in: calloutState
- <var: #value type: #usqLong>
- <var: #calloutState type: #'CalloutState *'>
- <inline: true>
- calloutState integerRegisterIndex < NumIntRegArgs
- ifTrue:
- [calloutState integerRegisters at: calloutState integerRegisterIndex put: value.
- calloutState incrementIntegerRegisterIndex]
- ifFalse:
- [calloutState currentArg + WordSize > calloutState limit ifTrue: [^FFIErrorCallFrameTooBig].
- interpreterProxy longAt: calloutState currentArg put: value.
- calloutState currentArg: calloutState currentArg + WordSize].
- ^0!
Item was removed:
- ----- Method: ThreadedX64FFIPlugin>>ffiPushUnsignedShort:in: (in category 'marshalling') -----
- ffiPushUnsignedShort: value in: calloutState
- <var: #calloutState type: #'CalloutState *'>
- <inline: true>
- calloutState integerRegisterIndex < NumIntRegArgs
- ifTrue:
- [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #'unsigned short').
- calloutState incrementIntegerRegisterIndex]
- ifFalse:
- [calloutState currentArg + WordSize > calloutState limit ifTrue:
- [^FFIErrorCallFrameTooBig].
- interpreterProxy longAt: calloutState currentArg put: (self cCoerceSimple: value to: #'unsigned short').
- calloutState currentArg: calloutState currentArg + WordSize].
- ^0!
Item was removed:
- ----- Method: ThreadedX64FFIPlugin>>returnStructInRegisters: (in category 'marshalling') -----
- returnStructInRegisters: returnStructSize
- "Answer if a struct result of a given size is returned in memory or not."
- self subclassResponsibility!
Item was changed:
+ ThreadedFFIPlugin subclass: #ThreadedX64SysVFFIPlugin
- ThreadedX64FFIPlugin subclass: #ThreadedX64SysVFFIPlugin
instanceVariableNames: ''
+ classVariableNames: 'NumFloatRegArgs NumIntRegArgs WordSize'
- classVariableNames: ''
poolDictionaries: ''
category: 'VMMaker-Plugins-FFI'!
!ThreadedX64SysVFFIPlugin commentStamp: 'eem 2/17/2016 20:03' prior: 0!
This subclass is for the System V x86-64 ABI. The System V ABI uses 6 integer registers and 8 double-precision floating-point registers. See http://www.x86-64.org/documentation/abi.pdf . It seems that Mac OS X and linux use draft version 0.90, http://people.freebsd.org/~obrien/amd64-elf-abi.pdf .
Note that the System V x86-64 ABI decomposes structs of 2 eightbytes or smaller passed by value across available parameter registers. double fields will be passed in an xmm register.!
Item was added:
+ ----- Method: ThreadedX64SysVFFIPlugin class>>calloutStateClass (in category 'translation') -----
+ calloutStateClass
+ ^ThreadedFFICalloutStateForX64S ysV!
Item was added:
+ ----- Method: ThreadedX64SysVFFIPlugin>>ffiPushDoubleFloat:in: (in category 'marshalling') -----
+ ffiPushDoubleFloat: value in: calloutState
+ <var: #value type: #double>
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+
+ calloutState floatRegisterIndex < NumFloatRegArgs
+ ifTrue:
+ [calloutState floatRegisters at: calloutState floatRegisterIndex put: value.
+ calloutState incrementFloatRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig].
+ interpreterProxy storeFloatAtPointer: calloutState currentArg from: value.
+ calloutState currentArg: calloutState currentArg + WordSize].
+ ^0!
Item was added:
+ ----- Method: ThreadedX64SysVFFIPlugin>>ffiPushPointer:in: (in category 'marshalling') -----
+ ffiPushPointer: pointer in: calloutState
+ <var: #pointer type: #'void *'>
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: pointer asInteger.
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig].
+ interpreterProxy longAt: calloutState currentArg put: pointer.
+ calloutState currentArg: calloutState currentArg + WordSize].
+ ^0!
Item was added:
+ ----- Method: ThreadedX64SysVFFIPlugin>>ffiPushSignedByte:in: (in category 'marshalling') -----
+ ffiPushSignedByte: value in: calloutState
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #'signed char').
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig].
+ interpreterProxy longAt: calloutState currentArg put: (self cCoerceSimple: value to: #'signed char').
+ calloutState currentArg: calloutState currentArg + WordSize].
+ ^0!
Item was added:
+ ----- Method: ThreadedX64SysVFFIPlugin>>ffiPushSignedChar:in: (in category 'marshalling') -----
+ ffiPushSignedChar: value in: calloutState
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #'signed char').
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig].
+ interpreterProxy longAt: calloutState currentArg put: (self cCoerceSimple: value to: #'signed char').
+ calloutState currentArg: calloutState currentArg + WordSize].
+ ^0!
Item was added:
+ ----- Method: ThreadedX64SysVFFIPlugin>>ffiPushSignedInt:in: (in category 'marshalling') -----
+ ffiPushSignedInt: value in: calloutState
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: value.
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig].
+ interpreterProxy longAt: calloutState currentArg put: value.
+ calloutState currentArg: calloutState currentArg + WordSize].
+ ^0
+ !
Item was added:
+ ----- Method: ThreadedX64SysVFFIPlugin>>ffiPushSignedLongLong:in: (in category 'marshalling') -----
+ ffiPushSignedLongLong: value in: calloutState
+ <var: #value type: #sqLong>
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #usqInt).
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue: [^FFIErrorCallFrameTooBig].
+ interpreterProxy longAt: calloutState currentArg put: value.
+ calloutState currentArg: calloutState currentArg + WordSize].
+ ^0!
Item was added:
+ ----- Method: ThreadedX64SysVFFIPlugin>>ffiPushSignedShort:in: (in category 'marshalling') -----
+ ffiPushSignedShort: value in: calloutState
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #'signed short').
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig].
+ interpreterProxy longAt: calloutState currentArg put: (self cCoerceSimple: value to: #'signed short').
+ calloutState currentArg: calloutState currentArg + WordSize].
+ ^0!
Item was added:
+ ----- Method: ThreadedX64SysVFFIPlugin>>ffiPushSingleFloat:in: (in category 'marshalling') -----
+ ffiPushSingleFloat: value in: calloutState
+ <var: #value type: #float>
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+
+ calloutState floatRegisterIndex < NumFloatRegArgs
+ ifTrue:
+ [(self cCoerce: calloutState floatRegisters + calloutState floatRegisterIndex to: #'float *') at: 0 put: value.
+ calloutState incrementFloatRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig].
+ interpreterProxy storeFloatAtPointer: calloutState currentArg from: value.
+ calloutState currentArg: calloutState currentArg + WordSize].
+ ^0!
Item was added:
+ ----- Method: ThreadedX64SysVFFIPlugin>>ffiPushUnsignedByte:in: (in category 'marshalling') -----
+ ffiPushUnsignedByte: value in: calloutState
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #'unsigned char').
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig].
+ interpreterProxy longAt: calloutState currentArg put: (self cCoerceSimple: value to: #'unsigned char').
+ calloutState currentArg: calloutState currentArg + WordSize].
+ ^0
+ !
Item was added:
+ ----- Method: ThreadedX64SysVFFIPlugin>>ffiPushUnsignedChar:in: (in category 'marshalling') -----
+ ffiPushUnsignedChar: value in: calloutState
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #'unsigned char').
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig].
+ interpreterProxy longAt: calloutState currentArg put: (self cCoerceSimple: value to: #'unsigned char').
+ calloutState currentArg: calloutState currentArg + WordSize].
+ ^0!
Item was added:
+ ----- Method: ThreadedX64SysVFFIPlugin>>ffiPushUnsignedInt:in: (in category 'marshalling') -----
+ ffiPushUnsignedInt: value in: calloutState
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: value.
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig].
+ interpreterProxy longAt: calloutState currentArg put: value.
+ calloutState currentArg: calloutState currentArg + WordSize].
+ ^0
+
+ !
Item was added:
+ ----- Method: ThreadedX64SysVFFIPlugin>>ffiPushUnsignedLongLong:in: (in category 'marshalling') -----
+ ffiPushUnsignedLongLong: value in: calloutState
+ <var: #value type: #usqLong>
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: value.
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue: [^FFIErrorCallFrameTooBig].
+ interpreterProxy longAt: calloutState currentArg put: value.
+ calloutState currentArg: calloutState currentArg + WordSize].
+ ^0!
Item was added:
+ ----- Method: ThreadedX64SysVFFIPlugin>>ffiPushUnsignedShort:in: (in category 'marshalling') -----
+ ffiPushUnsignedShort: value in: calloutState
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #'unsigned short').
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig].
+ interpreterProxy longAt: calloutState currentArg put: (self cCoerceSimple: value to: #'unsigned short').
+ calloutState currentArg: calloutState currentArg + WordSize].
+ ^0!
Item was changed:
+ ThreadedFFIPlugin subclass: #ThreadedX64Win64FFIPlugin
- ThreadedX64FFIPlugin subclass: #ThreadedX64Win64FFIPlugin
instanceVariableNames: ''
+ classVariableNames: 'NumFloatRegArgs NumIntRegArgs WordSize'
- classVariableNames: ''
poolDictionaries: ''
category: 'VMMaker-Plugins-FFI'!
!ThreadedX64Win64FFIPlugin commentStamp: 'nice 8/10/2016 19:23' prior: 0!
This subclass is for the Win64 x86-64 ABI. The Win64 ABI uses 4 integer registers or 4 double-precision floating-point registers or a mix of the two. See w.g. https://msdn.microsoft.com/en-us/library/ms235286.aspx , or google for "Overview of x64 Calling Conventions - MSDN - Microsoft".
Note that unlike the System V x86-64 ABI, the Win64 ABI does /not/ decompose structs passed by value across available parameter registers.!
Item was added:
+ ----- Method: ThreadedX64Win64FFIPlugin>>ffiPushDoubleFloat:in: (in category 'marshalling') -----
+ ffiPushDoubleFloat: value in: calloutState
+ <var: #value type: #double>
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+
+ calloutState floatRegisterIndex < NumFloatRegArgs
+ ifTrue:
+ [calloutState floatRegisters at: calloutState floatRegisterIndex put: value.
+ calloutState incrementFloatRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig]].
+ interpreterProxy storeFloatAtPointer: calloutState currentArg from: value.
+ calloutState currentArg: calloutState currentArg + WordSize.
+ ^0!
Item was added:
+ ----- Method: ThreadedX64Win64FFIPlugin>>ffiPushPointer:in: (in category 'marshalling') -----
+ ffiPushPointer: pointer in: calloutState
+ <var: #pointer type: #'void *'>
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: pointer asInteger.
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig]].
+ interpreterProxy longAt: calloutState currentArg put: pointer.
+ calloutState currentArg: calloutState currentArg + WordSize.
+ ^0!
Item was added:
+ ----- Method: ThreadedX64Win64FFIPlugin>>ffiPushSignedByte:in: (in category 'marshalling') -----
+ ffiPushSignedByte: value in: calloutState
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #'signed char').
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig]].
+ interpreterProxy longAt: calloutState currentArg put: (self cCoerceSimple: value to: #'signed char').
+ calloutState currentArg: calloutState currentArg + WordSize.
+ ^0!
Item was added:
+ ----- Method: ThreadedX64Win64FFIPlugin>>ffiPushSignedChar:in: (in category 'marshalling') -----
+ ffiPushSignedChar: value in: calloutState
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #'signed char').
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig]].
+ interpreterProxy longAt: calloutState currentArg put: (self cCoerceSimple: value to: #'signed char').
+ calloutState currentArg: calloutState currentArg + WordSize.
+ ^0!
Item was added:
+ ----- Method: ThreadedX64Win64FFIPlugin>>ffiPushSignedInt:in: (in category 'marshalling') -----
+ ffiPushSignedInt: value in: calloutState
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: value.
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig]].
+ interpreterProxy longAt: calloutState currentArg put: value.
+ calloutState currentArg: calloutState currentArg + WordSize.
+ ^0
+ !
Item was added:
+ ----- Method: ThreadedX64Win64FFIPlugin>>ffiPushSignedLongLong:in: (in category 'marshalling') -----
+ ffiPushSignedLongLong: value in: calloutState
+ <var: #value type: #sqLong>
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #usqInt).
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig]].
+ interpreterProxy longAt: calloutState currentArg put: value.
+ calloutState currentArg: calloutState currentArg + WordSize.
+ ^0!
Item was added:
+ ----- Method: ThreadedX64Win64FFIPlugin>>ffiPushSignedShort:in: (in category 'marshalling') -----
+ ffiPushSignedShort: value in: calloutState
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #'signed short').
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig]].
+ interpreterProxy longAt: calloutState currentArg put: (self cCoerceSimple: value to: #'signed short').
+ calloutState currentArg: calloutState currentArg + WordSize.
+ ^0!
Item was added:
+ ----- Method: ThreadedX64Win64FFIPlugin>>ffiPushSingleFloat:in: (in category 'marshalling') -----
+ ffiPushSingleFloat: value in: calloutState
+ <var: #value type: #float>
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+
+ calloutState floatRegisterIndex < NumFloatRegArgs
+ ifTrue:
+ [(self cCoerce: calloutState floatRegisters + calloutState floatRegisterIndex to: #'float *') at: 0 put: value.
+ calloutState incrementFloatRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig]].
+ interpreterProxy storeFloatAtPointer: calloutState currentArg from: value.
+ calloutState currentArg: calloutState currentArg + WordSize.
+ ^0!
Item was added:
+ ----- Method: ThreadedX64Win64FFIPlugin>>ffiPushUnsignedByte:in: (in category 'marshalling') -----
+ ffiPushUnsignedByte: value in: calloutState
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #'unsigned char').
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig]].
+ interpreterProxy longAt: calloutState currentArg put: (self cCoerceSimple: value to: #'unsigned char').
+ calloutState currentArg: calloutState currentArg + WordSize.
+ ^0
+ !
Item was added:
+ ----- Method: ThreadedX64Win64FFIPlugin>>ffiPushUnsignedChar:in: (in category 'marshalling') -----
+ ffiPushUnsignedChar: value in: calloutState
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #'unsigned char').
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig]].
+ interpreterProxy longAt: calloutState currentArg put: (self cCoerceSimple: value to: #'unsigned char').
+ calloutState currentArg: calloutState currentArg + WordSize.
+ ^0!
Item was added:
+ ----- Method: ThreadedX64Win64FFIPlugin>>ffiPushUnsignedInt:in: (in category 'marshalling') -----
+ ffiPushUnsignedInt: value in: calloutState
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: value.
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig]].
+ interpreterProxy longAt: calloutState currentArg put: value.
+ calloutState currentArg: calloutState currentArg + WordSize.
+ ^0
+
+ !
Item was added:
+ ----- Method: ThreadedX64Win64FFIPlugin>>ffiPushUnsignedLongLong:in: (in category 'marshalling') -----
+ ffiPushUnsignedLongLong: value in: calloutState
+ <var: #value type: #usqLong>
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: value.
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig]].
+ interpreterProxy longAt: calloutState currentArg put: value.
+ calloutState currentArg: calloutState currentArg + WordSize.
+ ^0!
Item was added:
+ ----- Method: ThreadedX64Win64FFIPlugin>>ffiPushUnsignedShort:in: (in category 'marshalling') -----
+ ffiPushUnsignedShort: value in: calloutState
+ <var: #calloutState type: #'CalloutState *'>
+ <inline: true>
+ calloutState integerRegisterIndex < NumIntRegArgs
+ ifTrue:
+ [calloutState integerRegisters at: calloutState integerRegisterIndex put: (self cCoerceSimple: value to: #'unsigned short').
+ calloutState incrementIntegerRegisterIndex]
+ ifFalse:
+ [calloutState currentArg + WordSize > calloutState limit ifTrue:
+ [^FFIErrorCallFrameTooBig]].
+ interpreterProxy longAt: calloutState currentArg put: (self cCoerceSimple: value to: #'unsigned short').
+ calloutState currentArg: calloutState currentArg + WordSize.
+ ^0!