]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Fix write barrier for lua_setupvalue() and debug.setupvalue().
authorMike Pall <mike>
Fri, 20 Mar 2020 12:35:49 +0000 (13:35 +0100)
committerMike Pall <mike>
Fri, 20 Mar 2020 12:35:49 +0000 (13:35 +0100)
src/lj_api.c
src/lj_debug.c
src/lj_debug.h

index e2d7e5337724d00fde447122fc01333b0adc305d..1a34a774e4a13daaa799fd54197ec72ae663573c 100644 (file)
@@ -841,7 +841,8 @@ LUA_API int lua_next(lua_State *L, int idx)
 LUA_API const char *lua_getupvalue(lua_State *L, int idx, int n)
 {
   TValue *val;
-  const char *name = lj_debug_uvnamev(index2adr(L, idx), (uint32_t)(n-1), &val);
+  GCobj *o;
+  const char *name = lj_debug_uvnamev(index2adr(L, idx), (uint32_t)(n-1), &val, &o);
   if (name) {
     copyTV(L, L->top, val);
     incr_top(L);
@@ -1014,13 +1015,14 @@ LUA_API const char *lua_setupvalue(lua_State *L, int idx, int n)
 {
   cTValue *f = index2adr(L, idx);
   TValue *val;
+  GCobj *o;
   const char *name;
   api_checknelems(L, 1);
-  name = lj_debug_uvnamev(f, (uint32_t)(n-1), &val);
+  name = lj_debug_uvnamev(f, (uint32_t)(n-1), &val, &o);
   if (name) {
     L->top--;
     copyTV(L, val, L->top);
-    lj_gc_barrier(L, funcV(f), L->top);
+    lj_gc_barrier(L, o, L->top);
   }
   return name;
 }
index 04fecfafb8b2048d3758fa2a3febe70f38d21063..1d73da7eaf217ba3fbaf685538ea63c29a942fbe 100644 (file)
@@ -235,19 +235,22 @@ const char *lj_debug_uvname(GCproto *pt, uint32_t idx)
 }
 
 /* Get name and value of upvalue. */
-const char *lj_debug_uvnamev(cTValue *o, uint32_t idx, TValue **tvp)
+const char *lj_debug_uvnamev(cTValue *o, uint32_t idx, TValue **tvp, GCobj **op)
 {
   if (tvisfunc(o)) {
     GCfunc *fn = funcV(o);
     if (isluafunc(fn)) {
       GCproto *pt = funcproto(fn);
       if (idx < pt->sizeuv) {
-       *tvp = uvval(&gcref(fn->l.uvptr[idx])->uv);
+       GCobj *uvo = gcref(fn->l.uvptr[idx]);
+       *tvp = uvval(&uvo->uv);
+       *op = uvo;
        return lj_debug_uvname(pt, idx);
       }
     } else {
       if (idx < fn->c.nupvalues) {
        *tvp = &fn->c.upvalue[idx];
+       *op = obj2gco(fn);
        return "";
       }
     }
index 75ea927c5d4106684539b0450de54b9f1b754602..43fb9c195484e21d768201cd6c4c91166ccee7bc 100644 (file)
@@ -29,7 +29,8 @@ typedef struct lj_Debug {
 LJ_FUNC cTValue *lj_debug_frame(lua_State *L, int level, int *size);
 LJ_FUNC BCLine LJ_FASTCALL lj_debug_line(GCproto *pt, BCPos pc);
 LJ_FUNC const char *lj_debug_uvname(GCproto *pt, uint32_t idx);
-LJ_FUNC const char *lj_debug_uvnamev(cTValue *o, uint32_t idx, TValue **tvp);
+LJ_FUNC const char *lj_debug_uvnamev(cTValue *o, uint32_t idx, TValue **tvp,
+                                    GCobj **op);
 LJ_FUNC const char *lj_debug_slotname(GCproto *pt, const BCIns *pc,
                                      BCReg slot, const char **name);
 LJ_FUNC const char *lj_debug_funcname(lua_State *L, TValue *frame,