diff --git a/ltable.c b/ltable.c index 21a54f81..353e567b 100644 --- a/ltable.c +++ b/ltable.c @@ -1001,7 +1001,7 @@ static int rawfinishnodeset (const TValue *slot, TValue *val) { int luaH_psetint (Table *t, lua_Integer key, TValue *val) { if (keyinarray(t, key)) { lu_byte *tag = getArrTag(t, key - 1); - if (!tagisempty(*tag)) { + if (!tagisempty(*tag) || checknoTM(t->metatable, TM_NEWINDEX)) { fval2arr(t, key, tag, val); return HOK; /* success */ } diff --git a/ltm.h b/ltm.h index f3872655..3c49713a 100644 --- a/ltm.h +++ b/ltm.h @@ -60,11 +60,12 @@ typedef enum { */ #define notm(tm) ttisnil(tm) +#define checknoTM(mt,e) ((mt) == NULL || (mt)->flags & (1u<<(e))) -#define gfasttm(g,et,e) ((et) == NULL ? NULL : \ - ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e])) +#define gfasttm(g,mt,e) \ + (checknoTM(mt, e) ? NULL : luaT_gettm(mt, e, (g)->tmname[e])) -#define fasttm(l,et,e) gfasttm(G(l), et, e) +#define fasttm(l,mt,e) gfasttm(G(l), mt, e) #define ttypename(x) luaT_typenames_[(x) + 1]