aboutsummaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorMike Pall <mike>2025-11-27 17:45:17 +0100
committerMike Pall <mike>2025-11-27 17:45:17 +0100
commitf80b349d5490aa289b2925d297f3f3c618977570 (patch)
tree8d8fb0d2beb3e863592139d603ada63e5aa6ce77 /doc
parent3215838aa744d148e79a8ea0bd7c014e984302cb (diff)
downloadluajit-f80b349d5490aa289b2925d297f3f3c618977570.tar.gz
luajit-f80b349d5490aa289b2925d297f3f3c618977570.tar.bz2
luajit-f80b349d5490aa289b2925d297f3f3c618977570.zip
Unify Lua number to FFI integer conversions.
Phew. #1411
Diffstat (limited to 'doc')
-rw-r--r--doc/ext_ffi_semantics.html56
1 files changed, 38 insertions, 18 deletions
diff --git a/doc/ext_ffi_semantics.html b/doc/ext_ffi_semantics.html
index cd533e8c..cd72da21 100644
--- a/doc/ext_ffi_semantics.html
+++ b/doc/ext_ffi_semantics.html
@@ -338,42 +338,44 @@ pointer or type compatibility:
338<tr class="odd"> 338<tr class="odd">
339<td class="convin">Integer</td><td class="convop">&rarr;<sup>round</sup></td><td class="convout"><tt>double</tt>, <tt>float</tt></td></tr> 339<td class="convin">Integer</td><td class="convop">&rarr;<sup>round</sup></td><td class="convout"><tt>double</tt>, <tt>float</tt></td></tr>
340<tr class="even"> 340<tr class="even">
341<td class="convin"><tt>double</tt>, <tt>float</tt></td><td class="convop">&rarr;<sup>trunc</sup> <tt>int32_t</tt> &rarr;<sup>narrow</sup></td><td class="convout"><tt>(u)int8_t</tt>, <tt>(u)int16_t</tt></td></tr> 341<td class="convin"><tt>double</tt>, <tt>float</tt></td><td class="convop">&rarr;<sup>trunc</sup> <tt>int64_t</tt> &rarr;<sup>narrow</sup> <sup>*</sup></td><td class="convout"><tt>(u)int8_t</tt>, <tt>(u)int16_t</tt>, <tt>(u)int32_t</tt></td></tr>
342<tr class="odd"> 342<tr class="odd">
343<td class="convin"><tt>double</tt>, <tt>float</tt></td><td class="convop">&rarr;<sup>trunc</sup></td><td class="convout"><tt>(u)int32_t</tt>, <tt>(u)int64_t</tt></td></tr> 343<td class="convin"><tt>double</tt>, <tt>float</tt></td><td class="convop">&rarr;<sup>trunc</sup></td><td class="convout"><tt>int64_t</tt></td></tr>
344<tr class="even"> 344<tr class="even">
345<td class="convin"><tt>double</tt>, <tt>float</tt></td><td class="convop">&rarr;<sup>trunc</sup> uint64_t &cup; int64_t &rarr;<sup>reinterpret</sup> <sup>*</sup></td><td class="convout"><tt>uint64_t</tt></td></tr>
346<tr class="odd">
345<td class="convin"><tt>double</tt>, <tt>float</tt></td><td class="convop">&rarr;<sup>round</sup></td><td class="convout"><tt>float</tt>, <tt>double</tt></td></tr> 347<td class="convin"><tt>double</tt>, <tt>float</tt></td><td class="convop">&rarr;<sup>round</sup></td><td class="convout"><tt>float</tt>, <tt>double</tt></td></tr>
346<tr class="odd separate"> 348<tr class="even separate">
347<td class="convin">Number</td><td class="convop">n == 0 &rarr; 0, otherwise 1</td><td class="convout"><tt>bool</tt></td></tr> 349<td class="convin">Number</td><td class="convop">n == 0 &rarr; 0, otherwise 1</td><td class="convout"><tt>bool</tt></td></tr>
348<tr class="even"> 350<tr class="odd">
349<td class="convin"><tt>bool</tt></td><td class="convop"><tt>false</tt> &rarr; 0, <tt>true</tt> &rarr; 1</td><td class="convout">Number</td></tr> 351<td class="convin"><tt>bool</tt></td><td class="convop"><tt>false</tt> &rarr; 0, <tt>true</tt> &rarr; 1</td><td class="convout">Number</td></tr>
350<tr class="odd separate"> 352<tr class="even separate">
351<td class="convin">Complex number</td><td class="convop">convert real part</td><td class="convout">Number</td></tr> 353<td class="convin">Complex number</td><td class="convop">convert real part</td><td class="convout">Number</td></tr>
352<tr class="even">
353<td class="convin">Number</td><td class="convop">convert real part, imag = 0</td><td class="convout">Complex number</td></tr>
354<tr class="odd"> 354<tr class="odd">
355<td class="convin">Number</td><td class="convop">convert real part, imag = 0</td><td class="convout">Complex number</td></tr>
356<tr class="even">
355<td class="convin">Complex number</td><td class="convop">convert real and imag part</td><td class="convout">Complex number</td></tr> 357<td class="convin">Complex number</td><td class="convop">convert real and imag part</td><td class="convout">Complex number</td></tr>
356<tr class="even separate"> 358<tr class="odd separate">
357<td class="convin">Number</td><td class="convop">convert scalar and replicate</td><td class="convout">Vector</td></tr> 359<td class="convin">Number</td><td class="convop">convert scalar and replicate</td><td class="convout">Vector</td></tr>
358<tr class="odd"> 360<tr class="even">
359<td class="convin">Vector</td><td class="convop">copy (same size)</td><td class="convout">Vector</td></tr> 361<td class="convin">Vector</td><td class="convop">copy (same size)</td><td class="convout">Vector</td></tr>
360<tr class="even separate"> 362<tr class="odd separate">
361<td class="convin"><tt>struct</tt>/<tt>union</tt></td><td class="convop">take base address (compat)</td><td class="convout">Pointer</td></tr> 363<td class="convin"><tt>struct</tt>/<tt>union</tt></td><td class="convop">take base address (compat)</td><td class="convout">Pointer</td></tr>
362<tr class="odd">
363<td class="convin">Array</td><td class="convop">take base address (compat)</td><td class="convout">Pointer</td></tr>
364<tr class="even"> 364<tr class="even">
365<td class="convin">Array</td><td class="convop">take base address (compat)</td><td class="convout">Pointer</td></tr>
366<tr class="odd">
365<td class="convin">Function</td><td class="convop">take function address</td><td class="convout">Function pointer</td></tr> 367<td class="convin">Function</td><td class="convop">take function address</td><td class="convout">Function pointer</td></tr>
366<tr class="odd separate"> 368<tr class="even separate">
367<td class="convin">Number</td><td class="convop">convert via <tt>uintptr_t</tt> (cast)</td><td class="convout">Pointer</td></tr> 369<td class="convin">Number</td><td class="convop">convert via <tt>uintptr_t</tt> (cast)</td><td class="convout">Pointer</td></tr>
368<tr class="even">
369<td class="convin">Pointer</td><td class="convop">convert address (compat/cast)</td><td class="convout">Pointer</td></tr>
370<tr class="odd"> 370<tr class="odd">
371<td class="convin">Pointer</td><td class="convop">convert address (cast)</td><td class="convout">Integer</td></tr> 371<td class="convin">Pointer</td><td class="convop">convert address (compat/cast)</td><td class="convout">Pointer</td></tr>
372<tr class="even"> 372<tr class="even">
373<td class="convin">Pointer</td><td class="convop">convert address (cast)</td><td class="convout">Integer</td></tr>
374<tr class="odd">
373<td class="convin">Array</td><td class="convop">convert base address (cast)</td><td class="convout">Integer</td></tr> 375<td class="convin">Array</td><td class="convop">convert base address (cast)</td><td class="convout">Integer</td></tr>
374<tr class="odd separate"> 376<tr class="even separate">
375<td class="convin">Array</td><td class="convop">copy (compat)</td><td class="convout">Array</td></tr> 377<td class="convin">Array</td><td class="convop">copy (compat)</td><td class="convout">Array</td></tr>
376<tr class="even"> 378<tr class="odd">
377<td class="convin"><tt>struct</tt>/<tt>union</tt></td><td class="convop">copy (identical type)</td><td class="convout"><tt>struct</tt>/<tt>union</tt></td></tr> 379<td class="convin"><tt>struct</tt>/<tt>union</tt></td><td class="convop">copy (identical type)</td><td class="convout"><tt>struct</tt>/<tt>union</tt></td></tr>
378</table> 380</table>
379<p> 381<p>
@@ -384,6 +386,24 @@ type.
384Conversions not listed above will raise an error. E.g. it's not 386Conversions not listed above will raise an error. E.g. it's not
385possible to convert a pointer to a complex number or vice versa. 387possible to convert a pointer to a complex number or vice versa.
386</p> 388</p>
389<p>
390* Some conversions from <tt>double</tt> have a larger defined range to
391allow for mixed-signedness conversions, which are common in C code.
392E.g. initializing an <tt>int32_t</tt> field with <tt>0xffffffff</tt>
393or initializing an <tt>uint32_t</tt> or <tt>uint64_t</tt> field with
394<tt>-1</tt>. Under strict conversion rules, these assignments would
395give undefined results, since Lua numbers are doubles. The extended
396ranges make these conversions defined. Lua numbers that are even
397outside that range give an architecture-specific result.
398</p>
399<p>
400Please note that doubles do not have the precision to represent the
401whole signed or unsigned 64 bit integer range. Beware of large hex
402constants in particular: e.g. <tt>0xffffffffffffffff</tt> is a double
403rounded up to <tt>0x1p64</tt> during parsing. This will <em>not</em>
404convert to a defined 64 bit integer value. Use the 64 bit literal
405syntax instead, i.e. <tt>0xffffffffffffffffULL</tt>.
406</p>
387 407
388<h3 id="convert_vararg">Conversions for vararg C&nbsp;function arguments</h3> 408<h3 id="convert_vararg">Conversions for vararg C&nbsp;function arguments</h3>
389<p> 409<p>