commit b34a97a4af5c9e973915c07dba918d95009e0acd
parent 3e9dbe143d3338f5f13a5e421ea593adff482da0
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Thu, 25 Jan 2024 13:44:22 -0300
Small optimization in 'luaH_psetint'
It is quite common to write to empty but existing cells in the array
part of a table, so 'luaH_psetint' checks for the common case that
the table doesn't have a newindex metamethod to complete the write.
Diffstat:
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git 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
@@ -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]