浏览代码

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.
Roberto Ierusalimschy 1 年之前
父节点
当前提交
b34a97a4af
共有 2 个文件被更改,包括 5 次插入4 次删除
  1. 1 1
      ltable.c
  2. 4 3
      ltm.h

+ 1 - 1
ltable.c

@@ -1001,7 +1001,7 @@ static int rawfinishnodeset (const TValue *slot, TValue *val) {
 int luaH_psetint (Table *t, lua_Integer key, TValue *val) {
 int luaH_psetint (Table *t, lua_Integer key, TValue *val) {
   if (keyinarray(t, key)) {
   if (keyinarray(t, key)) {
     lu_byte *tag = getArrTag(t, key - 1);
     lu_byte *tag = getArrTag(t, key - 1);
-    if (!tagisempty(*tag)) {
+    if (!tagisempty(*tag) || checknoTM(t->metatable, TM_NEWINDEX)) {
       fval2arr(t, key, tag, val);
       fval2arr(t, key, tag, val);
       return HOK;  /* success */
       return HOK;  /* success */
     }
     }

+ 4 - 3
ltm.h

@@ -60,11 +60,12 @@ typedef enum {
 */
 */
 #define notm(tm)	ttisnil(tm)
 #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]
 #define ttypename(x)	luaT_typenames_[(x) + 1]