1
0
mirror of https://github.com/lua/lua.git synced 2025-02-04 06:13:04 +08:00

new signature for `luaH_set'

This commit is contained in:
Roberto Ierusalimschy 2000-06-06 13:31:41 -03:00
parent dbbf6c073b
commit 8bcf622876
6 changed files with 55 additions and 61 deletions

4
lapi.c
View File

@ -1,5 +1,5 @@
/* /*
** $Id: lapi.c,v 1.81 2000/05/24 13:54:49 roberto Exp roberto $ ** $Id: lapi.c,v 1.82 2000/05/26 19:17:57 roberto Exp roberto $
** Lua API ** Lua API
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -144,7 +144,7 @@ void lua_rawset (lua_State *L) {
luaA_checkCargs(L, 3); luaA_checkCargs(L, 3);
if (ttype(L->top-3) != TAG_TABLE) if (ttype(L->top-3) != TAG_TABLE)
lua_error(L, "indexed expression not a table"); lua_error(L, "indexed expression not a table");
luaH_set(L, avalue(L->top-3), L->top-2, L->top-1); *luaH_set(L, avalue(L->top-3), L->top-2) = *(L->top-1);
L->top -= 3; L->top -= 3;
} }

View File

@ -1,5 +1,5 @@
/* /*
** $Id: lbuiltin.c,v 1.112 2000/06/02 19:08:56 roberto Exp roberto $ ** $Id: lbuiltin.c,v 1.113 2000/06/05 20:15:33 roberto Exp roberto $
** Built-in functions ** Built-in functions
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -402,6 +402,13 @@ void luaB_getn (lua_State *L) {
} }
/* auxiliar function */
static void t_move (lua_State *L, Hash *t, int from, int to) {
TObject *p = luaH_setint(L, t, to); /* may change following `get' */
*p = *luaH_getnum(t, from);
}
void luaB_tinsert (lua_State *L) { void luaB_tinsert (lua_State *L) {
Hash *a = gettable(L, 1); Hash *a = gettable(L, 1);
lua_Object v = lua_getparam(L, 3); lua_Object v = lua_getparam(L, 3);
@ -413,10 +420,10 @@ void luaB_tinsert (lua_State *L) {
v = luaL_nonnullarg(L, 2); v = luaL_nonnullarg(L, 2);
pos = n+1; pos = n+1;
} }
luaV_setn(L, a, n+1); /* a.n = n+1 */ luaH_setstrnum(L, a, luaS_new(L, "n"), n+1); /* a.n = n+1 */
for (; n>=pos; n--) for (; n>=pos; n--)
luaH_move(L, a, n, n+1); /* a[n+1] = a[n] */ t_move(L, a, n, n+1); /* a[n+1] = a[n] */
luaH_setint(L, a, pos, v); /* a[pos] = v */ *luaH_setint(L, a, pos) = *v; /* a[pos] = v */
} }
@ -427,9 +434,9 @@ void luaB_tremove (lua_State *L) {
if (n <= 0) return; /* table is "empty" */ if (n <= 0) return; /* table is "empty" */
luaA_pushobject(L, luaH_getnum(a, pos)); /* result = a[pos] */ luaA_pushobject(L, luaH_getnum(a, pos)); /* result = a[pos] */
for ( ;pos<n; pos++) for ( ;pos<n; pos++)
luaH_move(L, a, pos+1, pos); /* a[pos] = a[pos+1] */ t_move(L, a, pos+1, pos); /* a[pos] = a[pos+1] */
luaV_setn(L, a, n-1); /* a.n = n-1 */ luaH_setstrnum(L, a, luaS_new(L, "n"), n-1); /* a.n = n-1 */
luaH_setint(L, a, n, &luaO_nilobject); /* a[n] = nil */ ttype(luaH_setint(L, a, n)) = TAG_NIL; /* a[n] = nil */
} }
@ -478,11 +485,12 @@ static void luaB_foreach (lua_State *L) {
** Addison-Wesley, 1993.) ** Addison-Wesley, 1993.)
*/ */
static void swap (lua_State *L, Hash *a, int i, int j) { static void swap (lua_State *L, Hash *a, int i, int j) {
TObject temp; TObject temp;
temp = *luaH_getnum(a, i); temp = *luaH_getnum(a, i);
luaH_move(L, a, j, i); t_move(L, a, j, i);
luaH_setint(L, a, j, &temp); *luaH_setint(L, a, j) = temp;
} }
static int sort_comp (lua_State *L, lua_Object f, const TObject *a, static int sort_comp (lua_State *L, lua_Object f, const TObject *a,

View File

@ -1,5 +1,5 @@
/* /*
** $Id: ltable.c,v 1.44 2000/06/05 20:07:53 roberto Exp roberto $ ** $Id: ltable.c,v 1.45 2000/06/05 20:15:33 roberto Exp roberto $
** Lua tables (hash) ** Lua tables (hash)
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -193,12 +193,12 @@ static int numuse (const Hash *t) {
static void rehash (lua_State *L, Hash *t) { static void rehash (lua_State *L, Hash *t) {
int oldsize = t->size; int oldsize = t->size;
Node *nold = t->node; Node *nold = t->node;
int newsize = numuse(t); int nelems = numuse(t);
int i; int i;
LUA_ASSERT(L, newsize<=oldsize, "wrong count"); LUA_ASSERT(L, nelems<=oldsize, "wrong count");
if (newsize >= oldsize-oldsize/4) /* using more than 3/4? */ if (nelems >= oldsize-oldsize/4) /* using more than 3/4? */
setnodevector(L, t, (lint32)oldsize*2); setnodevector(L, t, (lint32)oldsize*2);
else if (newsize <= oldsize/4 && /* less than 1/4? */ else if (nelems <= oldsize/4 && /* less than 1/4? */
oldsize > MINPOWER2) oldsize > MINPOWER2)
setnodevector(L, t, oldsize/2); setnodevector(L, t, oldsize/2);
else else
@ -207,35 +207,28 @@ static void rehash (lua_State *L, Hash *t) {
for (i=0; i<oldsize; i++) { for (i=0; i<oldsize; i++) {
Node *old = nold+i; Node *old = nold+i;
if (ttype(&old->val) != TAG_NIL) if (ttype(&old->val) != TAG_NIL)
luaH_set(L, t, &old->key, &old->val); *luaH_set(L, t, &old->key) = old->val;
} }
luaM_free(L, nold); /* free old array */ luaM_free(L, nold); /* free old array */
} }
/* /*
** sets a pair key-value in a hash table; first, check whether key is ** inserts a key into a hash table; first, check whether key is
** already present; if not, check whether key's main position is free; ** already present; if not, check whether key's main position is free;
** if not, check whether colliding node is in its main position or not; ** if not, check whether colliding node is in its main position or not;
** if it is not, move colliding node to an empty place and put new pair ** if it is not, move colliding node to an empty place and put new key
** in its main position; otherwise (colliding node is in its main position), ** in its main position; otherwise (colliding node is in its main position),
** new pair goes to an empty position. ** new key goes to an empty position.
** Tricky point: the only place where an old element is moved is when
** we move the colliding node to an empty place; nevertheless, its old
** value is still in that position until we set the value for the new
** pair; therefore, even when `val' points to an element of this table
** (this happens when we use `luaH_move'), there is no problem.
*/ */
void luaH_set (lua_State *L, Hash *t, const TObject *key, const TObject *val) { TObject *luaH_set (lua_State *L, Hash *t, const TObject *key) {
Node *mp = luaH_mainposition(t, key); Node *mp = luaH_mainposition(t, key);
Node *n = mp; Node *n = mp;
if (!mp) if (!mp)
lua_error(L, "unexpected type to index table"); lua_error(L, "unexpected type to index table");
do { /* check whether `key' is somewhere in the chain */ do { /* check whether `key' is somewhere in the chain */
if (luaO_equalObj(key, &n->key)) { if (luaO_equalObj(key, &n->key))
n->val = *val; /* update value */ return &n->val; /* that's all */
return; /* that's all */
}
else n = n->next; else n = n->next;
} while (n); } while (n);
/* `key' not found; must insert it */ /* `key' not found; must insert it */
@ -243,7 +236,7 @@ void luaH_set (lua_State *L, Hash *t, const TObject *key, const TObject *val) {
Node *othern; /* main position of colliding node */ Node *othern; /* main position of colliding node */
n = t->firstfree; /* get a free place */ n = t->firstfree; /* get a free place */
/* is colliding node out of its main position? (can only happens if /* is colliding node out of its main position? (can only happens if
its position if after "firstfree") */ its position is after "firstfree") */
if (mp > n && (othern=luaH_mainposition(t, &mp->key)) != mp) { if (mp > n && (othern=luaH_mainposition(t, &mp->key)) != mp) {
/* yes; move colliding node into free position */ /* yes; move colliding node into free position */
while (othern->next != mp) othern = othern->next; /* find previous */ 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) {
} }
} }
mp->key = *key; mp->key = *key;
mp->val = *val; for (;;) { /* correct `firstfree' */
for (;;) { /* check free places */
if (ttype(&t->firstfree->key) == TAG_NIL) if (ttype(&t->firstfree->key) == TAG_NIL)
return; /* OK; table still has a free place */ return &mp->val; /* OK; table still has a free place */
else if (t->firstfree == t->node) break; /* cannot decrement from here */ else if (t->firstfree == t->node) break; /* cannot decrement from here */
else (t->firstfree)--; else (t->firstfree)--;
} }
rehash(L, t); /* no more free places */ rehash(L, t); /* no more free places */
return luaH_set(L, t, key); /* `rehash' invalidates this insertion */
} }
void luaH_setint (lua_State *L, Hash *t, int key, const TObject *val) { TObject *luaH_setint (lua_State *L, Hash *t, int key) {
TObject index; TObject index;
ttype(&index) = TAG_NUMBER; ttype(&index) = TAG_NUMBER;
nvalue(&index) = key; nvalue(&index) = key;
luaH_set(L, t, &index, val); return luaH_set(L, t, &index);
} }
void luaH_setstr (lua_State *L, Hash *t, TString *key, const TObject *val) { void luaH_setstrnum (lua_State *L, Hash *t, TString *key, Number val) {
TObject index; TObject *value, index;
ttype(&index) = TAG_STRING; ttype(&index) = TAG_STRING;
tsvalue(&index) = key; tsvalue(&index) = key;
luaH_set(L, t, &index, val); value = luaH_set(L, t, &index);
ttype(value) = TAG_NUMBER;
nvalue(value) = val;
} }

