浏览代码

too much optimization to "break" keys in tables; keep them as TObjects...

Roberto Ierusalimschy 24 年之前
父节点
当前提交
37f3a1c045
共有 8 个文件被更改,包括 64 次插入78 次删除
  1. 5 5
      lapi.c
  2. 3 3
      ldebug.c
  3. 14 18
      lgc.c
  4. 5 3
      lobject.h
  5. 27 30
      ltable.c
  6. 2 8
      ltable.h
  7. 5 8
      ltests.c
  8. 3 3
      lvm.c

+ 5 - 5
lapi.c

@@ -1,5 +1,5 @@
 /*
-** $Id: lapi.c,v 1.145 2001/06/15 19:16:41 roberto Exp roberto $
+** $Id: lapi.c,v 1.146 2001/06/15 20:36:57 roberto Exp roberto $
 ** Lua API
 ** See Copyright Notice in lua.h
 */
@@ -672,7 +672,7 @@ LUA_API int lua_next (lua_State *L, int index) {
   api_check(L, ttype(t) == LUA_TTABLE);
   n = luaH_next(L, hvalue(t), luaA_index(L, -1));
   if (n) {
-    setkey2obj(L->top-1, n);
+    setobj(L->top-1, key(n));
     setobj(L->top, val(n));
     api_incr_top(L);
     more = 1;
@@ -701,10 +701,10 @@ LUA_API int lua_getn (lua_State *L, int index) {
     int i = hvalue(t)->size;
     Node *nd = hvalue(t)->node;
     while (i--) {
-      if (ttype_key(nd) == LUA_TNUMBER &&
+      if (ttype(key(nd)) == LUA_TNUMBER &&
           ttype(val(nd)) != LUA_TNIL &&
-          nvalue_key(nd) > max)
-        max = nvalue_key(nd);
+          nvalue(key(nd)) > max)
+        max = nvalue(key(nd));
       nd++;
     }
     n = (int)max;

+ 3 - 3
ldebug.c

@@ -1,5 +1,5 @@
 /*
-** $Id: ldebug.c,v 1.82 2001/06/11 14:56:42 roberto Exp roberto $
+** $Id: ldebug.c,v 1.83 2001/06/15 20:36:57 roberto Exp roberto $
 ** Debug Interface
 ** See Copyright Notice in lua.h
 */
@@ -225,8 +225,8 @@ static const l_char *travglobals (lua_State *L, const TObject *o) {
   int i;
   for (i=0; i<g->size; i++) {
     if (luaO_equalObj(o, val(node(g, i))) &&
-        ttype_key(node(g, i)) == LUA_TSTRING)
-      return getstr(tsvalue_key(node(g, i)));
+        ttype(key(node(g, i))) == LUA_TSTRING)
+      return getstr(tsvalue(key(node(g, i))));
   }
   return NULL;
 }

+ 14 - 18
lgc.c

@@ -1,5 +1,5 @@
 /*
-** $Id: lgc.c,v 1.106 2001/06/15 20:36:57 roberto Exp roberto $
+** $Id: lgc.c,v 1.107 2001/06/21 16:41:34 roberto Exp roberto $
 ** Garbage Collector
 ** See Copyright Notice in lua.h
 */
@@ -128,8 +128,8 @@ static void traverseclosure (GCState *st, Closure *f) {
 
 static void removekey (Node *n) {
   lua_assert(ttype(val(n)) == LUA_TNIL);
-  if (ttype_key(n) != LUA_TNIL && ttype_key(n) != LUA_TNUMBER)
-    ttype_key(n) = LUA_TNONE;  /* dead key; remove it */
+  if (ttype(key(n)) != LUA_TNIL && ttype(key(n)) != LUA_TNUMBER)
+    setttype(key(n), LUA_TNONE);  /* dead key; remove it */
 }
 
 
@@ -143,14 +143,11 @@ static void traversetable (GCState *st, Hash *h) {
     if (ttype(val(n)) == LUA_TNIL)
       removekey(n);
     else {
-      lua_assert(ttype_key(n) != LUA_TNIL);
-      if (ttype_key(n) != LUA_TNUMBER && !(mode & LUA_WEAK_KEY)) {
-        TObject k;
-        setkey2obj(&k, n);
-        markobject(st, &k);
-      }
+      lua_assert(ttype(key(n)) != LUA_TNIL);
+      if (ttype(key(n)) != LUA_TNUMBER && !(mode & LUA_WEAK_KEY))
+        markobject(st, key(n));
       if (!(mode & LUA_WEAK_VALUE))
-        markobject(st, &n->val);
+        markobject(st, val(n));
     }
   }
 }
@@ -181,16 +178,16 @@ static void markall (lua_State *L) {
 }
 
 
-static int hasmark (int tt, Value *v) {
-  switch (tt) {
+static int hasmark (const TObject *o) {
+  switch (ttype(o)) {
     case LUA_TSTRING:
-      return v->ts->tsv.marked;
+      return tsvalue(o)->tsv.marked;
     case LUA_TUSERDATA:
-      return ismarkedudata(v->u);
+      return ismarkedudata(uvalue(o));
     case LUA_TTABLE:
-      return ismarked(v->h);
+      return ismarked(hvalue(o));
     case LUA_TFUNCTION:
-      return ismarked(v->cl);
+      return ismarked(clvalue(o));
     default:  /* number, nil */
       return 1;
   }
@@ -202,8 +199,7 @@ static void cleardeadnodes (Hash *h) {
   for (i=0; i<h->size; i++) {
     Node *n = node(h, i);
     if (ttype(val(n)) == LUA_TNIL) continue;  /* empty node */
-    if (!hasmark(ttype(val(n)), &(val(n)->value)) ||
-        !hasmark(ttype_key(n), &n->key_value)) {
+    if (!hasmark(val(n)) || !hasmark(key(n))) {
       setnilvalue(val(n));  /* remove value */
       removekey(n);
     }

+ 5 - 3
lobject.h

@@ -1,5 +1,5 @@
 /*
-** $Id: lobject.h,v 1.105 2001/06/07 15:01:21 roberto Exp roberto $
+** $Id: lobject.h,v 1.106 2001/06/15 20:36:57 roberto Exp roberto $
 ** Type definitions for Lua objects
 ** See Copyright Notice in lua.h
 */
@@ -73,6 +73,9 @@ typedef struct lua_TObject {
   { TObject *o1=(obj1); const TObject *o2=(obj2); \
     o1->tt=o2->tt; o1->value = o2->value; }
 
+#define setttype(obj, tt) (ttype(obj) = (tt))
+
+
 
 typedef TObject *StkId;  /* index to stack elements */
 
@@ -167,8 +170,7 @@ typedef struct Closure {
 
 typedef struct Node {
   struct Node *next;  /* for chaining */
-  int key_tt;  /* (break object to save padding space) */
-  Value key_value;
+  TObject key;
   TObject val;
 } Node;
 

+ 27 - 30
ltable.c

@@ -1,5 +1,5 @@
 /*
-** $Id: ltable.c,v 1.80 2001/06/06 18:00:19 roberto Exp roberto $
+** $Id: ltable.c,v 1.81 2001/06/15 20:36:57 roberto Exp roberto $
 ** Lua tables (hash)
 ** See Copyright Notice in lua.h
 */
@@ -32,9 +32,9 @@
 #define TagDefault LUA_TTABLE
 
 
-#define hashnum(t,n)		(&t->node[lmod((lu_hash)(ls_hash)(n), t->size)])
-#define hashstr(t,str)		(&t->node[lmod((str)->tsv.hash, t->size)])
-#define hashpointer(t,p)	(&t->node[lmod(IntPoint(p), t->size)])
+#define hashnum(t,n)		(node(t, lmod((lu_hash)(ls_hash)(n), t->size)))
+#define hashstr(t,str)		(node(t, lmod((str)->tsv.hash, t->size)))
+#define hashpointer(t,p)	(node(t, lmod(IntPoint(p), t->size)))
 
 
 /*
@@ -42,13 +42,13 @@
 ** of its hash value)
 */
 Node *luaH_mainposition (const Hash *t, const Node *n) {
-  switch (ttype_key(n)) {
+  switch (ttype(key(n))) {
     case LUA_TNUMBER:
-      return hashnum(t, nvalue_key(n));
+      return hashnum(t, nvalue(key(n)));
     case LUA_TSTRING:
-      return hashstr(t, tsvalue_key(n));
+      return hashstr(t, tsvalue(key(n)));
     default:  /* all other types are hashed as (void *) */
-      return hashpointer(t, tsvalue_key(n));
+      return hashpointer(t, tsvalue(key(n)));
   }
 }
 
@@ -62,7 +62,7 @@ Node *luaH_next (lua_State *L, Hash *t, const TObject *key) {
     if (v == &luaO_nilobject)
       luaD_error(L, l_s("invalid key for `next'"));
     i = (int)(((const l_char *)v -
-               (const l_char *)(&t->node[0].val)) / sizeof(Node)) + 1;
+               (const l_char *)(val(node(t, 0)))) / sizeof(Node)) + 1;
   }
   for (; i<t->size; i++) {
     Node *n = node(t, i);
@@ -103,11 +103,11 @@ static void setnodevector (lua_State *L, Hash *t, int size) {
   t->node = luaM_newvector(L, size, Node);
   for (i=0; i<size; i++) {
     t->node[i].next = NULL;
-    t->node[i].key_tt = LUA_TNIL;
-    setnilvalue(&t->node[i].val);
+    setnilvalue(key(node(t, i)));
+    setnilvalue(val(node(t, i)));
   }
   t->size = size;
-  t->firstfree = &t->node[size-1];  /* first free position to be used */
+  t->firstfree = node(t, size-1);  /* first free position to be used */
 }
 
 
@@ -161,12 +161,9 @@ static void rehash (lua_State *L, Hash *t) {
     setnodevector(L, t, oldsize);  /* just rehash; keep the same size */
   for (i=0; i<oldsize; i++) {
     Node *old = nold+i;
-    if (ttype(&old->val) != LUA_TNIL) {
-      TObject o;
-      TObject *v;
-      setkey2obj(&o, old);
-      v = luaH_set(L, t, &o);
-      setobj(v, &old->val);
+    if (ttype(val(old)) != LUA_TNIL) {
+      TObject *v = luaH_set(L, t, key(old));
+      setobj(v, val(old));
     }
   }
   luaM_freearray(L, nold, oldsize, Node);  /* free old array */
@@ -181,7 +178,7 @@ static void rehash (lua_State *L, Hash *t) {
 ** position), new key goes to an empty position. 
 */
 static TObject *newkey (lua_State *L, Hash *t, Node *mp, const TObject *key) {
-  if (ttype(&mp->val) != LUA_TNIL) {  /* main position is not free? */
+  if (ttype(val(mp)) != LUA_TNIL) {  /* main position is not free? */
     Node *othern = luaH_mainposition(t, mp);  /* `mp' of colliding node */
     Node *n = t->firstfree;  /* get a free place */
     if (othern != mp) {  /* is colliding node out of its main position? */
@@ -190,7 +187,7 @@ static TObject *newkey (lua_State *L, Hash *t, Node *mp, const TObject *key) {
       othern->next = n;  /* redo the chain with `n' in place of `mp' */
       *n = *mp;  /* copy colliding node into free pos. (mp->next also goes) */
       mp->next = NULL;  /* now `mp' is free */
-      setnilvalue(&mp->val);
+      setnilvalue(val(mp));
     }
     else {  /* colliding node is in its own main position */
       /* new node will go into free position */
@@ -199,11 +196,11 @@ static TObject *newkey (lua_State *L, Hash *t, Node *mp, const TObject *key) {
       mp = n;
     }
   }
-  setobj2key(mp, key);
-  lua_assert(ttype(&mp->val) == LUA_TNIL);
+  setobj(key(mp), key);
+  lua_assert(ttype(val(mp)) == LUA_TNIL);
   for (;;) {  /* correct `firstfree' */
-    if (ttype_key(t->firstfree) == LUA_TNIL)
-      return &mp->val;  /* OK; table still has a free place */
+    if (ttype(key(t->firstfree)) == LUA_TNIL)
+      return val(mp);  /* OK; table still has a free place */
     else if (t->firstfree == t->node) break;  /* cannot decrement from here */
     else (t->firstfree)--;
   }
@@ -220,8 +217,8 @@ TObject *luaH_setnum (lua_State *L, Hash *t, lua_Number key) {
   Node *mp = hashnum(t, key);
   Node *n = mp;
   do {  /* check whether `key' is somewhere in the chain */
-    if (ttype_key(n) == LUA_TNUMBER && nvalue_key(n) == key)
-      return &n->val;  /* that's all */
+    if (ttype(key(n)) == LUA_TNUMBER && nvalue(key(n)) == key)
+      return val(n);  /* that's all */
     else n = n->next;
   } while (n);
   if (L == NULL) return (TObject *)&luaO_nilobject;  /* get option */
@@ -239,8 +236,8 @@ TObject *luaH_setstr (lua_State *L, Hash *t, TString *key) {
   Node *mp = hashstr(t, key);
   Node *n = mp;
   do {  /* check whether `key' is somewhere in the chain */
-    if (ttype_key(n) == LUA_TSTRING && tsvalue_key(n) == key)
-      return &n->val;  /* that's all */
+    if (ttype(key(n)) == LUA_TSTRING && tsvalue(key(n)) == key)
+      return val(n);  /* that's all */
     else n = n->next;
   } while (n);
   if (L == NULL) return (TObject *)&luaO_nilobject;  /* get option */
@@ -258,8 +255,8 @@ static TObject *luaH_setany (lua_State *L, Hash *t, const TObject *key) {
   Node *n = mp;
   do {  /* check whether `key' is somewhere in the chain */
     /* compare as `tsvalue', but may be other pointers (it is the same) */
-    if (ttype_key(n) == ttype(key) && tsvalue_key(n) == tsvalue(key))
-      return &n->val;  /* that's all */
+    if (ttype(key(n)) == ttype(key) && tsvalue(key(n)) == tsvalue(key))
+      return val(n);  /* that's all */
     else n = n->next;
   } while (n);
   if (L == NULL) return (TObject *)&luaO_nilobject;  /* get option */

+ 2 - 8
ltable.h

@@ -1,5 +1,5 @@
 /*
-** $Id: ltable.h,v 1.31 2001/01/29 17:17:26 roberto Exp roberto $
+** $Id: ltable.h,v 1.32 2001/02/02 16:32:00 roberto Exp roberto $
 ** Lua tables (hash)
 ** See Copyright Notice in lua.h
 */
@@ -11,15 +11,9 @@
 
 
 #define node(_t,_i)	(&(_t)->node[_i])
+#define key(_n)		(&(_n)->key)
 #define val(_n)		(&(_n)->val)
 
-#define ttype_key(_n)		((_n)->key_tt)
-#define nvalue_key(_n)		((_n)->key_value.n)
-#define tsvalue_key(_n)		((_n)->key_value.ts)
-#define setkey2obj(_o,_k) \
-  ((_o)->tt = ttype_key(_k), (_o)->value = (_k)->key_value)
-#define setobj2key(_k,_o) \
-  (ttype_key(_k) = (_o)->tt, (_k)->key_value = (_o)->value)
 
 #define luaH_get(_t,_k)		luaH_set(NULL,_t,_k)
 #define luaH_getnum(_t,_k)	luaH_setnum(NULL,_t,_k)

+ 5 - 8
ltests.c

@@ -1,5 +1,5 @@
 /*
-** $Id: ltests.c,v 1.82 2001/06/06 18:00:19 roberto Exp roberto $
+** $Id: ltests.c,v 1.83 2001/06/15 20:36:57 roberto Exp roberto $
 ** Internal Module for Debugging of the Lua Implementation
 ** See Copyright Notice in lua.h
 */
@@ -298,7 +298,7 @@ static int hash_query (lua_State *L) {
     TObject *o = luaA_index(L, 1);
     luaL_checktype(L, 2, LUA_TTABLE);
     t = hvalue(luaA_index(L, 2));
-    setobj2key(&n, o);
+    setobj(key(&n), o);
     lua_pushnumber(L, luaH_mainposition(t, &n) - t->node);
   }
   return 1;
@@ -317,12 +317,9 @@ static int table_query (lua_State *L) {
   }
   else if (i < t->size) {
     if (ttype(val(node(t, i))) != LUA_TNIL ||
-        ttype_key(node(t, i)) == LUA_TNIL ||
-        ttype_key(node(t, i)) == LUA_TNUMBER ||
-        tsvalue_key(node(t, i)) != NULL) {
-      TObject o;
-      setkey2obj(&o, node(t, i));
-      luaA_pushobject(L, &o);
+        ttype(key(node(t, i))) == LUA_TNIL ||
+        ttype(key(node(t, i))) == LUA_TNUMBER) {
+      luaA_pushobject(L, key(node(t, i)));
     }
     else
       lua_pushstring(L, "<undef>");

+ 3 - 3
lvm.c

@@ -1,5 +1,5 @@
 /*
-** $Id: lvm.c,v 1.186 2001/06/15 20:36:57 roberto Exp roberto $
+** $Id: lvm.c,v 1.187 2001/06/20 17:22:46 roberto Exp roberto $
 ** Lua virtual machine
 ** See Copyright Notice in lua.h
 */
@@ -41,7 +41,7 @@ static void luaV_checkGC (lua_State *L, StkId top) {
 const TObject *luaV_tonumber (const TObject *obj, TObject *n) {
   if (ttype(obj) == LUA_TNUMBER) return obj;
   if (ttype(obj) == LUA_TSTRING && luaO_str2d(svalue(obj), &nvalue(n))) {
-    ttype(n) = LUA_TNUMBER;
+    setttype(n, LUA_TNUMBER);
     return n;
   }
   else
@@ -617,7 +617,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) {
         if (n != -1) {  /* repeat loop? */
           Node *node = node(t, n);
           setnvalue(ra+1, n);  /* index */
-          setkey2obj(ra+2, node);
+          setobj(ra+2, key(node));
           setobj(ra+3, val(node));
           dojump(pc, i);  /* repeat loop */
         }