diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-01-29 15:17:26 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-01-29 15:17:26 -0200 |
commit | 6b71a9cfe53040aa605f5d75c58a2124d03f8912 (patch) | |
tree | adbd5eb607941b3fbf2eb36359b15841de4159ae | |
parent | fa8c44b510c6b56a290c14bd5dba4c7caec53284 (diff) | |
download | lua-6b71a9cfe53040aa605f5d75c58a2124d03f8912.tar.gz lua-6b71a9cfe53040aa605f5d75c58a2124d03f8912.tar.bz2 lua-6b71a9cfe53040aa605f5d75c58a2124d03f8912.zip |
smaller tables for machines with 8-bit alignment
-rw-r--r-- | lapi.c | 10 | ||||
-rw-r--r-- | ldebug.c | 6 | ||||
-rw-r--r-- | lgc.c | 13 | ||||
-rw-r--r-- | lobject.h | 8 | ||||
-rw-r--r-- | ltable.c | 39 | ||||
-rw-r--r-- | ltable.h | 23 | ||||
-rw-r--r-- | ltests.c | 11 | ||||
-rw-r--r-- | lvm.c | 4 |
8 files changed, 69 insertions, 45 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lapi.c,v 1.120 2001/01/25 16:45:36 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 1.121 2001/01/26 11:45:51 roberto Exp roberto $ |
3 | ** Lua API | 3 | ** Lua API |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -646,7 +646,7 @@ LUA_API int lua_next (lua_State *L, int index) { | |||
646 | lua_assert(ttype(t) == LUA_TTABLE); | 646 | lua_assert(ttype(t) == LUA_TTABLE); |
647 | n = luaH_next(L, hvalue(t), luaA_index(L, -1)); | 647 | n = luaH_next(L, hvalue(t), luaA_index(L, -1)); |
648 | if (n) { | 648 | if (n) { |
649 | setobj(L->top-1, key(n)); | 649 | setkey2obj(L->top-1, n); |
650 | setobj(L->top, val(n)); | 650 | setobj(L->top, val(n)); |
651 | api_incr_top(L); | 651 | api_incr_top(L); |
652 | more = 1; | 652 | more = 1; |
@@ -674,10 +674,10 @@ LUA_API int lua_getn (lua_State *L, int index) { | |||
674 | int i = h->size; | 674 | int i = h->size; |
675 | Node *nd = h->node; | 675 | Node *nd = h->node; |
676 | while (i--) { | 676 | while (i--) { |
677 | if (ttype(key(nd)) == LUA_TNUMBER && | 677 | if (ttype_key(nd) == LUA_TNUMBER && |
678 | ttype(val(nd)) != LUA_TNIL && | 678 | ttype(val(nd)) != LUA_TNIL && |
679 | nvalue(key(nd)) > max) | 679 | nvalue_key(nd) > max) |
680 | max = nvalue(key(nd)); | 680 | max = nvalue_key(nd); |
681 | nd++; | 681 | nd++; |
682 | } | 682 | } |
683 | n = (int)max; | 683 | n = (int)max; |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldebug.c,v 1.56 2001/01/25 16:45:36 roberto Exp roberto $ | 2 | ** $Id: ldebug.c,v 1.57 2001/01/26 11:45:51 roberto Exp roberto $ |
3 | ** Debug Interface | 3 | ** Debug Interface |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -248,8 +248,8 @@ static const char *travglobals (lua_State *L, const TObject *o) { | |||
248 | int i; | 248 | int i; |
249 | for (i=0; i<g->size; i++) { | 249 | for (i=0; i<g->size; i++) { |
250 | if (luaO_equalObj(o, val(node(g, i))) && | 250 | if (luaO_equalObj(o, val(node(g, i))) && |
251 | ttype(key(node(g, i))) == LUA_TSTRING) | 251 | ttype_key(node(g, i)) == LUA_TSTRING) |
252 | return tsvalue(key(node(g, i)))->str; | 252 | return tsvalue_key(node(g, i))->str; |
253 | } | 253 | } |
254 | return NULL; | 254 | return NULL; |
255 | } | 255 | } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.c,v 1.80 2001/01/26 13:18:00 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 1.81 2001/01/26 14:16:24 roberto Exp roberto $ |
3 | ** Garbage Collector | 3 | ** Garbage Collector |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -133,11 +133,16 @@ static void traversetable (GCState *st, Hash *h) { | |||
133 | for (i=0; i<h->size; i++) { | 133 | for (i=0; i<h->size; i++) { |
134 | Node *n = node(h, i); | 134 | Node *n = node(h, i); |
135 | if (ttype(val(n)) == LUA_TNIL) { | 135 | if (ttype(val(n)) == LUA_TNIL) { |
136 | if (ttype(key(n)) != LUA_TNIL) | 136 | if (ttype_key(n) != LUA_TNIL) |
137 | sethvalue(key(n), NULL); /* dead key; remove it */ | 137 | n->key_value.v = NULL; /* dead key; remove it */ |
138 | } | 138 | } |
139 | else { | 139 | else { |
140 | markobject(st, &n->key); | 140 | lua_assert(ttype_key(n) != LUA_TNIL); |
141 | if (ttype_key(n) != LUA_TNUMBER) { | ||
142 | TObject o; | ||
143 | setkey2obj(&o, n); | ||
144 | markobject(st, &o); | ||
145 | } | ||
141 | markobject(st, &n->val); | 146 | markobject(st, &n->val); |
142 | } | 147 | } |
143 | } | 148 | } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lobject.h,v 1.88 2001/01/25 16:45:36 roberto Exp roberto $ | 2 | ** $Id: lobject.h,v 1.89 2001/01/26 15:58:50 roberto Exp roberto $ |
3 | ** Type definitions for Lua objects | 3 | ** Type definitions for Lua objects |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -178,11 +178,13 @@ typedef struct Closure { | |||
178 | 178 | ||
179 | 179 | ||
180 | typedef struct Node { | 180 | typedef struct Node { |
181 | TObject key; | ||
182 | TObject val; | ||
183 | struct Node *next; /* for chaining */ | 181 | struct Node *next; /* for chaining */ |
182 | int key_tt; /* (break object to save padding space) */ | ||
183 | Value key_value; | ||
184 | TObject val; | ||
184 | } Node; | 185 | } Node; |
185 | 186 | ||
187 | |||
186 | typedef struct Hash { | 188 | typedef struct Hash { |
187 | Node *node; | 189 | Node *node; |
188 | int htag; | 190 | int htag; |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltable.c,v 1.70 2001/01/26 15:58:50 roberto Exp roberto $ | 2 | ** $Id: ltable.c,v 1.71 2001/01/29 13:02:20 roberto Exp roberto $ |
3 | ** Lua tables (hash) | 3 | ** Lua tables (hash) |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -40,14 +40,14 @@ | |||
40 | ** returns the `main' position of an element in a table (that is, the index | 40 | ** returns the `main' position of an element in a table (that is, the index |
41 | ** of its hash value) | 41 | ** of its hash value) |
42 | */ | 42 | */ |
43 | Node *luaH_mainposition (const Hash *t, const TObject *key) { | 43 | Node *luaH_mainposition (const Hash *t, const Node *n) { |
44 | switch (ttype(key)) { | 44 | switch (ttype_key(n)) { |
45 | case LUA_TNUMBER: | 45 | case LUA_TNUMBER: |
46 | return hashnum(t, nvalue(key)); | 46 | return hashnum(t, nvalue_key(n)); |
47 | case LUA_TSTRING: | 47 | case LUA_TSTRING: |
48 | return hashstr(t, tsvalue(key)); | 48 | return hashstr(t, tsvalue_key(n)); |
49 | default: /* all other types are hashed as (void *) */ | 49 | default: /* all other types are hashed as (void *) */ |
50 | return hashpointer(t, hvalue(key)); | 50 | return hashpointer(t, tsvalue_key(n)); |
51 | } | 51 | } |
52 | } | 52 | } |
53 | 53 | ||
@@ -87,9 +87,9 @@ static void setnodevector (lua_State *L, Hash *t, luint32 size) { | |||
87 | luaD_error(L, "table overflow"); | 87 | luaD_error(L, "table overflow"); |
88 | t->node = luaM_newvector(L, size, Node); | 88 | t->node = luaM_newvector(L, size, Node); |
89 | for (i=0; i<(int)size; i++) { | 89 | for (i=0; i<(int)size; i++) { |
90 | setnilvalue(&t->node[i].key); | ||
91 | setnilvalue(&t->node[i].val); | ||
92 | t->node[i].next = NULL; | 90 | t->node[i].next = NULL; |
91 | t->node[i].key_tt = LUA_TNIL; | ||
92 | setnilvalue(&t->node[i].val); | ||
93 | } | 93 | } |
94 | t->size = size; | 94 | t->size = size; |
95 | t->firstfree = &t->node[size-1]; /* first free position to be used */ | 95 | t->firstfree = &t->node[size-1]; /* first free position to be used */ |
@@ -143,8 +143,13 @@ static void rehash (lua_State *L, Hash *t) { | |||
143 | setnodevector(L, t, oldsize); | 143 | setnodevector(L, t, oldsize); |
144 | for (i=0; i<oldsize; i++) { | 144 | for (i=0; i<oldsize; i++) { |
145 | Node *old = nold+i; | 145 | Node *old = nold+i; |
146 | if (ttype(&old->val) != LUA_TNIL) | 146 | if (ttype(&old->val) != LUA_TNIL) { |
147 | setobj(luaH_set(L, t, &old->key), &old->val); | 147 | TObject o; |
148 | TObject *v; | ||
149 | setkey2obj(&o, old); | ||
150 | v = luaH_set(L, t, &o); | ||
151 | setobj(v, &old->val); | ||
152 | } | ||
148 | } | 153 | } |
149 | luaM_freearray(L, nold, oldsize, Node); /* free old array */ | 154 | luaM_freearray(L, nold, oldsize, Node); /* free old array */ |
150 | } | 155 | } |
@@ -159,7 +164,7 @@ static void rehash (lua_State *L, Hash *t) { | |||
159 | */ | 164 | */ |
160 | static TObject *newkey (lua_State *L, Hash *t, Node *mp, const TObject *key) { | 165 | static TObject *newkey (lua_State *L, Hash *t, Node *mp, const TObject *key) { |
161 | if (ttype(&mp->val) != LUA_TNIL) { /* main position is not free? */ | 166 | if (ttype(&mp->val) != LUA_TNIL) { /* main position is not free? */ |
162 | Node *othern = luaH_mainposition(t, &mp->key); /* `mp' of colliding node */ | 167 | Node *othern = luaH_mainposition(t, mp); /* `mp' of colliding node */ |
163 | Node *n = t->firstfree; /* get a free place */ | 168 | Node *n = t->firstfree; /* get a free place */ |
164 | if (othern != mp) { /* is colliding node out of its main position? */ | 169 | if (othern != mp) { /* is colliding node out of its main position? */ |
165 | /* yes; move colliding node into free position */ | 170 | /* yes; move colliding node into free position */ |
@@ -176,10 +181,10 @@ static TObject *newkey (lua_State *L, Hash *t, Node *mp, const TObject *key) { | |||
176 | mp = n; | 181 | mp = n; |
177 | } | 182 | } |
178 | } | 183 | } |
179 | setobj(&mp->key, key); | 184 | setobj2key(mp, key); |
180 | lua_assert(ttype(&mp->val) == LUA_TNIL); | 185 | lua_assert(ttype(&mp->val) == LUA_TNIL); |
181 | for (;;) { /* correct `firstfree' */ | 186 | for (;;) { /* correct `firstfree' */ |
182 | if (ttype(&t->firstfree->key) == LUA_TNIL) | 187 | if (ttype_key(t->firstfree) == LUA_TNIL) |
183 | return &mp->val; /* OK; table still has a free place */ | 188 | return &mp->val; /* OK; table still has a free place */ |
184 | else if (t->firstfree == t->node) break; /* cannot decrement from here */ | 189 | else if (t->firstfree == t->node) break; /* cannot decrement from here */ |
185 | else (t->firstfree)--; | 190 | else (t->firstfree)--; |
@@ -197,7 +202,7 @@ TObject *luaH_setnum (lua_State *L, Hash *t, lua_Number key) { | |||
197 | Node *mp = hashnum(t, key); | 202 | Node *mp = hashnum(t, key); |
198 | Node *n = mp; | 203 | Node *n = mp; |
199 | do { /* check whether `key' is somewhere in the chain */ | 204 | do { /* check whether `key' is somewhere in the chain */ |
200 | if (nvalue(&n->key) == key && ttype(&n->key) == LUA_TNUMBER) | 205 | if (nvalue_key(n) == key && ttype_key(n) == LUA_TNUMBER) |
201 | return &n->val; /* that's all */ | 206 | return &n->val; /* that's all */ |
202 | else n = n->next; | 207 | else n = n->next; |
203 | } while (n); | 208 | } while (n); |
@@ -216,7 +221,7 @@ TObject *luaH_setstr (lua_State *L, Hash *t, TString *key) { | |||
216 | Node *mp = hashstr(t, key); | 221 | Node *mp = hashstr(t, key); |
217 | Node *n = mp; | 222 | Node *n = mp; |
218 | do { /* check whether `key' is somewhere in the chain */ | 223 | do { /* check whether `key' is somewhere in the chain */ |
219 | if (tsvalue(&n->key) == key && ttype(&n->key) == LUA_TSTRING) | 224 | if (tsvalue_key(n) == key && ttype_key(n) == LUA_TSTRING) |
220 | return &n->val; /* that's all */ | 225 | return &n->val; /* that's all */ |
221 | else n = n->next; | 226 | else n = n->next; |
222 | } while (n); | 227 | } while (n); |
@@ -234,8 +239,8 @@ static TObject *luaH_setany (lua_State *L, Hash *t, const TObject *key) { | |||
234 | Node *mp = hashpointer(t, hvalue(key)); | 239 | Node *mp = hashpointer(t, hvalue(key)); |
235 | Node *n = mp; | 240 | Node *n = mp; |
236 | do { /* check whether `key' is somewhere in the chain */ | 241 | do { /* check whether `key' is somewhere in the chain */ |
237 | /* compare as `hvalue', but may be other pointers (it is the same) */ | 242 | /* compare as `tsvalue', but may be other pointers (it is the same) */ |
238 | if (hvalue(&n->key) == hvalue(key) && ttype(&n->key) == ttype(key)) | 243 | if (tsvalue_key(n) == tsvalue(key) && ttype_key(n) == ttype(key)) |
239 | return &n->val; /* that's all */ | 244 | return &n->val; /* that's all */ |
240 | else n = n->next; | 245 | else n = n->next; |
241 | } while (n); | 246 | } while (n); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltable.h,v 1.29 2001/01/26 14:16:35 roberto Exp roberto $ | 2 | ** $Id: ltable.h,v 1.30 2001/01/29 13:02:20 roberto Exp roberto $ |
3 | ** Lua tables (hash) | 3 | ** Lua tables (hash) |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -10,13 +10,20 @@ | |||
10 | #include "lobject.h" | 10 | #include "lobject.h" |
11 | 11 | ||
12 | 12 | ||
13 | #define node(t,i) (&(t)->node[i]) | 13 | #define node(_t,_i) (&(_t)->node[_i]) |
14 | #define key(n) (&(n)->key) | 14 | #define val(_n) (&(_n)->val) |
15 | #define val(n) (&(n)->val) | ||
16 | 15 | ||
17 | #define luaH_get(t,k) luaH_set(NULL,t,k) | 16 | #define ttype_key(_n) ((_n)->key_tt) |
18 | #define luaH_getnum(t,k) luaH_setnum(NULL,t,k) | 17 | #define nvalue_key(_n) ((_n)->key_value.n) |
19 | #define luaH_getstr(t,k) luaH_setstr(NULL,t,k) | 18 | #define tsvalue_key(_n) ((TString *)(_n)->key_value.v) |
19 | #define setkey2obj(_o,_k) \ | ||
20 | ((_o)->tt = ttype_key(_k), (_o)->value = (_k)->key_value) | ||
21 | #define setobj2key(_k,_o) \ | ||
22 | (ttype_key(_k) = (_o)->tt, (_k)->key_value = (_o)->value) | ||
23 | |||
24 | #define luaH_get(_t,_k) luaH_set(NULL,_t,_k) | ||
25 | #define luaH_getnum(_t,_k) luaH_setnum(NULL,_t,_k) | ||
26 | #define luaH_getstr(_t,_k) luaH_setstr(NULL,_t,_k) | ||
20 | 27 | ||
21 | Hash *luaH_new (lua_State *L, int nhash); | 28 | Hash *luaH_new (lua_State *L, int nhash); |
22 | void luaH_free (lua_State *L, Hash *t); | 29 | void luaH_free (lua_State *L, Hash *t); |
@@ -27,7 +34,7 @@ TObject *luaH_setnum (lua_State *L, Hash *t, lua_Number key); | |||
27 | TObject *luaH_setstr (lua_State *L, Hash *t, TString *key); | 34 | TObject *luaH_setstr (lua_State *L, Hash *t, TString *key); |
28 | 35 | ||
29 | /* exported only for debugging */ | 36 | /* exported only for debugging */ |
30 | Node *luaH_mainposition (const Hash *t, const TObject *key); | 37 | Node *luaH_mainposition (const Hash *t, const Node *n); |
31 | 38 | ||
32 | 39 | ||
33 | #endif | 40 | #endif |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltests.c,v 1.58 2001/01/19 13:20:30 roberto Exp roberto $ | 2 | ** $Id: ltests.c,v 1.59 2001/01/22 18:01:38 roberto Exp roberto $ |
3 | ** Internal Module for Debugging of the Lua Implementation | 3 | ** Internal Module for Debugging of the Lua Implementation |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -182,9 +182,12 @@ static int hash_query (lua_State *L) { | |||
182 | } | 182 | } |
183 | else { | 183 | else { |
184 | Hash *t; | 184 | Hash *t; |
185 | Node n; | ||
186 | TObject *o = luaA_index(L, 1); | ||
185 | luaL_checktype(L, 2, LUA_TTABLE); | 187 | luaL_checktype(L, 2, LUA_TTABLE); |
186 | t = hvalue(luaA_index(L, 2)); | 188 | t = hvalue(luaA_index(L, 2)); |
187 | lua_pushnumber(L, luaH_mainposition(t, luaA_index(L, 1)) - t->node); | 189 | setobj2key(&n, o); |
190 | lua_pushnumber(L, luaH_mainposition(t, &n) - t->node); | ||
188 | } | 191 | } |
189 | return 1; | 192 | return 1; |
190 | } | 193 | } |
@@ -201,7 +204,9 @@ static int table_query (lua_State *L) { | |||
201 | return 2; | 204 | return 2; |
202 | } | 205 | } |
203 | else if (i < t->size) { | 206 | else if (i < t->size) { |
204 | luaA_pushobject(L, &t->node[i].key); | 207 | TObject o; |
208 | setkey2obj(&o, &t->node[i]); | ||
209 | luaA_pushobject(L, &o); | ||
205 | luaA_pushobject(L, &t->node[i].val); | 210 | luaA_pushobject(L, &t->node[i].val); |
206 | if (t->node[i].next) { | 211 | if (t->node[i].next) { |
207 | lua_pushnumber(L, t->node[i].next - t->node); | 212 | lua_pushnumber(L, t->node[i].next - t->node); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 1.159 2001/01/29 13:02:20 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.160 2001/01/29 15:26:40 roberto Exp roberto $ |
3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -662,7 +662,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
662 | else { | 662 | else { |
663 | Node *node = node(t, n); | 663 | Node *node = node(t, n); |
664 | setnvalue(top-3, n); /* index */ | 664 | setnvalue(top-3, n); /* index */ |
665 | setobj(top-2, key(node)); | 665 | setkey2obj(top-2, node); |
666 | setobj(top-1, val(node)); | 666 | setobj(top-1, val(node)); |
667 | dojump(pc, i); /* repeat loop */ | 667 | dojump(pc, i); /* repeat loop */ |
668 | } | 668 | } |