[Pharo-project] Status of Alien FFI

Ken Treis ken at miriamtech.com
Tue Sep 22 19:16:16 EDT 2009

Eliot, Johan, Fernando, et. al.:

On Sep 16, 2009, at 3:09 PM, Eliot Miranda wrote:

> Hi Ken,
> On Wed, Sep 16, 2009 at 12:17 PM, Ken Treis <ken at miriamtech.com>  
> wrote:
> Perhaps there would need to be new primitives for the basic size of  
> each relevant C type? I'm anxious to hear what Eliot might have to  
> say about this since he's got about 2000x more experience with this  
> than I do.
> are you using the 64-bit VM?  If you're using a 32-bit VM on a 64- 
> bit platform then yu're using 32-bits and you'll be linking against  
> 32-bit libraries and hence nothing will have changed.

At present I'm on a 32-bit VM, but I'm trying to build a package  
that'll work both on Squeak/Pharo and on GemStone/S 64.
> Alien has support for 64-bit values.  Of course it uses the Windows  
> choice, short = 2, int unused as a name, long = 4, longLong = 8.  e.g.
>     anAlien unsignedByteAt: oneRelativeIndex
>     anAlien unsignedShortAt: oneRelativeIndex
>     anAlien unsignedLongAt: oneRelativeIndex
>     anAlien unsignedLongLongAt: oneRelativeIndex
> are the basic primitives for fetching unsigned integers.
> But this needs to be wrapped with something that selects the right  
> sizes based on the current platform and that's yet to be addressed.

OK, I took a first stab at this. In Alien-Core-KenTreis.57, I added  
the a class variable that holds a dictionary of platform sizes, along  
with accessors on Alien class for sizeof(type)[1]. I am imagining that  
this dictionary could be populated with a primitive, but for now it  
has to be set by hand. Probably high time I learned how to build  
Squeak primitives, but deadlines are calling...

I also added Alien>>signedIntAt:/put: and unsignedIntAt:/put:. Right  
now these assume you're on an IA32 architecture (heck, that's the name  
of the plugin). But at least they hide that detail from the  
CairoGraphics package, which can simply use `Alien sizeofInt` in  
offset calculations and `Alien sizeofPointer` when data structures  
don't align nicely on 8-byte boundaries.

Other changes in this version:

* Class-side convenience callout helpers on AlienLibrary (e.g.  
int:with:, void:withArguments:, etc). These defer their actual  
behavior to primitives on the singleton instance, but provide for  
(IMHO) cleaner invocation from other objects.

* Flush the list of loaded libraries at image startup, like the  
original Alien package did, instead of doing it at image shutdown as  
later versions do. This lets you save the image without dropping all  
of your libraries and invalidating external references.

* A couple of accessors on AlienWeakTable that let you find a  
registered object by tag (analogous to Dictionary>>keyAtValue:),  
remove by tag, and return a strong reference to everything that the  
table currently holds weakly. The Cairo package uses these when  
handles are explicitly released and when flushing handles at image  

I'm lobbying for inclusion of all of these in the trunk, but I'll be  
glad to defer to the better judgement of the package maintainers if my  
code is determined to be wrong/misguided. At this point this all works  
for me, and works well enough that I can load CairoGraphics and my  
"alien lite" in GemStone, and the various pointers, data offsets, etc.  
are right for Linux/x86_64.

[1] I know there were some accessors for a few types already, but it  
seemed odd to have implementors for both signedLongSize and  
unsignedLongSize since the size doesn't depend on the sign-edness. I  
liked the C-like use of sizeofLong, sizeofPointer, etc but am willing  
to defer to somebody else's judgement on these method names.

Ken Treis
Miriam Technologies, Inc.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.pharo.org/pipermail/pharo-dev_lists.pharo.org/attachments/20090922/8eab21f9/attachment-0001.html>

More information about the Pharo-dev mailing list