Re: [Pharo-users] UFFI C basic types passed-by-reference for output

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

Re: [Pharo-users] UFFI C basic types passed-by-reference for output

Ben Coman

On 15 November 2017 at 20:47, Esteban Lorenzano <[hidden email]> wrote:
On 15 Nov 2017, at 09:36, Ben Coman <[hidden email]> wrote:

On 15 November 2017 at 17:27, Esteban Lorenzano <[hidden email]> wrote:

> On 15 Nov 2017, at 02:05, Ben Coman <[hidden email]> wrote:
> What is the recommended way for a C basic type to be passed-by-reference to function wanting to use it for output.
> For example 'width' & 'height' here in this library unction...
> In Pharo...
>   FFIOpaqueObject subclass: #FPDF_DOCUMENT
>   FPDF_GetPageSizeByIndex__document: document
>                           page_index: page_index
>                           width: width
>                           height: height
>     ^self ffiCall: #(int FPDF_GetPageSizeByIndex(
>                                               FPDF_DOCUMENT *document,
>                                               int page_index,
>                                               FFIFloat64 * width,
>                                               FFIFloat64 * height))

what you need to do here is to pass a “buffer” to contain the width and height:

        | document page_index widthBuffer heightBuffer width height result|
        PDFium FPDF_InitLibrary.
        document := PDFium FPDF_LoadDocument__file_path:  helloPdf  password: ''.
        widthBuffer := ByteArray new: (FFIFloat64 typeSize).
        heightBuffer := ByteArray new: (FFIFloat64 typeSize).

Thanks Esteban. That worked. However I needed a minor tweak...
   widthBuffer := ByteArray new: (FFIFloat64 new typeSize).
   widthBuffer := ByteArray new: (FFIFloat64 externalTypeSize).

Now it would be nice to do...
   widthBuffer := FFIFloat64 newBuffer.

you know, I thought the same :)
but since I’m officially on holiday I didn’t do it (yet). 

If you want to add an issue and send a PR, it would be perfect :)

btw, how do we write tests for FFI?    Do we (or can we) deliver as part of standard opensmalltalk-vm 
a small shared library "" to write ffi tests against? With functions like...

  void passByRefOutputs(int *p_int, double *p_double) {
      *p_int = 42;
      *p_double = 4.2;

cheers -ben