From 37f3a1c0452439bce1f5c2069ca015af148bf62f Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Tue, 26 Jun 2001 10:20:45 -0300 Subject: too much optimization to "break" keys in tables; keep them as TObjects... --- lapi.c | 10 +++++----- ldebug.c | 6 +++--- lgc.c | 32 ++++++++++++++------------------ lobject.h | 8 +++++--- ltable.c | 57 +++++++++++++++++++++++++++------------------------------ ltable.h | 10 ++-------- ltests.c | 13 +++++-------- lvm.c | 6 +++--- 8 files changed, 64 insertions(+), 78 deletions(-) diff --git a/lapi.c b/lapi.c index 31f11702..5b6e36e3 100644 --- a/lapi.c +++ b/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; diff --git a/ldebug.c b/ldebug.c index a0293b10..f07e6dc3 100644 --- a/ldebug.c +++ b/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; isize; 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; } diff --git a/lgc.c b/lgc.c index 11119585..112d02ac 100644 --- a/lgc.c +++ b/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; isize; 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); } diff --git a/lobject.h b/lobject.h index 2f363ec7..c12bc177 100644 --- a/lobject.h +++ b/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; diff --git a/ltable.c b/ltable.c index 4a20bb23..c51b0a81 100644 --- a/ltable.c +++ b/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 (; isize; 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; inode[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; ival) != 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 */ diff --git a/ltable.h b/ltable.h index 8de4c11b..a7c617c4 100644 --- a/ltable.h +++ b/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) diff --git a/ltests.c b/ltests.c index b78de996..0093fd15 100644 --- a/ltests.c +++ b/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, ""); diff --git a/lvm.c b/lvm.c index c3972b7e..7a92fab7 100644 --- a/lvm.c +++ b/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 */ } -- cgit v1.2.3-55-g6feb