[squeak-dev] FFI: FFI-Kernel-mt.198.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu Aug 12 08:40:34 UTC 2021
Marcel Taeumel uploaded a new version of FFI-Kernel to project FFI:
http://source.squeak.org/FFI/FFI-Kernel-mt.198.mcz
==================== Summary ====================
Name: FFI-Kernel-mt.198
Author: mt
Time: 12 August 2021, 10:40:33.706222 am
UUID: 59e4fc64-3f4f-4241-ba22-5178c5cf7028
Ancestors: FFI-Kernel-eem.197
Adds preference to opt-out from specific integer primitives, which yields better performance when the FFI plugin does not yet have those new primitives. :-) And it allows for simpler benchmarking.
=============== Diff against FFI-Kernel-eem.197 ===============
Item was changed:
----- Method: ByteArray>>integerAt:put:size:signed: (in category '*FFI-Kernel-accessing - integer') -----
integerAt: byteOffset put: value size: nBytes signed: aBoolean
"Primitive. Store the given value as integer of nBytes size in the receiver.
- BYTE ORDER is platform native order.
- FAILS IF the value is out of range.
- NOTE that this primitive will access memory in the outer space if invoked from ExternalAddress."
<primitive: #primitiveFFIIntegerAtPut module: #SqueakFFIPrims>
+ <ffiAtomicWrite: #( int8_t uint8_t int16_t uint16_t int32_t uint32_t int64_t uint64_t ) >
- "<ffiAtomicWrite: #( int8_t uint8_t int16_t uint16_t int32_t uint32_t int64_t uint64_t ) >"
"Examples:
ExternalType int32_t allocate value: -1; explore.
ExternalType uint32_t allocate value: 1; explore.
"
^ self primitiveFailed!
Item was changed:
----- Method: ByteArray>>integerAt:size:signed: (in category '*FFI-Kernel-accessing - integer') -----
integerAt: byteOffset size: nBytes signed: aBoolean
"Primitive. Return an integer of nBytes size from the receiver.
- BYTE ORDER is platform native order.
- FAILS IF the receiver has not enough bytes.
- NOTE that this primitive will access memory in the outer space if invoked from ExternalAddress."
<primitive: #primitiveFFIIntegerAt module: #SqueakFFIPrims>
+ <ffiAtomicRead: #( int8_t uint8_t int16_t uint16_t int32_t uint32_t int64_t uint64_t ) >
- "<ffiAtomicRead: #( int8_t uint8_t int16_t uint16_t int32_t uint32_t int64_t uint64_t ) >"
"Examples:
ExternalType int32_t handle: #[ 255 0 0 255 ] at: 1.
ExternalType uint32_t handle: #[ 255 0 0 255 ] at: 1.
"
^ self primitiveFailed!
Item was added:
+ ----- Method: ByteArray>>testInt32At: (in category '*FFI-Kernel-accessing - integer') -----
+ testInt32At: byteOffset
+ "Use this to check whether your FFI plugin supports the specific integer primitives."
+ <primitive: #primitiveSignedInt32At module: #SqueakFFIPrims error: ec>
+ ^ nil "To make check faster than via #primitiveFailed exception handler."!
Item was changed:
FFIAtomicReadWriteSend subclass: #GenericIntegerReadWriteSend
instanceVariableNames: ''
+ classVariableNames: 'UseSpecificIntegerPrimitives'
- classVariableNames: ''
poolDictionaries: ''
category: 'FFI-Kernel-Support'!
!GenericIntegerReadWriteSend commentStamp: 'mt 8/6/2021 16:11' prior: 0!
I am a message send for reading and writing atomic integer values from and to byte arrays or external addresses. My instances memoize type-specific #byteSize and #isSigned. See #isIntegerType and #initializeAtomicSends.
I am generic in the sense that my target primitive covers several atomic types.!
Item was added:
+ ----- Method: GenericIntegerReadWriteSend class>>canUseSpecificIntegerPrimitives (in category 'preferences') -----
+ canUseSpecificIntegerPrimitives
+
+ ^ ((ByteArray new: 4) testInt32At: 1) notNil!
Item was added:
+ ----- Method: GenericIntegerReadWriteSend class>>pragma:selectsAtomicType: (in category 'instance creation') -----
+ pragma: pragma selectsAtomicType: atomicType
+ "Overwritten to filter between generic and specific integer primitives according to the preference. Note that #isArray is an indicator for a generic primitive."
+
+ "self assert: [atomicType isIntegerType]."
+ ^ self useSpecificIntegerPrimitives "want specific?" = (pragma argumentAt: 1) isArray "found generic?"
+ ifTrue: [false]
+ ifFalse: [super pragma: pragma selectsAtomicType: atomicType]!
Item was added:
+ ----- Method: GenericIntegerReadWriteSend class>>useSpecificIntegerPrimitives (in category 'preferences') -----
+ useSpecificIntegerPrimitives
+ <preference: 'Use specific integer primitives'
+ categoryList: #('FFI Kernel')
+ description: 'When true, use specific primitives when reading/writing int32_t, uint32_t etc. from/to ByteArray or ExternalAddress. Note that your FFI plugin might not support those newer primitives.'
+ type: #Boolean>
+ ^ UseSpecificIntegerPrimitives ifNil: [true "Cannot use #canUseSpecificIntegerPrimitives because struct-field generation is affected. Need to keep this preference in sync with how the struct-field accessors actually look like."]!
Item was added:
+ ----- Method: GenericIntegerReadWriteSend class>>useSpecificIntegerPrimitives: (in category 'preferences') -----
+ useSpecificIntegerPrimitives: aBoolean
+
+ UseSpecificIntegerPrimitives = aBoolean ifTrue: [^ self].
+
+ aBoolean ~= self canUseSpecificIntegerPrimitives
+ ifTrue: [self notify: 'FFI plugin does not support specific integer primitives. Proceed to update atomic sends anyway. Fallback code will redirect to generic integer primitive. Performance might be affected.'].
+
+ UseSpecificIntegerPrimitives := aBoolean.
+
+ Cursor wait showWhile: [
+ ExternalType initializeAtomicSends.
+ MessageTally spyOn: [ExternalStructure defineAllFields]].!
More information about the Squeak-dev
mailing list
|