Browse Source

smaller tables for machines with 8-bit alignment

Roberto Ierusalimschy 24 years ago
parent
commit
6b71a9cfe5
8 changed files with 69 additions and 45 deletions
  1. 5 5
      lapi.c
  2. 3 3
      ldebug.c
  3. 9 4
      lgc.c
  4. 5 3
      lobject.h
  5. 22 17
      ltable.c
  6. 15 8
      ltable.h
  7. 8 3
      ltests.c
  8. 2 2
      lvm.c

+ 5 - 5
lapi.c

@@ -1,5 +1,5 @@
 /*
-** $Id: lapi.c,v 1.120 2001/01/25 16:45:36 roberto Exp roberto $
+** $Id: lapi.c,v 1.121 2001/01/26 11:45:51 roberto Exp roberto $
 ** Lua API
 ** See Copyright Notice in lua.h
 */
@@ -646,7 +646,7 @@ LUA_API int lua_next (lua_State *L, int index) {
   lua_assert(ttype(t) == LUA_TTABLE);
   n = luaH_next(L, hvalue(t), luaA_index(L, -1));
   if (n) {
-    setobj(L->top-1, key(n));
+    setkey2obj(L->top-1, n);
     setobj(L->top, val(n));
     api_incr_top(L);
     more = 1;
@@ -674,10 +674,10 @@ LUA_API int lua_getn (lua_State *L, int index) {
     int i = h->size;
     Node *nd = h->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.56 2001/01/25 16:45:36 roberto Exp roberto $
+** $Id: ldebug.c,v 1.57 2001/01/26 11:45:51 roberto Exp roberto $
 ** Debug Interface
 ** See Copyright Notice in lua.h
 */
@@ -248,8 +248,8 @@ static const 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 tsvalue(key(node(g, i)))->str;
+        ttype_key(node(g, i)) == LUA_TSTRING) 
+      return tsvalue_key(node(g, i))->str;
   }
   return NULL;
 }

+ 9 - 4
lgc.c

@@ -1,5 +1,5 @@
 /*
-** $Id: lgc.c,v 1.80 2001/01/26 13:18:00 roberto Exp roberto $
+** $Id: lgc.c,v 1.81 2001/01/26 14:16:24 roberto Exp roberto $
 ** Garbage Collector
 ** See Copyright Notice in lua.h
 */
