Re: [Pharo-dev] uFFI: What is the difference between FFIExternalObject and FFIOpaqueObject?
Hi, Thatâs not really possible :) In your case, Method is already a pointer (with arity 1). Which means Method * Is in fact a pointer to a pointer (arity 2), something like "void**" This is a typical case, but you are not âhaving the two casesâ, you still have one :) UFFI will try to box/unbox that for you, btw⦠but sometimes this is not what you want (because pointers to pointers is a typical way to answer lists, for example). And UFFI does not know what you want there⦠in this cases (when you want the list), the recommended way is to get the pointer and create the list yourself. Instead: Method *methodList() You call void *methodList() To avoid the unbox attempt, and then you process your answer âin rawâ (for example using the #readArrayOf:until: method). If it happens that you use both SomeStructure, and SomeStructure*, then is not an opaque type, and you need to map it by subclasses FFIExternalStructure and implementing fieldsDesc, etc. Esteban
On 23 May 2020, at 20:00, Sean P. DeNigris <sean@clipperadams.com> wrote:
Esteban Lorenzano wrote
The easiest way I have to explain is:
You use an OpaqueObject when you will refer to the opaque type in calls as: someFunction(opaqueobject *someArg). You use an ExternalObject when you will refer to the opaque type in calls as: someFunction(externalobject someArg).
Very clear! We're getting somewhere :) But...
What if a type is used both ways?
For example: ^ self ffiCall: #(Method * class_copyMethodList(Class self, uint *outCount)) and ^ self ffiCall: #(struct objc_method_description * method_getDescription(Method self))
----- Cheers, Sean -- Sent from: http://forum.world.st/Pharo-Smalltalk-Developers-f1294837.html
participants (1)
-
Esteban Lorenzano