aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lj_ffrecord.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c
index 067f66cf..6cdd79a9 100644
--- a/src/lj_ffrecord.c
+++ b/src/lj_ffrecord.c
@@ -297,15 +297,17 @@ static int recff_metacall(jit_State *J, RecordFFData *rd, MMS mm)
297 copyTV(J->L, &ix.tabv, &rd->argv[0]); 297 copyTV(J->L, &ix.tabv, &rd->argv[0]);
298 if (lj_record_mm_lookup(J, &ix, mm)) { /* Has metamethod? */ 298 if (lj_record_mm_lookup(J, &ix, mm)) { /* Has metamethod? */
299 int errcode; 299 int errcode;
300 TValue argv0;
300 /* Temporarily insert metamethod below object. */ 301 /* Temporarily insert metamethod below object. */
301 J->base[1] = J->base[0]; 302 J->base[1] = J->base[0];
302 J->base[0] = ix.mobj; 303 J->base[0] = ix.mobj;
304 copyTV(J->L, &argv0, &rd->argv[0]);
303 copyTV(J->L, &rd->argv[1], &rd->argv[0]); 305 copyTV(J->L, &rd->argv[1], &rd->argv[0]);
304 copyTV(J->L, &rd->argv[0], &ix.mobjv); 306 copyTV(J->L, &rd->argv[0], &ix.mobjv);
305 /* Need to protect lj_record_tailcall because it may throw. */ 307 /* Need to protect lj_record_tailcall because it may throw. */
306 errcode = lj_vm_cpcall(J->L, NULL, J, recff_metacall_cp); 308 errcode = lj_vm_cpcall(J->L, NULL, J, recff_metacall_cp);
307 /* Always undo Lua stack changes to avoid confusing the interpreter. */ 309 /* Always undo Lua stack changes to avoid confusing the interpreter. */
308 copyTV(J->L, &rd->argv[0], &rd->argv[1]); 310 copyTV(J->L, &rd->argv[0], &argv0);
309 if (errcode) 311 if (errcode)
310 lj_err_throw(J->L, errcode); /* Propagate errors. */ 312 lj_err_throw(J->L, errcode); /* Propagate errors. */
311 rd->nres = -1; /* Pending call. */ 313 rd->nres = -1; /* Pending call. */