[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: LuaJIT FFI: Semantics of undefined numeric conversions (e.g. huge double to int)
 
- From: Philipp Kutin <p@...>
 
- Date: Mon, 19 Sep 2011 00:01:20 +0200
 
Hi,
I'm one of the developers/maintainers of a certain (open source) game 
port and one of our upcoming ideas is to replace the existing scripting 
language with something based on Lua; more specifically LuaJIT because 
of its efficiency and the fact that we mostly target x86/x64 anyway.
From reading the documentation, it looks like LuaJIT's FFI is the 
perfect tool for making engine and game functions/structures accessible 
from the scripting language, where of course only "safe" functions 
should be made visible directly (for example, those taking only scalar 
numbers). But as far as I can see, the FFI docs don't specify what 
happens for numeric conversions that are undefined per C standard, such 
as downcasting a number greater than INT_MAX to an int.
A few experiments with the following C function
    void printint(int x) { printf("%d\n",x); }
give these results from LuaJIT for me:
    printint(2147483648+1)  --> -2147483648
    printint(4*2147483648)  --> -2147483648
    printint(-2147483648-1)  --> -2147483648
    printint(0/0)  --> -2147483648
    printint(1/0)  --> -2147483648
So, in every "interesting" case, the out-of-range double is apparently 
converted to INT_MIN, but can I rely on this or is this a coincidental 
side-effect of the implementation?
The closest thing to an answer I could find is the "Conversion between C 
types" section in the FFI documentation:
http://luajit.org/ext_ffi_semantics.html#convert_between ,
but again I'm not sure what to make of the undefined cases here. For 
example, the double to int conversion is listed as
    double -->^trunc int,
but what is "truncation" supposed to mean in this particular context? It 
can't conceptually mean "round the double to an infinite-precision 
integer and take its 32 lowest-order bits", since it would be undefined 
for inf/nan and it's inconsistent with my experimental findings.
Greetings,
Philipp