nicolas cellier writes:
nicolas cellier a écrit :
Apologies for the cryptic subject...
I have some news about http://bugs.squeak.org/view.php?id=3929 I detected with gdb that the example I provided triggers a FPU stack overflow. When this occurs, a qNan is placed on FPU stack top.
Thus, though ffiFloatReturnValue == 0.0, testing in Smalltalk (self myFFICall = 0.0) will result in 0.0==Nan due to stack overflow. primitive which execute special send #= will incorrectly return false...
Don't tell me to not use = on Floats, this is not the problem, you can replace the test with (self myFFICall < 1.0), you will get (0.0<qNan) -> false all the same.
At this point, I see two possibilities:
- either I totally messed up with calling conventions
- or the FFI glue ffiCallAddressOf is broken
($VM/Squeak-3.10-1/platforms/unix/plugins/SqueakFFIPrims/x86-sysv-asm)
I have no knowledge about IA-32 and don't wish to learn further, using gdb at instruction level was already painfull enough for me. Can somebody aware of x86 and calling convention check my guess?
Nicolas
Any one that can provide light on this subject? Or just get a contact with Ian Piumarta?
I feel a bit alone
Try creating your own mock call with the same prototype that just logs it's arguments. Or place a gdb call inside the called function or mock.
I'd guess that floats work for FFI as it's used for OpenGL in Croquet.
I haven't looked at floating point calling conventions so can't help more.
Bryce