diff options
| author | Mike Pall <mike> | 2025-11-27 17:45:17 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2025-11-27 17:45:17 +0100 |
| commit | f80b349d5490aa289b2925d297f3f3c618977570 (patch) | |
| tree | 8d8fb0d2beb3e863592139d603ada63e5aa6ce77 /doc | |
| parent | 3215838aa744d148e79a8ea0bd7c014e984302cb (diff) | |
| download | luajit-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.html | 56 |
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">→<sup>round</sup></td><td class="convout"><tt>double</tt>, <tt>float</tt></td></tr> | 339 | <td class="convin">Integer</td><td class="convop">→<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">→<sup>trunc</sup> <tt>int32_t</tt> →<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">→<sup>trunc</sup> <tt>int64_t</tt> →<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">→<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">→<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">→<sup>trunc</sup> uint64_t ∪ int64_t →<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">→<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">→<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 → 0, otherwise 1</td><td class="convout"><tt>bool</tt></td></tr> | 349 | <td class="convin">Number</td><td class="convop">n == 0 → 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> → 0, <tt>true</tt> → 1</td><td class="convout">Number</td></tr> | 351 | <td class="convin"><tt>bool</tt></td><td class="convop"><tt>false</tt> → 0, <tt>true</tt> → 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. | |||
| 384 | Conversions not listed above will raise an error. E.g. it's not | 386 | Conversions not listed above will raise an error. E.g. it's not |
| 385 | possible to convert a pointer to a complex number or vice versa. | 387 | possible 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 | ||
| 391 | allow for mixed-signedness conversions, which are common in C code. | ||
| 392 | E.g. initializing an <tt>int32_t</tt> field with <tt>0xffffffff</tt> | ||
| 393 | or initializing an <tt>uint32_t</tt> or <tt>uint64_t</tt> field with | ||
| 394 | <tt>-1</tt>. Under strict conversion rules, these assignments would | ||
| 395 | give undefined results, since Lua numbers are doubles. The extended | ||
| 396 | ranges make these conversions defined. Lua numbers that are even | ||
| 397 | outside that range give an architecture-specific result. | ||
| 398 | </p> | ||
| 399 | <p> | ||
| 400 | Please note that doubles do not have the precision to represent the | ||
| 401 | whole signed or unsigned 64 bit integer range. Beware of large hex | ||
| 402 | constants in particular: e.g. <tt>0xffffffffffffffff</tt> is a double | ||
| 403 | rounded up to <tt>0x1p64</tt> during parsing. This will <em>not</em> | ||
| 404 | convert to a defined 64 bit integer value. Use the 64 bit literal | ||
| 405 | syntax instead, i.e. <tt>0xffffffffffffffffULL</tt>. | ||
| 406 | </p> | ||
| 387 | 407 | ||
| 388 | <h3 id="convert_vararg">Conversions for vararg C function arguments</h3> | 408 | <h3 id="convert_vararg">Conversions for vararg C function arguments</h3> |
| 389 | <p> | 409 | <p> |
