mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-07 23:24:09 +00:00
Remove internal __mode = "K" and replace with safe check.
This commit is contained in:
parent
eef77a6d77
commit
3ab9f5a18d
@ -811,7 +811,7 @@ static GCtab *ffi_finalizer(lua_State *L)
|
|||||||
settabV(L, L->top++, t);
|
settabV(L, L->top++, t);
|
||||||
setgcref(t->metatable, obj2gco(t));
|
setgcref(t->metatable, obj2gco(t));
|
||||||
setstrV(L, lj_tab_setstr(L, t, lj_str_newlit(L, "__mode")),
|
setstrV(L, lj_tab_setstr(L, t, lj_str_newlit(L, "__mode")),
|
||||||
lj_str_newlit(L, "K"));
|
lj_str_newlit(L, "k"));
|
||||||
t->nomm = (uint8_t)(~(1u<<MM_mode));
|
t->nomm = (uint8_t)(~(1u<<MM_mode));
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
17
src/lj_gc.c
17
src/lj_gc.c
@ -168,12 +168,19 @@ static int gc_traverse_tab(global_State *g, GCtab *t)
|
|||||||
while ((c = *modestr++)) {
|
while ((c = *modestr++)) {
|
||||||
if (c == 'k') weak |= LJ_GC_WEAKKEY;
|
if (c == 'k') weak |= LJ_GC_WEAKKEY;
|
||||||
else if (c == 'v') weak |= LJ_GC_WEAKVAL;
|
else if (c == 'v') weak |= LJ_GC_WEAKVAL;
|
||||||
else if (c == 'K') weak = (int)(~0u & ~LJ_GC_WEAKVAL);
|
|
||||||
}
|
}
|
||||||
if (weak > 0) { /* Weak tables are cleared in the atomic phase. */
|
if (weak) { /* Weak tables are cleared in the atomic phase. */
|
||||||
t->marked = (uint8_t)((t->marked & ~LJ_GC_WEAK) | weak);
|
#if LJ_HASFFI
|
||||||
setgcrefr(t->gclist, g->gc.weak);
|
CTState *cts = ctype_ctsG(g);
|
||||||
setgcref(g->gc.weak, obj2gco(t));
|
if (cts && cts->finalizer == t) {
|
||||||
|
weak = (int)(~0u & ~LJ_GC_WEAKVAL);
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
t->marked = (uint8_t)((t->marked & ~LJ_GC_WEAK) | weak);
|
||||||
|
setgcrefr(t->gclist, g->gc.weak);
|
||||||
|
setgcref(g->gc.weak, obj2gco(t));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (weak == LJ_GC_WEAK) /* Nothing to mark if both keys/values are weak. */
|
if (weak == LJ_GC_WEAK) /* Nothing to mark if both keys/values are weak. */
|
||||||
|
Loading…
Reference in New Issue
Block a user