Flush all traces when debug.set(local|upvalue) are used, as they might mutate upvalues which have PROTO_UV_IMMUTABLE set.

This commit is contained in:
Peter Cawley 2015-08-19 00:06:02 +01:00
parent a5b1c4d98e
commit 2d7b461900
2 changed files with 12 additions and 1 deletions

View File

@ -1018,6 +1018,10 @@ LUA_API const char *lua_setupvalue(lua_State *L, int idx, int n)
api_checknelems(L, 1);
name = lj_debug_uvnamev(f, (uint32_t)(n-1), &val);
if (name) {
/* Flush cache, as the upvalue might have PROTO_UV_IMMUTABLE set, which
doesn't take the debug library into account. But not during __gc. */
if (lj_trace_flushall(L))
lj_err_caller(L, LJ_ERR_NOGCMM);
L->top--;
copyTV(L, val, L->top);
lj_gc_barrier(L, funcV(f), L->top);

View File

@ -13,6 +13,7 @@
#include "lj_tab.h"
#include "lj_state.h"
#include "lj_frame.h"
#include "lj_trace.h"
#include "lj_bc.h"
#include "lj_vm.h"
#if LJ_HASJIT
@ -426,8 +427,14 @@ LUA_API const char *lua_setlocal(lua_State *L, const lua_Debug *ar, int n)
{
const char *name = NULL;
TValue *o = debug_localname(L, ar, &name, (BCReg)n);
if (name)
if (name) {
/* Flush cache, as the local might be aliased by an upvalue with
PROTO_UV_IMMUTABLE set, and said flag doesn't take the debug library
into account. But not during __gc. */
if (lj_trace_flushall(L))
lj_err_caller(L, LJ_ERR_NOGCMM);
copyTV(L, o, L->top-1);
}
L->top--;
return name;
}