View File

@ -1,5 +1,5 @@
/* /*
** $Id: ltable.h,v 1.21 2000/06/05 20:07:53 roberto Exp roberto $ ** $Id: ltable.h,v 1.22 2000/06/05 20:15:33 roberto Exp roberto $
** Lua tables (hash) ** Lua tables (hash)
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -14,18 +14,16 @@
#define key(n) (&(n)->key) #define key(n) (&(n)->key)
#define val(n) (&(n)->val) #define val(n) (&(n)->val)
#define luaH_move(L, t,from,to) (luaH_setint(L, t, to, luaH_getnum(t, from)))
Hash *luaH_new (lua_State *L, int nhash); Hash *luaH_new (lua_State *L, int nhash);
void luaH_free (lua_State *L, Hash *t); void luaH_free (lua_State *L, Hash *t);
const TObject *luaH_get (lua_State *L, const Hash *t, const TObject *key); const TObject *luaH_get (lua_State *L, const Hash *t, const TObject *key);
const TObject *luaH_getnum (const Hash *t, Number key); const TObject *luaH_getnum (const Hash *t, Number key);
const TObject *luaH_getstr (const Hash *t, TString *key); const TObject *luaH_getstr (const Hash *t, TString *key);
void luaH_remove (Hash *t, TObject *key); void luaH_remove (Hash *t, TObject *key);
void luaH_set (lua_State *L, Hash *t, const TObject *key, const TObject *val); TObject *luaH_set (lua_State *L, Hash *t, const TObject *key);
int luaH_pos (lua_State *L, const Hash *t, const TObject *r); int luaH_pos (lua_State *L, const Hash *t, const TObject *r);
void luaH_setint (lua_State *L, Hash *t, int key, const TObject *val); TObject *luaH_setint (lua_State *L, Hash *t, int key);
void luaH_setstr (lua_State *L, Hash *t, TString *key, const TObject *val); void luaH_setstrnum (lua_State *L, Hash *t, TString *key, Number val);
unsigned long luaH_hash (lua_State *L, const TObject *key); unsigned long luaH_hash (lua_State *L, const TObject *key);
const TObject *luaH_getglobal (lua_State *L, const char *name); const TObject *luaH_getglobal (lua_State *L, const char *name);

22
lvm.c
View File

@ -1,5 +1,5 @@
/* /*
** $Id: lvm.c,v 1.111 2000/06/05 14:56:18 roberto Exp roberto $ ** $Id: lvm.c,v 1.112 2000/06/05 20:15:33 roberto Exp roberto $
** Lua virtual machine ** Lua virtual machine
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -65,13 +65,6 @@ int luaV_tostring (lua_State *L, TObject *obj) { /* LUA_NUMBER */
} }
void luaV_setn (lua_State *L, Hash *t, int val) {
TObject value;
ttype(&value) = TAG_NUMBER; nvalue(&value) = val;
luaH_setstr(L, t, luaS_new(L, "n"), &value);
}
static Closure *luaV_closure (lua_State *L, lua_Type t, int nelems) { static Closure *luaV_closure (lua_State *L, lua_Type t, int nelems) {
Closure *c = luaF_newclosure(L, nelems); Closure *c = luaF_newclosure(L, nelems);
L->top -= nelems; L->top -= nelems;
@ -147,7 +140,7 @@ void luaV_settable (lua_State *L, StkId t, StkId top) {
else { /* object is a table... */ else { /* object is a table... */
im = luaT_getim(L, avalue(t)->htag, IM_SETTABLE); im = luaT_getim(L, avalue(t)->htag, IM_SETTABLE);
if (ttype(im) == TAG_NIL) { /* and does not have a `settable' method */ if (ttype(im) == TAG_NIL) { /* and does not have a `settable' method */
luaH_set(L, avalue(t), t+1, top-1); *luaH_set(L, avalue(t), t+1) = *(top-1);
return; return;
} }
/* else it has a `settable' method, go through to next command */ /* 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) {
TObject key; TObject key;
ttype(&key) = TAG_STRING; ttype(&key) = TAG_STRING;
tsvalue(&key) = s; tsvalue(&key) = s;
luaH_set(L, L->gt, &key, top-1); *luaH_set(L, L->gt, &key) = *(top-1);
} }
} }
else { else {
@ -311,8 +304,9 @@ void luaV_pack (lua_State *L, StkId firstelem, int nvararg, TObject *tab) {
htab = avalue(tab) = luaH_new(L, nvararg+1); /* +1 for field `n' */ htab = avalue(tab) = luaH_new(L, nvararg+1); /* +1 for field `n' */
ttype(tab) = TAG_TABLE; ttype(tab) = TAG_TABLE;
for (i=0; i<nvararg; i++) for (i=0; i<nvararg; i++)
luaH_setint(L, htab, i+1, firstelem+i); *luaH_setint(L, htab, i+1) = *(firstelem+i);
luaV_setn(L, htab, nvararg); /* store counter in field `n' */ /* store counter in field `n' */
luaH_setstrnum(L, htab, luaS_new(L, "n"), nvararg);
} }
@ -476,7 +470,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) {
Hash *arr = avalue(top-n-1); Hash *arr = avalue(top-n-1);
L->top = top-n; /* final value of `top' (in case of errors) */ L->top = top-n; /* final value of `top' (in case of errors) */
for (; n; n--) for (; n; n--)
luaH_setint(L, arr, n+aux, --top); *luaH_setint(L, arr, n+aux) = *(--top);
break; break;
} }
@ -486,8 +480,8 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) {
Hash *arr = avalue(finaltop-1); Hash *arr = avalue(finaltop-1);
L->top = finaltop; /* final value of `top' (in case of errors) */ L->top = finaltop; /* final value of `top' (in case of errors) */
for (; n; n--) { for (; n; n--) {
luaH_set(L, arr, top-2, top-1);
top-=2; top-=2;
*luaH_set(L, arr, top) = *(top+1);
} }
break; break;
} }

3
lvm.h
View File

@ -1,5 +1,5 @@
/* /*
** $Id: lvm.h,v 1.21 2000/04/19 13:36:25 roberto Exp roberto $ ** $Id: lvm.h,v 1.22 2000/05/08 19:32:53 roberto Exp roberto $
** Lua virtual machine ** Lua virtual machine
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -20,7 +20,6 @@
void luaV_pack (lua_State *L, StkId firstel, int nvararg, TObject *tab); void luaV_pack (lua_State *L, StkId firstel, int nvararg, TObject *tab);
int luaV_tonumber (TObject *obj); int luaV_tonumber (TObject *obj);
int luaV_tostring (lua_State *L, TObject *obj); int luaV_tostring (lua_State *L, TObject *obj);
void luaV_setn (lua_State *L, Hash *t, int val);
void luaV_gettable (lua_State *L, StkId top); void luaV_gettable (lua_State *L, StkId top);
void luaV_settable (lua_State *L, StkId t, StkId top); void luaV_settable (lua_State *L, StkId t, StkId top);
void luaV_getglobal (lua_State *L, TString *s, StkId top); void luaV_getglobal (lua_State *L, TString *s, StkId top);