Skip to content

Commit

Permalink
Remove internal __mode = "K" and replace with safe check.
Browse files Browse the repository at this point in the history
  • Loading branch information
Mike Pall committed Mar 8, 2017
1 parent eef77a6 commit 3ab9f5a
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 6 deletions.
2 changes: 1 addition & 1 deletion src/lib_ffi.c
Original file line number Diff line number Diff line change
Expand Up @@ -811,7 +811,7 @@ static GCtab *ffi_finalizer(lua_State *L)
settabV(L, L->top++, t);
setgcref(t->metatable, obj2gco(t));
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));
return t;
}
Expand Down
17 changes: 12 additions & 5 deletions src/lj_gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -168,12 +168,19 @@ static int gc_traverse_tab(global_State *g, GCtab *t)
while ((c = *modestr++)) {
if (c == 'k') weak |= LJ_GC_WEAKKEY;
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. */
t->marked = (uint8_t)((t->marked & ~LJ_GC_WEAK) | weak);
setgcrefr(t->gclist, g->gc.weak);
setgcref(g->gc.weak, obj2gco(t));
if (weak) { /* Weak tables are cleared in the atomic phase. */
#if LJ_HASFFI
CTState *cts = ctype_ctsG(g);
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. */
Expand Down

0 comments on commit 3ab9f5a

Please sign in to comment.