[squeak-dev] FFI: FFI-Kernel-nice.118.mcz
Marcel Taeumel
marcel.taeumel at hpi.de
Mon Jun 22 07:31:29 UTC 2020
Hi Nicolas.
I like the idea of having #allocate: ... but maybe not in ExternalType:
- The term "allocate:" is somewhat reserved for heap memory from the SqueakFFI perspective; See ExternalAddress class >> #allocate:.
- The counterpart #free is missing ... which means that, maybe, both #allocate: and #free should be implemented in ExternalData, not ExternalType
What about such a this programming interface:
data := ExternalData
fromHandle: nil
type: MyStruct externalType asPointerType.
data allocate.
myStruct := data asExternalStructure.
You could also copy it back to object memory:
myStruct := data getExternalStructure. "get/pull/fetch ...."
data free.
You are proposing a way to start off in object memory. Maybe like this:
data := ExternalData
fromHandle: nil "maybe optional?"
type: MyStruct externalType asPointerType.
data allocateLocal.
myStruct := data asExternalStructure.
Then we don't need to call #free. See how #allocate and #allocateLocal in ExternalData could mirror #new and #externalNew of ExternalStructure?
There is really an interesting releationship between ExternalStructure (incl. ExternalUnion/ExternalTypeAlias/ExternalPackedStructure) and ExternalData. Can you see it? ^__^
Arrays could be similar:
data := ExternalData type: Externaltype int32_t asPointerType.
data size: 20.
data allocate. "or #allocateLocal"
Now you would have an array of 20 integers. :-) Note that #allocate: with argument could inline that #size: call.
Best,
Marcel
Am 21.06.2020 13:20:44 schrieb commits at source.squeak.org <commits at source.squeak.org>:
Nicolas Cellier uploaded a new version of FFI-Kernel to project FFI:
http://source.squeak.org/FFI/FFI-Kernel-nice.118.mcz
==================== Summary ====================
Name: FFI-Kernel-nice.118
Author: nice
Time: 21 June 2020, 1:20:34.369348 pm
UUID: a8c48997-991d-4e32-9b67-6d93fc0dabe0
Ancestors: FFI-Kernel-mt.117
Add the ability to allocate: an ExternalType or an ExternalStructure/Alias.
It's equivalent to new: but we want a specific idiom, C types are not exactly classes.
Add the ability to compare aliases (at least for equality)
=============== Diff against FFI-Kernel-mt.117 ===============
Item was added:
+ ----- Method: ExternalStructure class>>allocate: (in category 'instance creation') -----
+ allocate: anInteger
+ "Create an ExternalData with enough room for storing an array of size anInteger of such structure"
+ ^self externalType allocate: anInteger!
Item was added:
+ ----- Method: ExternalType>>allocate: (in category 'external data') -----
+ allocate: anInteger
+ "Allocate space for containing an array of size anInteger of this dataType"
+
+ | handle |
+ handle := ByteArray new: self byteSize * anInteger.
+ ^(ExternalData fromHandle: handle type: self) size: anInteger!
Item was added:
+ ----- Method: ExternalTypeAlias>>= (in category 'comparing') -----
+ = anExternalTypeAlias
+ ^self class = anExternalTypeAlias class and: [self value = anExternalTypeAlias value]!
Item was added:
+ ----- Method: ExternalTypeAlias>>hash (in category 'comparing') -----
+ hash
+ ^self class hash hashMultiply bitXor: self value hash!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20200622/3660bf75/attachment.html>
More information about the Squeak-dev
mailing list
|