mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-07 15:14:08 +00:00
FFI: Convert io.* file handle to FILE * pointer (but as a void *).
This commit is contained in:
parent
97b7edb206
commit
fa2572da6c
@ -289,22 +289,24 @@ arguments to C calls:
|
|||||||
<tr class="odd separate">
|
<tr class="odd separate">
|
||||||
<td class="convin">nil</td><td class="convop"><tt>NULL</tt> →</td><td class="convout"><tt>(void *)</tt></td></tr>
|
<td class="convin">nil</td><td class="convop"><tt>NULL</tt> →</td><td class="convout"><tt>(void *)</tt></td></tr>
|
||||||
<tr class="even">
|
<tr class="even">
|
||||||
<td class="convin">userdata</td><td class="convop">userdata payload →</td><td class="convout"><tt>(void *)</tt></td></tr>
|
|
||||||
<tr class="odd">
|
|
||||||
<td class="convin">lightuserdata</td><td class="convop">lightuserdata address →</td><td class="convout"><tt>(void *)</tt></td></tr>
|
<td class="convin">lightuserdata</td><td class="convop">lightuserdata address →</td><td class="convout"><tt>(void *)</tt></td></tr>
|
||||||
<tr class="even separate">
|
|
||||||
<td class="convin">string</td><td class="convop">match against <tt>enum</tt> constant</td><td class="convout"><tt>enum</tt></td></tr>
|
|
||||||
<tr class="odd">
|
<tr class="odd">
|
||||||
<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>
|
<td class="convin">userdata</td><td class="convop">userdata payload →</td><td class="convout"><tt>(void *)</tt></td></tr>
|
||||||
<tr class="even">
|
<tr class="even">
|
||||||
<td class="convin">string</td><td class="convop">string data →</td><td class="convout"><tt>const char[]</tt></td></tr>
|
<td class="convin">io.* file</td><td class="convop">get FILE * handle →</td><td class="convout"><tt>(void *)</tt></td></tr>
|
||||||
<tr class="odd separate">
|
<tr class="odd separate">
|
||||||
<td class="convin">function</td><td class="convop"><a href="#callback">create callback</a> →</td><td class="convout">C function type</td></tr>
|
<td class="convin">string</td><td class="convop">match against <tt>enum</tt> constant</td><td class="convout"><tt>enum</tt></td></tr>
|
||||||
<tr class="even separate">
|
<tr class="even">
|
||||||
<td class="convin">table</td><td class="convop"><a href="#init_table">table initializer</a></td><td class="convout">Array</td></tr>
|
<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>
|
||||||
<tr class="odd">
|
<tr class="odd">
|
||||||
<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>
|
<td class="convin">string</td><td class="convop">string data →</td><td class="convout"><tt>const char[]</tt></td></tr>
|
||||||
<tr class="even separate">
|
<tr class="even separate">
|
||||||
|
<td class="convin">function</td><td class="convop"><a href="#callback">create callback</a> →</td><td class="convout">C function type</td></tr>
|
||||||
|
<tr class="odd separate">
|
||||||
|
<td class="convin">table</td><td class="convop"><a href="#init_table">table initializer</a></td><td class="convout">Array</td></tr>
|
||||||
|
<tr class="even">
|
||||||
|
<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>
|
||||||
|
<tr class="odd separate">
|
||||||
<td class="convin">cdata</td><td class="convop">cdata payload →</td><td class="convout">C type</td></tr>
|
<td class="convin">cdata</td><td class="convop">cdata payload →</td><td class="convout">C type</td></tr>
|
||||||
</table>
|
</table>
|
||||||
<p>
|
<p>
|
||||||
|
@ -603,7 +603,10 @@ void lj_cconv_ct_tv(CTState *cts, CType *d,
|
|||||||
tmpptr = (void *)0;
|
tmpptr = (void *)0;
|
||||||
flags |= CCF_FROMTV;
|
flags |= CCF_FROMTV;
|
||||||
} else if (tvisudata(o)) {
|
} else if (tvisudata(o)) {
|
||||||
tmpptr = uddata(udataV(o));
|
GCudata *ud = udataV(o);
|
||||||
|
tmpptr = uddata(ud);
|
||||||
|
if (ud->udtype == UDTYPE_IO_FILE)
|
||||||
|
tmpptr = *(void **)tmpptr;
|
||||||
} else if (tvislightud(o)) {
|
} else if (tvislightud(o)) {
|
||||||
tmpptr = lightudV(o);
|
tmpptr = lightudV(o);
|
||||||
} else if (tvisfunc(o)) {
|
} else if (tvisfunc(o)) {
|
||||||
|
@ -385,7 +385,14 @@ static TRef crec_ct_tv(jit_State *J, CType *d, TRef dp, TRef sp, cTValue *sval)
|
|||||||
} else if (tref_isnil(sp)) {
|
} else if (tref_isnil(sp)) {
|
||||||
sp = lj_ir_kptr(J, NULL);
|
sp = lj_ir_kptr(J, NULL);
|
||||||
} else if (tref_isudata(sp)) {
|
} else if (tref_isudata(sp)) {
|
||||||
sp = emitir(IRT(IR_ADD, IRT_P32), sp, lj_ir_kint(J, sizeof(GCudata)));
|
GCudata *ud = udataV(sval);
|
||||||
|
if (ud->udtype == UDTYPE_IO_FILE) {
|
||||||
|
TRef tr = emitir(IRT(IR_FLOAD, IRT_U8), sp, IRFL_UDATA_UDTYPE);
|
||||||
|
emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, UDTYPE_IO_FILE));
|
||||||
|
sp = emitir(IRT(IR_FLOAD, IRT_PTR), sp, IRFL_UDATA_FILE);
|
||||||
|
} else {
|
||||||
|
sp = emitir(IRT(IR_ADD, IRT_P32), sp, lj_ir_kint(J, sizeof(GCudata)));
|
||||||
|
}
|
||||||
} else if (tref_isstr(sp)) {
|
} else if (tref_isstr(sp)) {
|
||||||
if (ctype_isenum(d->info)) { /* Match string against enum constant. */
|
if (ctype_isenum(d->info)) { /* Match string against enum constant. */
|
||||||
GCstr *str = strV(sval);
|
GCstr *str = strV(sval);
|
||||||
|
Loading…
Reference in New Issue
Block a user