mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-07 23:24:09 +00:00
Avoid phantom stores to proxy tables.
This commit is contained in:
parent
efcaef22bd
commit
a1f66abe4e
@ -101,7 +101,7 @@ cTValue *lj_meta_tget(lua_State *L, cTValue *o, cTValue *k)
|
|||||||
int loop;
|
int loop;
|
||||||
for (loop = 0; loop < LJ_MAX_IDXCHAIN; loop++) {
|
for (loop = 0; loop < LJ_MAX_IDXCHAIN; loop++) {
|
||||||
cTValue *mo;
|
cTValue *mo;
|
||||||
if (tvistab(o)) {
|
if (LJ_LIKELY(tvistab(o))) {
|
||||||
GCtab *t = tabV(o);
|
GCtab *t = tabV(o);
|
||||||
cTValue *tv = lj_tab_get(L, t, k);
|
cTValue *tv = lj_tab_get(L, t, k);
|
||||||
if (!tvisnil(tv) ||
|
if (!tvisnil(tv) ||
|
||||||
@ -128,13 +128,22 @@ TValue *lj_meta_tset(lua_State *L, cTValue *o, cTValue *k)
|
|||||||
int loop;
|
int loop;
|
||||||
for (loop = 0; loop < LJ_MAX_IDXCHAIN; loop++) {
|
for (loop = 0; loop < LJ_MAX_IDXCHAIN; loop++) {
|
||||||
cTValue *mo;
|
cTValue *mo;
|
||||||
if (tvistab(o)) {
|
if (LJ_LIKELY(tvistab(o))) {
|
||||||
GCtab *t = tabV(o);
|
GCtab *t = tabV(o);
|
||||||
TValue *tv = lj_tab_set(L, t, k);
|
cTValue *tv = lj_tab_get(L, t, k);
|
||||||
if (!tvisnil(tv) ||
|
if (LJ_LIKELY(!tvisnil(tv))) {
|
||||||
!(mo = lj_meta_fast(L, tabref(t->metatable), MM_newindex))) {
|
t->nomm = 0; /* Invalidate negative metamethod cache. */
|
||||||
lj_gc_anybarriert(L, t);
|
lj_gc_anybarriert(L, t);
|
||||||
return tv;
|
return (TValue *)tv;
|
||||||
|
} else if (!(mo = lj_meta_fast(L, tabref(t->metatable), MM_newindex))) {
|
||||||
|
t->nomm = 0; /* Invalidate negative metamethod cache. */
|
||||||
|
lj_gc_anybarriert(L, t);
|
||||||
|
if (tv != niltv(L))
|
||||||
|
return (TValue *)tv;
|
||||||
|
if (tvisnil(k)) lj_err_msg(L, LJ_ERR_NILIDX);
|
||||||
|
else if (tvisint(k)) { setnumV(&tmp, (lua_Number)intV(k)); k = &tmp; }
|
||||||
|
else if (tvisnum(k) && tvisnan(k)) lj_err_msg(L, LJ_ERR_NANIDX);
|
||||||
|
return lj_tab_newkey(L, t, k);
|
||||||
}
|
}
|
||||||
} else if (tvisnil(mo = lj_meta_lookup(L, o, MM_newindex))) {
|
} else if (tvisnil(mo = lj_meta_lookup(L, o, MM_newindex))) {
|
||||||
lj_err_optype(L, o, LJ_ERR_OPINDEX);
|
lj_err_optype(L, o, LJ_ERR_OPINDEX);
|
||||||
|
Loading…
Reference in New Issue
Block a user