On 15 November 2017 at 20:47, Esteban Lorenzano estebanlm@gmail.com wrote:
On 15 Nov 2017, at 09:36, Ben Coman btc@openInWorld.com wrote:
On 15 November 2017 at 17:27, Esteban Lorenzano estebanlm@gmail.com wrote:
On 15 Nov 2017, at 02:05, Ben Coman btc@openInWorld.com 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:
testGetPageSizeByIndex | 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). or... 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 :)
https://pharo.fogbugz.com/f/cases/20699/
btw, how do we write tests for FFI? Do we (or can we) deliver as part of standard opensmalltalk-vm a small shared library "libFFITestFrame.so" 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
vm-dev@lists.squeakfoundation.org