[squeak-dev] FFI: FFI-Kernel-mt.132.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed May 5 16:05:30 UTC 2021
Marcel Taeumel uploaded a new version of FFI-Kernel to project FFI:
http://source.squeak.org/FFI/FFI-Kernel-mt.132.mcz
==================== Summary ====================
Name: FFI-Kernel-mt.132
Author: mt
Time: 5 May 2021, 6:05:28.168784 pm
UUID: 99688c3a-95e7-2a4f-abcc-de6aafa6cca0
Ancestors: FFI-Kernel-mt.131
Adds missing #pointerAt:put: to ExternalData, which might still be useful if you want to access "arrays" of pointers (e.g. char**) manually via void*.
pointers := (ExternalType typeNamed: 'void*') allocate: 20.
pointers at: 1. "answers ExternalAddress; NULL pointer"
Fixes an off-by-one issue in byte-array read-writer.
Make it possible to copy any external structure/data to object memory via #copy. That is, avoid having too many proxies to external memory, which bears the risk of double-free or memory leaks. One could actually allocate new external memory, but ... :-/
nums := ExternalType int32_t allocateExternal: 10.
local := nums copy.
nums free.
local explore.
Depending on the state of your memory, you might get some interesting numbers in this example. :-D See #zeroMemory.
=============== Diff against FFI-Kernel-mt.131 ===============
Item was added:
+ ----- Method: ByteArrayReadWriter>>copy (in category 'copying') -----
+ copy
+
+ ^ byteArray copyFrom: byteOffset + 1 to: byteOffset + byteSize !
Item was changed:
----- Method: ByteArrayReadWriter>>doesNotUnderstand: (in category 'system primitives') -----
doesNotUnderstand: aMessage
| selector args |
selector := aMessage selector.
args := aMessage arguments.
args size caseOf: {
[ 1 ] -> [ (selector endsWith: 'At:') ifTrue: [ args at: 1 put: args first + byteOffset ] ].
[ 2 ] -> [ (selector endsWith: 'length:')
ifTrue: [
args at: 1 put: args first + byteOffset.
+ (args first + args second - 1) > byteSize
- args first + args second > byteSize
ifTrue: [self errorSubscriptBounds: args first + args second] ]
ifFalse: [(selector endsWith: 'put:') ifTrue: [
args at: 1 put: args first + byteOffset ]] ].
[ 3 ] -> [ (selector endsWith: 'length:')
ifTrue: [
args at: 1 put: args first + byteOffset.
+ (args first + args third - 1) > byteSize
- args first + args third > byteSize
ifTrue: [self errorSubscriptBounds: args first + args third]]]
} otherwise: [].
^ aMessage sendTo: byteArray!
Item was changed:
----- Method: ExternalData>>copyFrom:to: (in category 'accessing') -----
copyFrom: firstIndex to: lastIndex
+ ^ (self from: firstIndex to: lastIndex) copy!
- ^ (self from: firstIndex to: lastIndex) getExternalData!
Item was added:
+ ----- Method: ExternalData>>pointerAt: (in category 'accessing - pointers') -----
+ pointerAt: index
+
+ | byteOffset |
+ byteOffset := ((index - 1) * ExternalAddress wordSize) + 1.
+
+ self flag: #contentVsContainer. "mt: We should adjust this once we can support n-ary pointer types."
+ ^ handle pointerAt: byteOffset
+
+ "
+ self assert: [self contentType isPointerType].
+ ^ self at: index
+ "!
Item was added:
+ ----- Method: ExternalData>>pointerAt:put: (in category 'accessing - pointers') -----
+ pointerAt: index put: value
+
+ | byteOffset |
+ byteOffset := ((index - 1) * ExternalAddress wordSize) + 1.
+
+ self flag: #contentVsContainer. "mt: We should adjust this once we can support n-ary pointer types."
+ ^ handle pointerAt: byteOffset put: value
+
+ "
+ self assert: [self contentType isPointerType].
+ ^ self at: index put: value
+ "!
Item was added:
+ ----- Method: ExternalStructure>>postCopy (in category 'copying') -----
+ postCopy
+ "Copy external memory into object memory to not loose track of what to #free and what not. It's safer this way."
+
+ handle isExternalAddress
+ ifTrue: [handle := self asExternalData getExternalData getHandle]
+ ifFalse: [handle := handle copy. "Materializes byte-array read-writer section if any"].!
More information about the Squeak-dev
mailing list
|