diff options
Diffstat (limited to '')
-rw-r--r-- | ltable.c | 2 | ||||
-rw-r--r-- | ltm.h | 7 |
2 files changed, 5 insertions, 4 deletions
@@ -1001,7 +1001,7 @@ static int rawfinishnodeset (const TValue *slot, TValue *val) { | |||
1001 | int luaH_psetint (Table *t, lua_Integer key, TValue *val) { | 1001 | int luaH_psetint (Table *t, lua_Integer key, TValue *val) { |
1002 | if (keyinarray(t, key)) { | 1002 | if (keyinarray(t, key)) { |
1003 | lu_byte *tag = getArrTag(t, key - 1); | 1003 | lu_byte *tag = getArrTag(t, key - 1); |
1004 | if (!tagisempty(*tag)) { | 1004 | if (!tagisempty(*tag) || checknoTM(t->metatable, TM_NEWINDEX)) { |
1005 | fval2arr(t, key, tag, val); | 1005 | fval2arr(t, key, tag, val); |
1006 | return HOK; /* success */ | 1006 | return HOK; /* success */ |
1007 | } | 1007 | } |
@@ -60,11 +60,12 @@ typedef enum { | |||
60 | */ | 60 | */ |
61 | #define notm(tm) ttisnil(tm) | 61 | #define notm(tm) ttisnil(tm) |
62 | 62 | ||
63 | #define checknoTM(mt,e) ((mt) == NULL || (mt)->flags & (1u<<(e))) | ||
63 | 64 | ||
64 | #define gfasttm(g,et,e) ((et) == NULL ? NULL : \ | 65 | #define gfasttm(g,mt,e) \ |
65 | ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e])) | 66 | (checknoTM(mt, e) ? NULL : luaT_gettm(mt, e, (g)->tmname[e])) |
66 | 67 | ||
67 | #define fasttm(l,et,e) gfasttm(G(l), et, e) | 68 | #define fasttm(l,mt,e) gfasttm(G(l), mt, e) |
68 | 69 | ||
69 | #define ttypename(x) luaT_typenames_[(x) + 1] | 70 | #define ttypename(x) luaT_typenames_[(x) + 1] |
70 | 71 | ||