[squeak-dev] Re: FFI/Alien: Structures with arrrayed fields

Bert Freudenberg bert at freudenbergs.de
Mon Mar 15 16:09:25 UTC 2010


On 15.03.2010, at 16:33, Schwab,Wilhelm K wrote:
> 
> Bert,
> 
> Re your suggestion about making an external structure for "complex," please consider that done.  The question is how to then handle the array (of pointers), and even the array of longs.
> 
> Bill 

Ah. Well given this definition:

fields
	"self defineFields" 
	^#(
		(gratuitousSize	'long')
		(importantStuff 'long*' 256)			"64 * 4"
		(moreImportantStuff 'ComplexStructure*' 256)	"64 * 4"
	)

then FFI only defines the accessors to the first item:

importantStuff
	"This method was automatically generated"
	^ExternalData fromHandle: (handle pointerAt: 5) type: ExternalType long asPointerType

moreImportantStuff
	"This method was automatically generated"
	^ComplexStructure fromHandle: (handle pointerAt: 261)

You need to write the array accessors yourself:

importantStuffAt: index
	(index between: 0 and: 63)
		ifFalse: [^ self errorSubscriptBounds: index].
	^ExternalData fromHandle: (handle pointerAt: index * 4 + 5) type: ExternalType long asPointerType

moreImportantStuffAt: index
	(index between: 0 and: 63)
		ifFalse: [^ self errorSubscriptBounds: index].
	^ComplexStructure fromHandle: (handle pointerAt: index * 4 + 261)

(that's assuming you like 0-based indices for FFI calls - would be easy to change here).

HTH.

- Bert -

> -----Original Message-----
> From: pharo-project-bounces at lists.gforge.inria.fr [mailto:pharo-project-bounces at lists.gforge.inria.fr] On Behalf Of Schwab,Wilhelm K
> Sent: Monday, March 15, 2010 8:29 AM
> To: Pharo-project at lists.gforge.inria.fr; squeak-dev at lists.squeakfoundation.org
> Subject: [Pharo-project] FFI/Alien: Structures with arrrayed fields
> 
> Hello all,
> 
> I am faced with something like the following:
> 
> struct complex { double real; imaginary; }; struct ugly {
> 	int gratuitousSize;
> 	long importantStuff[64];
> 	complex * moreImportantStuff[64];
> };
> 
> The question is how to explain this to FFI?  The closest things I have found always seem to be byte arrays, so the "third element" in the arrays of #fields is not well-revealed.  Does anyone know whether it is additive or multiplicative, and/or how to use it to make sense of the above struct?
> 
> Bill




More information about the Squeak-dev mailing list