aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lapi.c10
-rw-r--r--ldebug.c6
-rw-r--r--lgc.c13
-rw-r--r--lobject.h8
-rw-r--r--ltable.c39
-rw-r--r--ltable.h23
-rw-r--r--ltests.c11
-rw-r--r--lvm.c4
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 @@
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;
diff --git a/ldebug.c b/ldebug.c
index 1a4c7f96..a914edfd 100644
--- a/ldebug.c
+++ b/ldebug.c
@@ -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}
diff --git a/lgc.c b/lgc.c
index 67fee0e2..c6c85f18 100644
--- a/lgc.c
+++ b/lgc.c
@@ -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 }
diff --git a/lobject.h b/lobject.h
index 79600a87..2afb8736 100644
--- a/lobject.h
+++ b/lobject.h
@@ -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
180typedef struct Node { 180typedef 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
186typedef struct Hash { 188typedef struct Hash {
187 Node *node; 189 Node *node;
188 int htag; 190 int htag;
diff --git a/ltable.c b/ltable.c
index f8352fe5..b8bc24c5 100644
--- a/ltable.c
+++ b/ltable.c
@@ -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*/
43Node *luaH_mainposition (const Hash *t, const TObject *key) { 43Node *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*/
160static TObject *newkey (lua_State *L, Hash *t, Node *mp, const TObject *key) { 165static 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);
diff --git a/ltable.h b/ltable.h
index cbdcf743..3757bd01 100644
--- a/ltable.h
+++ b/ltable.h
@@ -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
21Hash *luaH_new (lua_State *L, int nhash); 28Hash *luaH_new (lua_State *L, int nhash);
22void luaH_free (lua_State *L, Hash *t); 29void luaH_free (lua_State *L, Hash *t);
@@ -27,7 +34,7 @@ TObject *luaH_setnum (lua_State *L, Hash *t, lua_Number key);
27TObject *luaH_setstr (lua_State *L, Hash *t, TString *key); 34TObject *luaH_setstr (lua_State *L, Hash *t, TString *key);
28 35
29/* exported only for debugging */ 36/* exported only for debugging */
30Node *luaH_mainposition (const Hash *t, const TObject *key); 37Node *luaH_mainposition (const Hash *t, const Node *n);
31 38
32 39
33#endif 40#endif
diff --git a/ltests.c b/ltests.c
index ff841472..60bb2ea4 100644
--- a/ltests.c
+++ b/ltests.c
@@ -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);
diff --git a/lvm.c b/lvm.c
index 04b4a610..5c00648e 100644
--- a/lvm.c
+++ b/lvm.c
@@ -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 }