diff options
| author | Mike Pall <mike> | 2012-05-29 12:08:21 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2012-05-29 12:09:18 +0200 |
| commit | fa2572da6c45a6dc18cec8cf9ecc80869b6ac04e (patch) | |
| tree | 675141759c1780ca0b4432e3afdfef2748f4bc2e | |
| parent | 97b7edb206830d661e1eab30b40bffed93e9569e (diff) | |
| download | luajit-fa2572da6c45a6dc18cec8cf9ecc80869b6ac04e.tar.gz luajit-fa2572da6c45a6dc18cec8cf9ecc80869b6ac04e.tar.bz2 luajit-fa2572da6c45a6dc18cec8cf9ecc80869b6ac04e.zip | |
FFI: Convert io.* file handle to FILE * pointer (but as a void *).
| -rw-r--r-- | doc/ext_ffi_semantics.html | 20 | ||||
| -rw-r--r-- | src/lj_cconv.c | 5 | ||||
| -rw-r--r-- | src/lj_crecord.c | 9 |
3 files changed, 23 insertions, 11 deletions
diff --git a/doc/ext_ffi_semantics.html b/doc/ext_ffi_semantics.html index 304befa7..72b46597 100644 --- a/doc/ext_ffi_semantics.html +++ b/doc/ext_ffi_semantics.html | |||
| @@ -289,22 +289,24 @@ arguments to C calls: | |||
| 289 | <tr class="odd separate"> | 289 | <tr class="odd separate"> |
| 290 | <td class="convin">nil</td><td class="convop"><tt>NULL</tt> →</td><td class="convout"><tt>(void *)</tt></td></tr> | 290 | <td class="convin">nil</td><td class="convop"><tt>NULL</tt> →</td><td class="convout"><tt>(void *)</tt></td></tr> |
| 291 | <tr class="even"> | 291 | <tr class="even"> |
| 292 | <td class="convin">userdata</td><td class="convop">userdata payload →</td><td class="convout"><tt>(void *)</tt></td></tr> | ||
| 293 | <tr class="odd"> | ||
| 294 | <td class="convin">lightuserdata</td><td class="convop">lightuserdata address →</td><td class="convout"><tt>(void *)</tt></td></tr> | 292 | <td class="convin">lightuserdata</td><td class="convop">lightuserdata address →</td><td class="convout"><tt>(void *)</tt></td></tr> |
| 295 | <tr class="even separate"> | ||
| 296 | <td class="convin">string</td><td class="convop">match against <tt>enum</tt> constant</td><td class="convout"><tt>enum</tt></td></tr> | ||
| 297 | <tr class="odd"> | 293 | <tr class="odd"> |
| 298 | <td class="convin">string</td><td class="convop">copy string data + zero-byte</td><td class="convout"><tt>int8_t[]</tt>, <tt>uint8_t[]</tt></td></tr> | 294 | <td class="convin">userdata</td><td class="convop">userdata payload →</td><td class="convout"><tt>(void *)</tt></td></tr> |
| 299 | <tr class="even"> | 295 | <tr class="even"> |
| 300 | <td class="convin">string</td><td class="convop">string data →</td><td class="convout"><tt>const char[]</tt></td></tr> | 296 | <td class="convin">io.* file</td><td class="convop">get FILE * handle →</td><td class="convout"><tt>(void *)</tt></td></tr> |
| 301 | <tr class="odd separate"> | 297 | <tr class="odd separate"> |
| 302 | <td class="convin">function</td><td class="convop"><a href="#callback">create callback</a> →</td><td class="convout">C function type</td></tr> | 298 | <td class="convin">string</td><td class="convop">match against <tt>enum</tt> constant</td><td class="convout"><tt>enum</tt></td></tr> |
| 299 | <tr class="even"> | ||
| 300 | <td class="convin">string</td><td class="convop">copy string data + zero-byte</td><td class="convout"><tt>int8_t[]</tt>, <tt>uint8_t[]</tt></td></tr> | ||
| 301 | <tr class="odd"> | ||
| 302 | <td class="convin">string</td><td class="convop">string data →</td><td class="convout"><tt>const char[]</tt></td></tr> | ||
| 303 | <tr class="even separate"> | 303 | <tr class="even separate"> |
| 304 | <td class="convin">function</td><td class="convop"><a href="#callback">create callback</a> →</td><td class="convout">C function type</td></tr> | ||
| 305 | <tr class="odd separate"> | ||
| 304 | <td class="convin">table</td><td class="convop"><a href="#init_table">table initializer</a></td><td class="convout">Array</td></tr> | 306 | <td class="convin">table</td><td class="convop"><a href="#init_table">table initializer</a></td><td class="convout">Array</td></tr> |
| 305 | <tr class="odd"> | 307 | <tr class="even"> |
| 306 | <td class="convin">table</td><td class="convop"><a href="#init_table">table initializer</a></td><td class="convout"><tt>struct</tt>/<tt>union</tt></td></tr> | 308 | <td class="convin">table</td><td class="convop"><a href="#init_table">table initializer</a></td><td class="convout"><tt>struct</tt>/<tt>union</tt></td></tr> |
| 307 | <tr class="even separate"> | 309 | <tr class="odd separate"> |
| 308 | <td class="convin">cdata</td><td class="convop">cdata payload →</td><td class="convout">C type</td></tr> | 310 | <td class="convin">cdata</td><td class="convop">cdata payload →</td><td class="convout">C type</td></tr> |
| 309 | </table> | 311 | </table> |
| 310 | <p> | 312 | <p> |
diff --git a/src/lj_cconv.c b/src/lj_cconv.c index 240a8d10..b09c0abe 100644 --- a/src/lj_cconv.c +++ b/src/lj_cconv.c | |||
| @@ -603,7 +603,10 @@ void lj_cconv_ct_tv(CTState *cts, CType *d, | |||
| 603 | tmpptr = (void *)0; | 603 | tmpptr = (void *)0; |
| 604 | flags |= CCF_FROMTV; | 604 | flags |= CCF_FROMTV; |
| 605 | } else if (tvisudata(o)) { | 605 | } else if (tvisudata(o)) { |
| 606 | tmpptr = uddata(udataV(o)); | 606 | GCudata *ud = udataV(o); |
| 607 | tmpptr = uddata(ud); | ||
| 608 | if (ud->udtype == UDTYPE_IO_FILE) | ||
| 609 | tmpptr = *(void **)tmpptr; | ||
| 607 | } else if (tvislightud(o)) { | 610 | } else if (tvislightud(o)) { |
| 608 | tmpptr = lightudV(o); | 611 | tmpptr = lightudV(o); |
| 609 | } else if (tvisfunc(o)) { | 612 | } else if (tvisfunc(o)) { |
diff --git a/src/lj_crecord.c b/src/lj_crecord.c index 74d62d6c..268800e4 100644 --- a/src/lj_crecord.c +++ b/src/lj_crecord.c | |||
| @@ -385,7 +385,14 @@ static TRef crec_ct_tv(jit_State *J, CType *d, TRef dp, TRef sp, cTValue *sval) | |||
| 385 | } else if (tref_isnil(sp)) { | 385 | } else if (tref_isnil(sp)) { |
| 386 | sp = lj_ir_kptr(J, NULL); | 386 | sp = lj_ir_kptr(J, NULL); |
| 387 | } else if (tref_isudata(sp)) { | 387 | } else if (tref_isudata(sp)) { |
| 388 | sp = emitir(IRT(IR_ADD, IRT_P32), sp, lj_ir_kint(J, sizeof(GCudata))); | 388 | GCudata *ud = udataV(sval); |
| 389 | if (ud->udtype == UDTYPE_IO_FILE) { | ||
| 390 | TRef tr = emitir(IRT(IR_FLOAD, IRT_U8), sp, IRFL_UDATA_UDTYPE); | ||
| 391 | emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, UDTYPE_IO_FILE)); | ||
| 392 | sp = emitir(IRT(IR_FLOAD, IRT_PTR), sp, IRFL_UDATA_FILE); | ||
| 393 | } else { | ||
| 394 | sp = emitir(IRT(IR_ADD, IRT_P32), sp, lj_ir_kint(J, sizeof(GCudata))); | ||
| 395 | } | ||
| 389 | } else if (tref_isstr(sp)) { | 396 | } else if (tref_isstr(sp)) { |
| 390 | if (ctype_isenum(d->info)) { /* Match string against enum constant. */ | 397 | if (ctype_isenum(d->info)) { /* Match string against enum constant. */ |
| 391 | GCstr *str = strV(sval); | 398 | GCstr *str = strV(sval); |
