aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/ext_ffi_semantics.html20
-rw-r--r--src/lj_cconv.c5
-rw-r--r--src/lj_crecord.c9
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> &rarr;</td><td class="convout"><tt>(void *)</tt></td></tr> 290<td class="convin">nil</td><td class="convop"><tt>NULL</tt> &rarr;</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 &rarr;</td><td class="convout"><tt>(void *)</tt></td></tr>
293<tr class="odd">
294<td class="convin">lightuserdata</td><td class="convop">lightuserdata address &rarr;</td><td class="convout"><tt>(void *)</tt></td></tr> 292<td class="convin">lightuserdata</td><td class="convop">lightuserdata address &rarr;</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 &rarr;</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 &rarr;</td><td class="convout"><tt>const char[]</tt></td></tr> 296<td class="convin">io.* file</td><td class="convop">get FILE * handle &rarr;</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> &rarr;</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 &rarr;</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> &rarr;</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 &rarr;</td><td class="convout">C type</td></tr> 310<td class="convin">cdata</td><td class="convop">cdata payload &rarr;</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);