From: Mike Pall Date: Wed, 28 Sep 2011 15:29:15 +0000 (+0200) Subject: Avoid overwriting argument with error from metacall recording. X-Git-Tag: v2.0.0-beta9~85 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=76a2a7c857d0aa1dcbfc1cb6928b2faa5e2d33b3;p=thirdparty%2FLuaJIT.git Avoid overwriting argument with error from metacall recording. --- 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) copyTV(J->L, &ix.tabv, &rd->argv[0]); if (lj_record_mm_lookup(J, &ix, mm)) { /* Has metamethod? */ int errcode; + TValue argv0; /* Temporarily insert metamethod below object. */ J->base[1] = J->base[0]; J->base[0] = ix.mobj; + copyTV(J->L, &argv0, &rd->argv[0]); copyTV(J->L, &rd->argv[1], &rd->argv[0]); copyTV(J->L, &rd->argv[0], &ix.mobjv); /* Need to protect lj_record_tailcall because it may throw. */ errcode = lj_vm_cpcall(J->L, NULL, J, recff_metacall_cp); /* Always undo Lua stack changes to avoid confusing the interpreter. */ - copyTV(J->L, &rd->argv[0], &rd->argv[1]); + copyTV(J->L, &rd->argv[0], &argv0); if (errcode) lj_err_throw(J->L, errcode); /* Propagate errors. */ rd->nres = -1; /* Pending call. */