summaryrefslogtreecommitdiff
path: root/src/lj_ffrecord.c
diff options
context:
space:
mode:
authorMike Pall <mike>2012-09-28 17:54:18 +0200
committerMike Pall <mike>2012-09-28 17:54:18 +0200
commit7a6bb9a20836107cd715a818072cbbd1c8eac516 (patch)
treef23c482d298e49a929b66474d2850d8bbc3d12f2 /src/lj_ffrecord.c
parent26841296ab9e5f6d5df1a720e185334d5e84936b (diff)
downloadluajit2-7a6bb9a20836107cd715a818072cbbd1c8eac516.tar.gz
From Lua 5.2: Return file object for io.write() and file:write().
Needs -DLUAJIT_ENABLE_LUA52COMPAT.
Diffstat (limited to 'src/lj_ffrecord.c')
-rw-r--r--src/lj_ffrecord.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c
index 39c3140f..b9e0d8f9 100644
--- a/src/lj_ffrecord.c
+++ b/src/lj_ffrecord.c
@@ -781,7 +781,7 @@ static void LJ_FASTCALL recff_table_insert(jit_State *J, RecordFFData *rd)
/* Get FILE* for I/O function. Any I/O error aborts recording, so there's
** no need to encode the alternate cases for any of the guards.
*/
-static TRef recff_io_fp(jit_State *J, uint32_t id)
+static TRef recff_io_fp(jit_State *J, TRef *udp, int32_t id)
{
TRef tr, ud, fp;
if (id) { /* io.func() */
@@ -794,6 +794,7 @@ static TRef recff_io_fp(jit_State *J, uint32_t id)
tr = emitir(IRT(IR_FLOAD, IRT_U8), ud, IRFL_UDATA_UDTYPE);
emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, UDTYPE_IO_FILE));
}
+ *udp = ud;
fp = emitir(IRT(IR_FLOAD, IRT_PTR), ud, IRFL_UDATA_FILE);
emitir(IRTG(IR_NE, IRT_PTR), fp, lj_ir_knull(J, IRT_PTR));
return fp;
@@ -801,7 +802,7 @@ static TRef recff_io_fp(jit_State *J, uint32_t id)
static void LJ_FASTCALL recff_io_write(jit_State *J, RecordFFData *rd)
{
- TRef fp = recff_io_fp(J, rd->data);
+ TRef ud, fp = recff_io_fp(J, &ud, rd->data);
TRef zero = lj_ir_kint(J, 0);
TRef one = lj_ir_kint(J, 1);
ptrdiff_t i = rd->data == 0 ? 1 : 0;
@@ -820,12 +821,12 @@ static void LJ_FASTCALL recff_io_write(jit_State *J, RecordFFData *rd)
emitir(IRTGI(IR_EQ), tr, len);
}
}
- J->base[0] = TREF_TRUE;
+ J->base[0] = LJ_52 ? ud : TREF_TRUE;
}
static void LJ_FASTCALL recff_io_flush(jit_State *J, RecordFFData *rd)
{
- TRef fp = recff_io_fp(J, rd->data);
+ TRef ud, fp = recff_io_fp(J, &ud, rd->data);
TRef tr = lj_ir_call(J, IRCALL_fflush, fp);
if (results_wanted(J) != 0) /* Check result only if not ignored. */
emitir(IRTGI(IR_EQ), tr, lj_ir_kint(J, 0));