From 6b71a9cfe53040aa605f5d75c58a2124d03f8912 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 29 Jan 2001 15:17:26 -0200 Subject: smaller tables for machines with 8-bit alignment --- lapi.c | 10 +++++----- ldebug.c | 6 +++--- lgc.c | 13 +++++++++---- lobject.h | 8 +++++--- ltable.c | 39 ++++++++++++++++++++++----------------- ltable.h | 23 +++++++++++++++-------- ltests.c | 11 ++++++++--- lvm.c | 4 ++-- 8 files changed, 69 insertions(+), 45 deletions(-) diff --git a/lapi.c b/lapi.c index 26563daf..614d237e 100644 --- a/lapi.c +++ b/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; diff --git a/ldebug.c b/ldebug.c index 1a4c7f96..a914edfd 100644 --- a/ldebug.c +++ b/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; isize; 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; } diff --git a/lgc.c b/lgc.c index 67fee0e2..c6c85f18 100644 --- a/lgc.c +++ b/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; isize; 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); } } diff --git a/lobject.h b/lobject.h index 79600a87..2afb8736 100644 --- a/lobject.h +++ b/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; diff --git a/ltable.c b/ltable.c index f8352fe5..b8bc24c5 100644 --- a/ltable.c +++ b/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; ival) != 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); diff --git a/ltable.h b/ltable.h index cbdcf743..3757bd01 100644 --- a/ltable.h +++ b/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 diff --git a/ltests.c b/ltests.c index ff841472..60bb2ea4 100644 --- a/ltests.c +++ b/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); diff --git a/lvm.c b/lvm.c index 04b4a610..5c00648e 100644 --- a/lvm.c +++ b/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 */ } -- cgit v1.2.3-55-g6feb