FFI callout arguments - references to internal objects

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

FFI callout arguments - references to internal objects

Ben Coman
I'm seeking some support for Part 5 of my FFI tutorial
http://blog.openinworld.com/2016/09/pharo-libclang-ffi-part-5-client-data-and-recursive-visitorcallbacks/

where I'm trying to replicate some C code where:
* client_data is a void pointer, and an argument to a callout function
* a reference to some data (an int, or a struct) is passed to the
callout function as the client_data
* the callout function passes that same client_data to a callback
function which casts the client-data to the required type

How can I replicate that with UFFI?  The key thing is that *any* type
can be passed via client_data.  So for a normal Pharo object defined
like...

Object subclass: MyObject
    instanceVariables: 'x y'

myobject := MyObject new x:3 y:4.

I want to pass a reference to myobject to the callout, and in the
callback dereference client_data to get myobject that I can operate on
normally.

Is this possible with current infrastructure, or would it need
something new like FFIInternalPinnedReference to wrap myobject for the
callout and unwrap it in the callback?

cheers -ben

Reply | Threaded
Open this post in threaded view
|

Re: FFI callout arguments - references to internal objects

EstebanLM
Hi Ben,

I will take a better look tomorrow morning, but as first sight, seems to be that you want to declare SomeObject and receive it as argument to the callback, while you are receiving just an ExternalAddress.
If is that the problem what happens is that callbacks do not handle *any type* as the rest of UFFI… they just handle standard C types, so you will receive an ExternalAddress isn’t?
You need to obtain the actual object as you need it. I see two strategies:

1) just create the object using SomeObject>>#fromHandle: This work fine if object is stateless and just want to access it’s defined vocabulary.
2) or… you can just caché the data someplace and then find it using the ExternalAddress as index.
 
(I hope I interpreted the problem correctly… I’m a bit sleep here :P)

cheers,
Esteban


> On 24 Sep 2016, at 19:40, Ben Coman <[hidden email]> wrote:
>
> I'm seeking some support for Part 5 of my FFI tutorial
> http://blog.openinworld.com/2016/09/pharo-libclang-ffi-part-5-client-data-and-recursive-visitorcallbacks/
>
> where I'm trying to replicate some C code where:
> * client_data is a void pointer, and an argument to a callout function
> * a reference to some data (an int, or a struct) is passed to the
> callout function as the client_data
> * the callout function passes that same client_data to a callback
> function which casts the client-data to the required type
>
> How can I replicate that with UFFI?  The key thing is that *any* type
> can be passed via client_data.  So for a normal Pharo object defined
> like...
>
> Object subclass: MyObject
>    instanceVariables: 'x y'
>
> myobject := MyObject new x:3 y:4.
>
> I want to pass a reference to myobject to the callout, and in the
> callback dereference client_data to get myobject that I can operate on
> normally.
>
> Is this possible with current infrastructure, or would it need
> something new like FFIInternalPinnedReference to wrap myobject for the
> callout and unwrap it in the callback?
>
> cheers -ben
>


Reply | Threaded
Open this post in threaded view
|

Re: FFI callout arguments - references to internal objects

Ben Coman
Hi Esteban,
Your advice lead me to make some progress.  Could you have a review?
http://blog.openinworld.com/2016/09/pharo-libclang-ffi-part-5-client-data-and-recursive-visitorcallbacks/

Its perhaps a little low level and I'd like to make CXClientData a
wrapper for some of the complexity.  But time to snooze now.

cheers -ben

On Sun, Sep 25, 2016 at 4:13 PM, Esteban Lorenzano <[hidden email]> wrote:

> Hi Ben,
>
> I will take a better look tomorrow morning, but as first sight, seems to be that you want to declare SomeObject and receive it as argument to the callback, while you are receiving just an ExternalAddress.
> If is that the problem what happens is that callbacks do not handle *any type* as the rest of UFFI… they just handle standard C types, so you will receive an ExternalAddress isn’t?
> You need to obtain the actual object as you need it. I see two strategies:
>
> 1) just create the object using SomeObject>>#fromHandle: This work fine if object is stateless and just want to access it’s defined vocabulary.
> 2) or… you can just caché the data someplace and then find it using the ExternalAddress as index.
>
> (I hope I interpreted the problem correctly… I’m a bit sleep here :P)
>
> cheers,
> Esteban
>
>
>> On 24 Sep 2016, at 19:40, Ben Coman <[hidden email]> wrote:
>>
>> I'm seeking some support for Part 5 of my FFI tutorial
>> http://blog.openinworld.com/2016/09/pharo-libclang-ffi-part-5-client-data-and-recursive-visitorcallbacks/
>>
>> where I'm trying to replicate some C code where:
>> * client_data is a void pointer, and an argument to a callout function
>> * a reference to some data (an int, or a struct) is passed to the
>> callout function as the client_data
>> * the callout function passes that same client_data to a callback
>> function which casts the client-data to the required type
>>
>> How can I replicate that with UFFI?  The key thing is that *any* type
>> can be passed via client_data.  So for a normal Pharo object defined
>> like...
>>
>> Object subclass: MyObject
>>    instanceVariables: 'x y'
>>
>> myobject := MyObject new x:3 y:4.
>>
>> I want to pass a reference to myobject to the callout, and in the
>> callback dereference client_data to get myobject that I can operate on
>> normally.
>>
>> Is this possible with current infrastructure, or would it need
>> something new like FFIInternalPinnedReference to wrap myobject for the
>> callout and unwrap it in the callback?
>>
>> cheers -ben
>>
>
>