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

Bert Freudenberg bert at freudenbergs.de
Mon Mar 15 16:20:48 UTC 2010


On 15.03.2010, at 17:09, Bert Freudenberg wrote:
> 
> 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 -


Meh. For a long instead long* it's of course

importantStuffAt: index
	(index between: 0 and: 63)
		ifFalse: [^ self errorSubscriptBounds: index].
	^handle signedLongAt: index * 4 + 5

But I guess you got my point - let FFI generate the accessors for the first item, define the rest yourself based on that one. These array accessors could of course be generated automatically if FFI knew this was an array, but it does not - it just knows it's supposed to leave some more space between fields. And given that it's easy enough to add when you need it that's okay I think.

- 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