Marcel Taeumel uploaded a new version of FFI-Kernel to project FFI:
http://source.squeak.org/FFI/FFI-Kernel-mt.123.mcz==================== Summary ====================
Name: FFI-Kernel-mt.123
Author: mt
Time: 1 May 2021, 10:22:08.119394 am
UUID: 8a1725e7-90a1-2348-9e01-3ce391c4036f
Ancestors: FFI-Kernel-mt.122
Given that we usually talk to external types or external structures (and unions ...) where #allocate: is the current pattern to prepare a list of such things, use #allocateExternal: to allocate external memory, not internal object memory.
While this conflicts with ExternalAddress class #allocate:, clients might not notice because they should usually not deal with the difference between handles being either ByteArray or ExternalAddress (or atomics). I suppose.
Let #free for handles being ExternAdress also null that address. Maybe we could establish a common prototype for a null-address?
(Removes duplicate #isExternalAddress.)
=============== Diff against FFI-Kernel-mt.122 ===============
Item was removed:
- ----- Method: ByteArray>>isExternalAddress (in category '*FFI-Kernel-testing') -----
- isExternalAddress
- "Return true if the receiver describes the address of an object in the outside world"
- ^false!
Item was added:
+ ----- Method: ExternalStructure class>>allocateExternal: (in category 'instance creation') -----
+ allocateExternal: anInteger
+ "Create an ExternalData with enough room for storing an array of size anInteger of such structure. Don't forget to free the allocated memory!!!!!!"
+ ^self externalType allocateExternal: anInteger!
Item was changed:
----- Method: ExternalStructure>>free (in category 'initialize-release') -----
free
"Free the handle pointed to by the receiver"
+
+ handle isExternalAddress
+ ifTrue: [handle free; beNull]
+ ifFalse: [handle := nil].!
- (handle ~~ nil and:[handle isExternalAddress]) ifTrue:[handle free].
- handle := nil.!
Item was added:
+ ----- Method: ExternalType>>allocateExternal: (in category 'external data') -----
+ allocateExternal: anInteger
+ "Allocate space for containing an array of size anInteger of this dataType"
+
+ | handle |
+ handle := ExternalAddress allocate: self byteSize * anInteger.
+ ^(ExternalData fromHandle: handle type: self) size: anInteger!