@@ -133,11 +133,16 @@ static void traversetable (GCState *st, Hash *h) {
   for (i=0; i<h->size; i++) {
     Node *n = node(h, i);
     if (ttype(val(n)) == LUA_TNIL) {
-      if (ttype(key(n)) != LUA_TNIL)
-        sethvalue(key(n), NULL);  /* dead key; remove it */
+      if (ttype_key(n) != LUA_TNIL)
+        n->key_value.v = NULL;  /* dead key; remove it */
     }
     else {
-      markobject(st, &n->key);
+      lua_assert(ttype_key(n) != LUA_TNIL);
+      if (ttype_key(n) != LUA_TNUMBER) {
+        TObject o;
+        setkey2obj(&o, n);
+        markobject(st, &o);
+      }
       markobject(st, &n->val);
     }
   }

+ 5 - 3
lobject.h

@@ -1,5 +1,5 @@
 /*
-** $Id: lobject.h,v 1.88 2001/01/25 16:45:36 roberto Exp roberto $
+** $Id: lobject.h,v 1.89 2001/01/26 15:58:50 roberto Exp roberto $
 ** Type definitions for Lua objects
 ** See Copyright Notice in lua.h
 */
@@ -178,11 +178,13 @@ typedef struct Closure {
 
 
 typedef struct Node {
-  TObject key;
-  TObject val;
   struct Node *next;  /* for chaining */
+  int key_tt;  /* (break object to save padding space) */
+  Value key_value;
+  TObject val;
 } Node;
 
+
 typedef struct Hash {
   Node *node;
   int htag;

+ 22 - 17
ltable.c

@@ -1,5 +1,5 @@
 /*
-** $Id: ltable.c,v 1.70 2001/01/26 15:58:50 roberto Exp roberto $
+** $Id: ltable.c,v 1.71 2001/01/29 13:02:20 roberto Exp roberto $
 ** Lua tables (hash)
 ** See Copyright Notice in lua.h
 */
@@ -40,14 +40,14 @@
 ** returns the `main' position of an element in a table (that is, the index
 ** of its hash value)
 */
-Node *luaH_mainposition (const Hash *t, const TObject *key) {
-  switch (ttype(key)) {
+Node *luaH_mainposition (const Hash *t, const Node *n) {
+  switch (ttype_key(n)) {
     case LUA_TNUMBER:
-      return hashnum(t, nvalue(key));
+      return hashnum(t, nvalue_key(n));
     case LUA_TSTRING:
-      return hashstr(t, tsvalue(key));
+      return hashstr(t, tsvalue_key(n));
     default:  /* all other types are hashed as (void *) */
-      return hashpointer(t, hvalue(key));
+      return hashpointer(t, tsvalue_key(n));
   }
 }
 
@@ -87,9 +87,9 @@ static void setnodevector (lua_State *L, Hash *t, luint32 size) {
     luaD_error(L, "table overflow");
   t->node = luaM_newvector(L, size, Node);
   for (i=0; i<(int)size; i++) {
-    setnilvalue(&t->node[i].key);
-    setnilvalue(&t->node[i].val);
     t->node[i].next = NULL;
+    t->node[i].key_tt = LUA_TNIL;
+    setnilvalue(&t->node[i].val);
   }
   t->size = size;
   t->firstfree = &t->node[size-1];  /* first free position to be used */
@@ -143,8 +143,13 @@ static void rehash (lua_State *L, Hash *t) {
     setnodevector(L, t, oldsize);
   for (i=0; i<oldsize; i++) {
     Node *old = nold+i;
-    if (ttype(&old->val) != LUA_TNIL)
-      setobj(luaH_set(L, t, &old->key), &old->val);
+    if (ttype(&old->val) != LUA_TNIL) {
+      TObject o;
+      TObject *v;
+      setkey2obj(&o, old);
+      v = luaH_set(L, t, &o);
+      setobj(v, &old->val);
+    }
   }
   luaM_freearray(L, nold, oldsize, Node);  /* free old array */
 }
@@ -159,7 +164,7 @@ static void rehash (lua_State *L, Hash *t) {
 */
 static TObject *newkey (lua_State *L, Hash *t, Node *mp, const TObject *key) {
   if (ttype(&mp->val) != LUA_TNIL) {  /* main position is not free? */
-    Node *othern = luaH_mainposition(t, &mp->key);  /* `mp' of colliding node */
+    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? */
       /* yes; move colliding node into free position */
@@ -176,10 +181,10 @@ static TObject *newkey (lua_State *L, Hash *t, Node *mp, const TObject *key) {
       mp = n;
     }
   }
-  setobj(&mp->key, key);
+  setobj2key(mp, key);
   lua_assert(ttype(&mp->val) == LUA_TNIL);
   for (;;) {  /* correct `firstfree' */
-    if (ttype(&t->firstfree->key) == LUA_TNIL)
+    if (ttype_key(t->firstfree) == LUA_TNIL)
       return &mp->val;  /* OK; table still has a free place */
     else if (t->firstfree == t->node) break;  /* cannot decrement from here */
     else (t->firstfree)--;
@@ -197,7 +202,7 @@ 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 (nvalue(&n->key) == key && ttype(&n->key) == LUA_TNUMBER)
+    if (nvalue_key(n) == key && ttype_key(n) == LUA_TNUMBER)
       return &n->val;  /* that's all */
     else n = n->next;
   } while (n);
@@ -216,7 +221,7 @@ 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 (tsvalue(&n->key) == key && ttype(&n->key) == LUA_TSTRING)
+    if (tsvalue_key(n) == key && ttype_key(n) == LUA_TSTRING)
       return &n->val;  /* that's all */
     else n = n->next;
   } while (n);
@@ -234,8 +239,8 @@ static TObject *luaH_setany (lua_State *L, Hash *t, const TObject *key) {
   Node *mp = hashpointer(t, hvalue(key));
   Node *n = mp;
   do {  /* check whether `key' is somewhere in the chain */
-    /* compare as `hvalue', but may be other pointers (it is the same) */
-    if (hvalue(&n->key) == hvalue(key) && ttype(&n->key) == ttype(key))
+    /* compare as `tsvalue', but may be other pointers (it is the same) */
+    if (tsvalue_key(n) == tsvalue(key) && ttype_key(n) == ttype(key))
       return &n->val;  /* that's all */
     else n = n->next;
   } while (n);

+ 15 - 8
ltable.h

@@ -1,5 +1,5 @@
 /*
-** $Id: ltable.h,v 1.29 2001/01/26 14:16:35 roberto Exp roberto $
+** $Id: ltable.h,v 1.30 2001/01/29 13:02:20 roberto Exp roberto $
 ** Lua tables (hash)
 ** See Copyright Notice in lua.h
 */
@@ -10,13 +10,20 @@
 #include "lobject.h"
 
 
-#define node(t,i)	(&(t)->node[i])
-#define key(n)		(&(n)->key)
-#define val(n)		(&(n)->val)
+#define node(_t,_i)	(&(_t)->node[_i])
+#define val(_n)		(&(_n)->val)
 
-#define luaH_get(t,k)	luaH_set(NULL,t,k)
-#define luaH_getnum(t,k)	luaH_setnum(NULL,t,k)
-#define luaH_getstr(t,k)	luaH_setstr(NULL,t,k)
+#define ttype_key(_n)		((_n)->key_tt)
+#define nvalue_key(_n)		((_n)->key_value.n)
+#define tsvalue_key(_n)		((TString *)(_n)->key_value.v)
+#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)
+#define luaH_getstr(_t,_k)	luaH_setstr(NULL,_t,_k)
 
 Hash *luaH_new (lua_State *L, int nhash);
 void luaH_free (lua_State *L, Hash *t);
@@ -27,7 +34,7 @@ TObject *luaH_setnum (lua_State *L, Hash *t, lua_Number key);
 TObject *luaH_setstr (lua_State *L, Hash *t, TString *key);
 
 /* exported only for debugging */
-Node *luaH_mainposition (const Hash *t, const TObject *key);
+Node *luaH_mainposition (const Hash *t, const Node *n);
 
 
 #endif

+ 8 - 3
ltests.c

@@ -1,5 +1,5 @@
 /*
-** $Id: ltests.c,v 1.58 2001/01/19 13:20:30 roberto Exp roberto $
+** $Id: ltests.c,v 1.59 2001/01/22 18:01:38 roberto Exp roberto $
 ** Internal Module for Debugging of the Lua Implementation
 ** See Copyright Notice in lua.h
 */
@@ -182,9 +182,12 @@ static int hash_query (lua_State *L) {
   }
   else {
     Hash *t;
+    Node n;
+    TObject *o = luaA_index(L, 1);
     luaL_checktype(L, 2, LUA_TTABLE);
     t = hvalue(luaA_index(L, 2));
-    lua_pushnumber(L, luaH_mainposition(t, luaA_index(L, 1)) - t->node);
+    setobj2key(&n, o);
+    lua_pushnumber(L, luaH_mainposition(t, &n) - t->node);
   }
   return 1;
 }
@@ -201,7 +204,9 @@ static int table_query (lua_State *L) {
     return 2;
   }
   else if (i < t->size) {
-    luaA_pushobject(L, &t->node[i].key);
+    TObject o;
+    setkey2obj(&o, &t->node[i]);
+    luaA_pushobject(L, &o);
     luaA_pushobject(L, &t->node[i].val);
     if (t->node[i].next) {
       lua_pushnumber(L, t->node[i].next - t->node);

+ 2 - 2
lvm.c

@@ -1,5 +1,5 @@
 /*
-** $Id: lvm.c,v 1.159 2001/01/29 13:02:20 roberto Exp roberto $
+** $Id: lvm.c,v 1.160 2001/01/29 15:26:40 roberto Exp roberto $
 ** Lua virtual machine
 ** See Copyright Notice in lua.h
 */
@@ -662,7 +662,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) {
         else {
           Node *node = node(t, n);
           setnvalue(top-3, n);  /* index */
-          setobj(top-2, key(node));
+          setkey2obj(top-2, node);
           setobj(top-1, val(node));
           dojump(pc, i);  /* repeat loop */
         }