See also this thread http://lists.gforge.inria.fr/pipermail/pharo-project/2012-May/064140.html, and this link http://www.shell-storm.org/papers/files/657.pdf to give you an idea of how messy every-one-else-but-your-own low level code can be...
Nicolas 2013/1/28 Eliot Miranda <[email protected]>: > > > On Sun, Jan 27, 2013 at 2:26 PM, Ciprian Teodorov > <[email protected]> wrote: >> >> Hi Guys, >> >> Today I wanted to test my TalkFFI project on linux, and I run into some NB >> issue. >> It seems that the VM crashes when trying to invoke a function returning a >> 8 byte structure. >> I have tried with 4 bytes structure and I get some bogus data but no crash >> with 12 bytes structure it seems to work... > > > I suspect this is a win32/linux difference that NB doesn't handle yet. On > win32 power-of-two structures <= 8 bytes in length are returned in > registers. On linux they're always returned through memory. Here are the > relevant defs from the ThreadedIA32FFIPlugin > > > #if defined(_X86_) || defined(i386) || defined(__i386) || defined(__i386__) > /* Both Mac OS X x86 and Win32 x86 return structs of a power of two in size > * less than or equal to eight bytes in length in registers. Linux never > does so. > */ > # if __linux__ > # define WIN32_X86_STRUCT_RETURN 0 > # else > # define WIN32_X86_STRUCT_RETURN 1 > # endif > > #define returnStructInRegisters(sz) (WIN32_X86_STRUCT_RETURN && (sz) <= 8 && > !((sz)&((sz)-1))) > > > HTH > >> Attached to this mail you will find a simple test case. >> >> the c file I have compiled with: >> >> gcc -g -fPIC -Wall -c -m32 strreturn.c >> gcc -shared -g -Wl,-soname,libret.so.1 -o libret.so -m32 strreturn.o -lc >> >> Cheers, >> -- >> Dr. Ciprian TEODOROV >> Ingénieur Développement CAO >> >> tél : 06 08 54 73 48 >> mail : [email protected] >> www.teodorov.ro > > > > > -- > best, > Eliot
