aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-06-06 13:31:41 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-06-06 13:31:41 -0300
commit8bcf6228765e56be19feb90c8805cc2fb2223188 (patch)
treece13072efce7a8aadcdde8de747073f3d7bf0859
parentdbbf6c073b4203169a0221a082f6d00ccb27754c (diff)
downloadlua-8bcf6228765e56be19feb90c8805cc2fb2223188.tar.gz
lua-8bcf6228765e56be19feb90c8805cc2fb2223188.tar.bz2
lua-8bcf6228765e56be19feb90c8805cc2fb2223188.zip
new signature for `luaH_set'
-rw-r--r--lapi.c4
-rw-r--r--lbuiltin.c26
-rw-r--r--ltable.c51
-rw-r--r--ltable.h10
-rw-r--r--lvm.c22
-rw-r--r--lvm.h3
6 files changed, 55 insertions, 61 deletions
diff --git a/lapi.c b/lapi.c
index fcc0ba51..a660aae2 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 1.81 2000/05/24 13:54:49 roberto Exp roberto $ 2** $Id: lapi.c,v 1.82 2000/05/26 19:17:57 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*/
@@ -144,7 +144,7 @@ void lua_rawset (lua_State *L) {
144 luaA_checkCargs(L, 3); 144 luaA_checkCargs(L, 3);
145 if (ttype(L->top-3) != TAG_TABLE) 145 if (ttype(L->top-3) != TAG_TABLE)
146 lua_error(L, "indexed expression not a table"); 146 lua_error(L, "indexed expression not a table");
147 luaH_set(L, avalue(L->top-3), L->top-2, L->top-1); 147 *luaH_set(L, avalue(L->top-3), L->top-2) = *(L->top-1);
148 L->top -= 3; 148 L->top -= 3;
149} 149}
150 150
diff --git a/lbuiltin.c b/lbuiltin.c
index 19cdb6d6..ac45f361 100644
--- a/lbuiltin.c
+++ b/lbuiltin.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lbuiltin.c,v 1.112 2000/06/02 19:08:56 roberto Exp roberto $ 2** $Id: lbuiltin.c,v 1.113 2000/06/05 20:15:33 roberto Exp roberto $
3** Built-in functions 3** Built-in functions
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -402,6 +402,13 @@ void luaB_getn (lua_State *L) {
402} 402}
403 403
404 404
405/* auxiliar function */
406static void t_move (lua_State *L, Hash *t, int from, int to) {
407 TObject *p = luaH_setint(L, t, to); /* may change following `get' */
408 *p = *luaH_getnum(t, from);
409}
410
411
405void luaB_tinsert (lua_State *L) { 412void luaB_tinsert (lua_State *L) {
406 Hash *a = gettable(L, 1); 413 Hash *a = gettable(L, 1);
407 lua_Object v = lua_getparam(L, 3); 414 lua_Object v = lua_getparam(L, 3);
@@ -413,10 +420,10 @@ void luaB_tinsert (lua_State *L) {
413 v = luaL_nonnullarg(L, 2); 420 v = luaL_nonnullarg(L, 2);
414 pos = n+1; 421 pos = n+1;
415 } 422 }
416 luaV_setn(L, a, n+1); /* a.n = n+1 */ 423 luaH_setstrnum(L, a, luaS_new(L, "n"), n+1); /* a.n = n+1 */
417 for (; n>=pos; n--) 424 for (; n>=pos; n--)
418 luaH_move(L, a, n, n+1); /* a[n+1] = a[n] */ 425 t_move(L, a, n, n+1); /* a[n+1] = a[n] */
419 luaH_setint(L, a, pos, v); /* a[pos] = v */ 426 *luaH_setint(L, a, pos) = *v; /* a[pos] = v */
420} 427}
421 428
422 429
@@ -427,9 +434,9 @@ void luaB_tremove (lua_State *L) {
427 if (n <= 0) return; /* table is "empty" */ 434 if (n <= 0) return; /* table is "empty" */
428 luaA_pushobject(L, luaH_getnum(a, pos)); /* result = a[pos] */ 435 luaA_pushobject(L, luaH_getnum(a, pos)); /* result = a[pos] */
429 for ( ;pos<n; pos++) 436 for ( ;pos<n; pos++)
430 luaH_move(L, a, pos+1, pos); /* a[pos] = a[pos+1] */ 437 t_move(L, a, pos+1, pos); /* a[pos] = a[pos+1] */
431 luaV_setn(L, a, n-1); /* a.n = n-1 */ 438 luaH_setstrnum(L, a, luaS_new(L, "n"), n-1); /* a.n = n-1 */
432 luaH_setint(L, a, n, &luaO_nilobject); /* a[n] = nil */ 439 ttype(luaH_setint(L, a, n)) = TAG_NIL; /* a[n] = nil */
433} 440}
434 441
435 442
@@ -478,11 +485,12 @@ static void luaB_foreach (lua_State *L) {
478** Addison-Wesley, 1993.) 485** Addison-Wesley, 1993.)
479*/ 486*/
480 487
488
481static void swap (lua_State *L, Hash *a, int i, int j) { 489static void swap (lua_State *L, Hash *a, int i, int j) {
482 TObject temp; 490 TObject temp;
483 temp = *luaH_getnum(a, i); 491 temp = *luaH_getnum(a, i);
484 luaH_move(L, a, j, i); 492 t_move(L, a, j, i);
485 luaH_setint(L, a, j, &temp); 493 *luaH_setint(L, a, j) = temp;
486} 494}
487 495
488static int sort_comp (lua_State *L, lua_Object f, const TObject *a, 496static int sort_comp (lua_State *L, lua_Object f, const TObject *a,
diff --git a/ltable.c b/ltable.c
index 4ffd2f9d..50307ada 100644
--- a/ltable.c
+++ b/ltable.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltable.c,v 1.44 2000/06/05 20:07:53 roberto Exp roberto $ 2** $Id: ltable.c,v 1.45 2000/06/05 20:15:33 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*/
@@ -193,12 +193,12 @@ static int numuse (const Hash *t) {
193static void rehash (lua_State *L, Hash *t) { 193static void rehash (lua_State *L, Hash *t) {
194 int oldsize = t->size; 194 int oldsize = t->size;
195 Node *nold = t->node; 195 Node *nold = t->node;
196 int newsize = numuse(t); 196 int nelems = numuse(t);
197 int i; 197 int i;
198 LUA_ASSERT(L, newsize<=oldsize, "wrong count"); 198 LUA_ASSERT(L, nelems<=oldsize, "wrong count");
199 if (newsize >= oldsize-oldsize/4) /* using more than 3/4? */ 199 if (nelems >= oldsize-oldsize/4) /* using more than 3/4? */
200 setnodevector(L, t, (lint32)oldsize*2); 200 setnodevector(L, t, (lint32)oldsize*2);
201 else if (newsize <= oldsize/4 && /* less than 1/4? */ 201 else if (nelems <= oldsize/4 && /* less than 1/4? */
202 oldsize > MINPOWER2) 202 oldsize > MINPOWER2)
203 setnodevector(L, t, oldsize/2); 203 setnodevector(L, t, oldsize/2);
204 else 204 else
@@ -207,35 +207,28 @@ static void rehash (lua_State *L, Hash *t) {
207 for (i=0; i<oldsize; i++) { 207 for (i=0; i<oldsize; i++) {
208 Node *old = nold+i; 208 Node *old = nold+i;
209 if (ttype(&old->val) != TAG_NIL) 209 if (ttype(&old->val) != TAG_NIL)
210 luaH_set(L, t, &old->key, &old->val); 210 *luaH_set(L, t, &old->key) = old->val;
211 } 211 }
212 luaM_free(L, nold); /* free old array */ 212 luaM_free(L, nold); /* free old array */
213} 213}
214 214
215 215
216/* 216/*
217** sets a pair key-value in a hash table; first, check whether key is 217** inserts a key into a hash table; first, check whether key is
218** already present; if not, check whether key's main position is free; 218** already present; if not, check whether key's main position is free;
219** if not, check whether colliding node is in its main position or not; 219** if not, check whether colliding node is in its main position or not;
220** if it is not, move colliding node to an empty place and put new pair 220** if it is not, move colliding node to an empty place and put new key
221** in its main position; otherwise (colliding node is in its main position), 221** in its main position; otherwise (colliding node is in its main position),
222** new pair goes to an empty position. 222** new key goes to an empty position.
223** Tricky point: the only place where an old element is moved is when
224** we move the colliding node to an empty place; nevertheless, its old
225** value is still in that position until we set the value for the new
226** pair; therefore, even when `val' points to an element of this table
227** (this happens when we use `luaH_move'), there is no problem.
228*/ 223*/
229void luaH_set (lua_State *L, Hash *t, const TObject *key, const TObject *val) { 224TObject *luaH_set (lua_State *L, Hash *t, const TObject *key) {
230 Node *mp = luaH_mainposition(t, key); 225 Node *mp = luaH_mainposition(t, key);
231 Node *n = mp; 226 Node *n = mp;
232 if (!mp) 227 if (!mp)
233 lua_error(L, "unexpected type to index table"); 228 lua_error(L, "unexpected type to index table");
234 do { /* check whether `key' is somewhere in the chain */ 229 do { /* check whether `key' is somewhere in the chain */
235 if (luaO_equalObj(key, &n->key)) { 230 if (luaO_equalObj(key, &n->key))
236 n->val = *val; /* update value */ 231 return &n->val; /* that's all */
237 return; /* that's all */
238 }
239 else n = n->next; 232 else n = n->next;
240 } while (n); 233 } while (n);
241 /* `key' not found; must insert it */ 234 /* `key' not found; must insert it */
@@ -243,7 +236,7 @@ void luaH_set (lua_State *L, Hash *t, const TObject *key, const TObject *val) {
243 Node *othern; /* main position of colliding node */ 236 Node *othern; /* main position of colliding node */
244 n = t->firstfree; /* get a free place */ 237 n = t->firstfree; /* get a free place */
245 /* is colliding node out of its main position? (can only happens if 238 /* is colliding node out of its main position? (can only happens if
246 its position if after "firstfree") */ 239 its position is after "firstfree") */
247 if (mp > n && (othern=luaH_mainposition(t, &mp->key)) != mp) { 240 if (mp > n && (othern=luaH_mainposition(t, &mp->key)) != mp) {
248 /* yes; move colliding node into free position */ 241 /* yes; move colliding node into free position */
249 while (othern->next != mp) othern = othern->next; /* find previous */ 242 while (othern->next != mp) othern = othern->next; /* find previous */
@@ -259,30 +252,32 @@ void luaH_set (lua_State *L, Hash *t, const TObject *key, const TObject *val) {
259 } 252 }
260 } 253 }
261 mp->key = *key; 254 mp->key = *key;
262 mp->val = *val; 255 for (;;) { /* correct `firstfree' */
263 for (;;) { /* check free places */
264 if (ttype(&t->firstfree->key) == TAG_NIL) 256 if (ttype(&t->firstfree->key) == TAG_NIL)
265 return; /* OK; table still has a free place */ 257 return &mp->val; /* OK; table still has a free place */
266 else if (t->firstfree == t->node) break; /* cannot decrement from here */ 258 else if (t->firstfree == t->node) break; /* cannot decrement from here */
267 else (t->firstfree)--; 259 else (t->firstfree)--;
268 } 260 }
269 rehash(L, t); /* no more free places */ 261 rehash(L, t); /* no more free places */
262 return luaH_set(L, t, key); /* `rehash' invalidates this insertion */
270} 263}
271 264
272 265
273void luaH_setint (lua_State *L, Hash *t, int key, const TObject *val) { 266TObject *luaH_setint (lua_State *L, Hash *t, int key) {
274 TObject index; 267 TObject index;
275 ttype(&index) = TAG_NUMBER; 268 ttype(&index) = TAG_NUMBER;
276 nvalue(&index) = key; 269 nvalue(&index) = key;
277 luaH_set(L, t, &index, val); 270 return luaH_set(L, t, &index);
278} 271}
279 272
280 273
281void luaH_setstr (lua_State *L, Hash *t, TString *key, const TObject *val) { 274void luaH_setstrnum (lua_State *L, Hash *t, TString *key, Number val) {
282 TObject index; 275 TObject *value, index;
283 ttype(&index) = TAG_STRING; 276 ttype(&index) = TAG_STRING;
284 tsvalue(&index) = key; 277 tsvalue(&index) = key;
285 luaH_set(L, t, &index, val); 278 value = luaH_set(L, t, &index);
279 ttype(value) = TAG_NUMBER;
280 nvalue(value) = val;
286} 281}
287 282
288 283
diff --git a/ltable.h b/ltable.h
index 52053f8f..458075b6 100644
--- a/ltable.h
+++ b/ltable.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltable.h,v 1.21 2000/06/05 20:07:53 roberto Exp roberto $ 2** $Id: ltable.h,v 1.22 2000/06/05 20:15:33 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*/
@@ -14,18 +14,16 @@
14#define key(n) (&(n)->key) 14#define key(n) (&(n)->key)
15#define val(n) (&(n)->val) 15#define val(n) (&(n)->val)
16 16
17#define luaH_move(L, t,from,to) (luaH_setint(L, t, to, luaH_getnum(t, from)))
18
19Hash *luaH_new (lua_State *L, int nhash); 17Hash *luaH_new (lua_State *L, int nhash);
20void luaH_free (lua_State *L, Hash *t); 18void luaH_free (lua_State *L, Hash *t);
21const TObject *luaH_get (lua_State *L, const Hash *t, const TObject *key); 19const TObject *luaH_get (lua_State *L, const Hash *t, const TObject *key);
22const TObject *luaH_getnum (const Hash *t, Number key); 20const TObject *luaH_getnum (const Hash *t, Number key);
23const TObject *luaH_getstr (const Hash *t, TString *key); 21const TObject *luaH_getstr (const Hash *t, TString *key);
24void luaH_remove (Hash *t, TObject *key); 22void luaH_remove (Hash *t, TObject *key);
25void luaH_set (lua_State *L, Hash *t, const TObject *key, const TObject *val); 23TObject *luaH_set (lua_State *L, Hash *t, const TObject *key);
26int luaH_pos (lua_State *L, const Hash *t, const TObject *r); 24int luaH_pos (lua_State *L, const Hash *t, const TObject *r);
27void luaH_setint (lua_State *L, Hash *t, int key, const TObject *val); 25TObject *luaH_setint (lua_State *L, Hash *t, int key);
28void luaH_setstr (lua_State *L, Hash *t, TString *key, const TObject *val); 26void luaH_setstrnum (lua_State *L, Hash *t, TString *key, Number val);
29unsigned long luaH_hash (lua_State *L, const TObject *key); 27unsigned long luaH_hash (lua_State *L, const TObject *key);
30const TObject *luaH_getglobal (lua_State *L, const char *name); 28const TObject *luaH_getglobal (lua_State *L, const char *name);
31 29
diff --git a/lvm.c b/lvm.c
index c264fd96..76661bfb 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.111 2000/06/05 14:56:18 roberto Exp roberto $ 2** $Id: lvm.c,v 1.112 2000/06/05 20:15:33 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*/
@@ -65,13 +65,6 @@ int luaV_tostring (lua_State *L, TObject *obj) { /* LUA_NUMBER */
65} 65}
66 66
67 67
68void luaV_setn (lua_State *L, Hash *t, int val) {
69 TObject value;
70 ttype(&value) = TAG_NUMBER; nvalue(&value) = val;
71 luaH_setstr(L, t, luaS_new(L, "n"), &value);
72}
73
74
75static Closure *luaV_closure (lua_State *L, lua_Type t, int nelems) { 68static Closure *luaV_closure (lua_State *L, lua_Type t, int nelems) {
76 Closure *c = luaF_newclosure(L, nelems); 69 Closure *c = luaF_newclosure(L, nelems);
77 L->top -= nelems; 70 L->top -= nelems;
@@ -147,7 +140,7 @@ void luaV_settable (lua_State *L, StkId t, StkId top) {
147 else { /* object is a table... */ 140 else { /* object is a table... */
148 im = luaT_getim(L, avalue(t)->htag, IM_SETTABLE); 141 im = luaT_getim(L, avalue(t)->htag, IM_SETTABLE);
149 if (ttype(im) == TAG_NIL) { /* and does not have a `settable' method */ 142 if (ttype(im) == TAG_NIL) { /* and does not have a `settable' method */
150 luaH_set(L, avalue(t), t+1, top-1); 143 *luaH_set(L, avalue(t), t+1) = *(top-1);
151 return; 144 return;
152 } 145 }
153 /* else it has a `settable' method, go through to next command */ 146 /* else it has a `settable' method, go through to next command */
@@ -191,7 +184,7 @@ void luaV_setglobal (lua_State *L, TString *s, StkId top) {
191 TObject key; 184 TObject key;
192 ttype(&key) = TAG_STRING; 185 ttype(&key) = TAG_STRING;
193 tsvalue(&key) = s; 186 tsvalue(&key) = s;
194 luaH_set(L, L->gt, &key, top-1); 187 *luaH_set(L, L->gt, &key) = *(top-1);
195 } 188 }
196 } 189 }
197 else { 190 else {
@@ -311,8 +304,9 @@ void luaV_pack (lua_State *L, StkId firstelem, int nvararg, TObject *tab) {
311 htab = avalue(tab) = luaH_new(L, nvararg+1); /* +1 for field `n' */ 304 htab = avalue(tab) = luaH_new(L, nvararg+1); /* +1 for field `n' */
312 ttype(tab) = TAG_TABLE; 305 ttype(tab) = TAG_TABLE;
313 for (i=0; i<nvararg; i++) 306 for (i=0; i<nvararg; i++)
314 luaH_setint(L, htab, i+1, firstelem+i); 307 *luaH_setint(L, htab, i+1) = *(firstelem+i);
315 luaV_setn(L, htab, nvararg); /* store counter in field `n' */ 308 /* store counter in field `n' */
309 luaH_setstrnum(L, htab, luaS_new(L, "n"), nvararg);
316} 310}
317 311
318 312
@@ -476,7 +470,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) {
476 Hash *arr = avalue(top-n-1); 470 Hash *arr = avalue(top-n-1);
477 L->top = top-n; /* final value of `top' (in case of errors) */ 471 L->top = top-n; /* final value of `top' (in case of errors) */
478 for (; n; n--) 472 for (; n; n--)
479 luaH_setint(L, arr, n+aux, --top); 473 *luaH_setint(L, arr, n+aux) = *(--top);
480 break; 474 break;
481 } 475 }
482 476
@@ -486,8 +480,8 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) {
486 Hash *arr = avalue(finaltop-1); 480 Hash *arr = avalue(finaltop-1);
487 L->top = finaltop; /* final value of `top' (in case of errors) */ 481 L->top = finaltop; /* final value of `top' (in case of errors) */
488 for (; n; n--) { 482 for (; n; n--) {
489 luaH_set(L, arr, top-2, top-1);
490 top-=2; 483 top-=2;
484 *luaH_set(L, arr, top) = *(top+1);
491 } 485 }
492 break; 486 break;
493 } 487 }
diff --git a/lvm.h b/lvm.h
index ae57346b..01fc6f92 100644
--- a/lvm.h
+++ b/lvm.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.h,v 1.21 2000/04/19 13:36:25 roberto Exp roberto $ 2** $Id: lvm.h,v 1.22 2000/05/08 19:32:53 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*/
@@ -20,7 +20,6 @@
20void luaV_pack (lua_State *L, StkId firstel, int nvararg, TObject *tab); 20void luaV_pack (lua_State *L, StkId firstel, int nvararg, TObject *tab);
21int luaV_tonumber (TObject *obj); 21int luaV_tonumber (TObject *obj);
22int luaV_tostring (lua_State *L, TObject *obj); 22int luaV_tostring (lua_State *L, TObject *obj);
23void luaV_setn (lua_State *L, Hash *t, int val);
24void luaV_gettable (lua_State *L, StkId top); 23void luaV_gettable (lua_State *L, StkId top);
25void luaV_settable (lua_State *L, StkId t, StkId top); 24void luaV_settable (lua_State *L, StkId t, StkId top);
26void luaV_getglobal (lua_State *L, TString *s, StkId top); 25void luaV_getglobal (lua_State *L, TString *s, StkId top);