FFI usage
Andreas Raab
andreas.raab at gmx.de
Fri May 12 22:31:09 UTC 2006
Alejandro F. Reimondo wrote:
> Where can we read details on FFI?
Below ;-)
> I am interested becasue I feel that the FFI implementation
> requires Assembly code to be compiled.
> Is it true?
That depends on whether you mean it literally or figuratively. For
running the FFI there is a bit of per-platform support code needed, some
of which (the actual call-out) is typically implemented directly in
machine code and written using assembler.
> Is there any "slow" code in slang for platforms that do not have
> easy assemblers?
The FFI is (like many other parts of Squeak) "incomplete" in such that
it requires a bit of extra support code to implement the actual ABI
(e.g., setting up the call stack, calling the function, popping args
from the stack etc). This is handled in the platform specific files (see
sqWin32FFI.c for an example) and requires some 20 functions or so to
work (most of those are trivial but provided just in case some platform
has odd behavior wrt. to some data type).
It is certainly possible to implement much of it without the use of
assembler. For example, if a platform basically passes everything as
words (32bit ints) you could do something like here:
int args[MAX_ARGS];
int argCount;
/* take an int as next argument */
int ffiPushSignedInt(int value) {
args[argCount++] = value;
return 1;
}
/* tons of other int types eliminated for brevity here */
int ffiPushSingleFloat(double value) {
/* this will push the 32bit equiv. of the float value */
float single = (float) value;
ffiPushSignedInt(*(int*)(&single));
return 1;
}
/* ... double works just the same way; 2x32bit entity ...*
/* ... structures ditto ...*/
/* finally, do the actual callout */
int ffiCallAddress(int fn) {
switch(argCount) {
case 1: return ((int(*)(int))fn)(args[0]);
case 2: return ((int(*)(int, int))fn)(args[0], args[1]);
case 3: return ((int(*)(int, int))fn)(args[0], args[1], args[2]);
/* ... etc ... */
}
This will work just fine and requires no assembler but so far I haven't
found any platform where things would be as simple as that (both Intel
as well as PPC have more complex rules than can be reasonably modeled by
this technique). But if you happen to have a platform where things are
that simple (or if it's okay to restrict yourself to a subset that can
be modeled as simply) that's certainly an option.
Cheers,
- Andreas
More information about the Squeak-dev
mailing list
|