mirror of
https://github.com/lua/lua
synced 2025-03-25 15:12:51 +03:00
smaller tables for machines with 8-bit alignment
This commit is contained in:
parent
fa8c44b510
commit
6b71a9cfe5
10
lapi.c
10
lapi.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: lapi.c,v 1.120 2001/01/25 16:45:36 roberto Exp roberto $
|
||||
** $Id: lapi.c,v 1.121 2001/01/26 11:45:51 roberto Exp roberto $
|
||||
** Lua API
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -646,7 +646,7 @@ LUA_API int lua_next (lua_State *L, int index) {
|
||||
lua_assert(ttype(t) == LUA_TTABLE);
|
||||
n = luaH_next(L, hvalue(t), luaA_index(L, -1));
|
||||
if (n) {
|
||||
setobj(L->top-1, key(n));
|
||||
setkey2obj(L->top-1, n);
|
||||
setobj(L->top, val(n));
|
||||
api_incr_top(L);
|
||||
more = 1;
|
||||
@ -674,10 +674,10 @@ LUA_API int lua_getn (lua_State *L, int index) {
|
||||
int i = h->size;
|
||||
Node *nd = h->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;
|
||||
|
6
ldebug.c
6
ldebug.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: ldebug.c,v 1.56 2001/01/25 16:45:36 roberto Exp roberto $
|
||||
** $Id: ldebug.c,v 1.57 2001/01/26 11:45:51 roberto Exp roberto $
|
||||
** Debug Interface
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -248,8 +248,8 @@ static const char *travglobals (lua_State *L, const TObject *o) {
|
||||
int i;
|
||||
for (i=0; i<g->size; i++) {
|
||||
if (luaO_equalObj(o, val(node(g, i))) &&
|
||||
ttype(key(node(g, i))) == LUA_TSTRING)
|
||||
return tsvalue(key(node(g, i)))->str;
|
||||
ttype_key(node(g, i)) == LUA_TSTRING)
|
||||
return tsvalue_key(node(g, i))->str;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
13
lgc.c
13
lgc.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: lgc.c,v 1.80 2001/01/26 13:18:00 roberto Exp roberto $
|
||||
** $Id: lgc.c,v 1.81 2001/01/26 14:16:24 roberto Exp roberto $
|
||||
** Garbage Collector
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -133,11 +133,16 @@ static void traversetable (GCState *st, Hash *h) {
|
||||
for (i=0; i<h->size; i++) {
|
||||
Node *n = node(h, i);
|
||||
if (ttype(val(n)) == LUA_TNIL) {
|
||||
if (ttype(key(n)) != LUA_TNIL)
|
||||
sethvalue(key(n), NULL); /* dead key; remove it */
|
||||
if (ttype_key(n) != LUA_TNIL)
|
||||
n->key_value.v = NULL; /* dead key; remove it */
|
||||
}
|
||||
else {
|
||||
markobject(st, &n->key);
|
||||
lua_assert(ttype_key(n) != LUA_TNIL);
|
||||
if (ttype_key(n) != LUA_TNUMBER) {
|
||||
TObject o;
|
||||
setkey2obj(&o, n);
|
||||
markobject(st, &o);
|
||||
}
|
||||
markobject(st, &n->val);
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: lobject.h,v 1.88 2001/01/25 16:45:36 roberto Exp roberto $
|
||||
** $Id: lobject.h,v 1.89 2001/01/26 15:58:50 roberto Exp roberto $
|
||||
** Type definitions for Lua objects
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -178,11 +178,13 @@ typedef struct Closure {
|
||||
|
||||
|
||||
typedef struct Node {
|
||||
TObject key;
|
||||
TObject val;
|
||||
struct Node *next; /* for chaining */
|
||||
int key_tt; /* (break object to save padding space) */
|
||||
Value key_value;
|
||||
TObject val;
|
||||
} Node;
|
||||
|
||||
|
||||
typedef struct Hash {
|
||||
Node *node;
|
||||
int htag;
|
||||
|
39
ltable.c
39
ltable.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: ltable.c,v 1.70 2001/01/26 15:58:50 roberto Exp roberto $
|
||||
** $Id: ltable.c,v 1.71 2001/01/29 13:02:20 roberto Exp roberto $
|
||||
** Lua tables (hash)
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -40,14 +40,14 @@
|
||||
** returns the `main' position of an element in a table (that is, the index
|
||||
** of its hash value)
|
||||
*/
|
||||
Node *luaH_mainposition (const Hash *t, const TObject *key) {
|
||||
switch (ttype(key)) {
|
||||
Node *luaH_mainposition (const Hash *t, const Node *n) {
|
||||
switch (ttype_key(n)) {
|
||||
case LUA_TNUMBER:
|
||||
return hashnum(t, nvalue(key));
|
||||
return hashnum(t, nvalue_key(n));
|
||||
case LUA_TSTRING:
|
||||
return hashstr(t, tsvalue(key));
|
||||
return hashstr(t, tsvalue_key(n));
|
||||
default: /* all other types are hashed as (void *) */
|
||||
return hashpointer(t, hvalue(key));
|
||||
return hashpointer(t, tsvalue_key(n));
|
||||
}
|
||||
}
|
||||
|
||||
@ -87,9 +87,9 @@ static void setnodevector (lua_State *L, Hash *t, luint32 size) {
|
||||
luaD_error(L, "table overflow");
|
||||
t->node = luaM_newvector(L, size, Node);
|
||||
for (i=0; i<(int)size; i++) {
|
||||
setnilvalue(&t->node[i].key);
|
||||
setnilvalue(&t->node[i].val);
|
||||
t->node[i].next = NULL;
|
||||
t->node[i].key_tt = LUA_TNIL;
|
||||
setnilvalue(&t->node[i].val);
|
||||
}
|
||||
t->size = size;
|
||||
t->firstfree = &t->node[size-1]; /* first free position to be used */
|
||||
@ -143,8 +143,13 @@ static void rehash (lua_State *L, Hash *t) {
|
||||
setnodevector(L, t, oldsize);
|
||||
for (i=0; i<oldsize; i++) {
|
||||
Node *old = nold+i;
|
||||
if (ttype(&old->val) != LUA_TNIL)
|
||||
setobj(luaH_set(L, t, &old->key), &old->val);
|
||||
if (ttype(&old->val) != LUA_TNIL) {
|
||||
TObject o;
|
||||
TObject *v;
|
||||
setkey2obj(&o, old);
|
||||
v = luaH_set(L, t, &o);
|
||||
setobj(v, &old->val);
|
||||
}
|
||||
}
|
||||
luaM_freearray(L, nold, oldsize, Node); /* free old array */
|
||||
}
|
||||
@ -159,7 +164,7 @@ static void rehash (lua_State *L, Hash *t) {
|
||||
*/
|
||||
static TObject *newkey (lua_State *L, Hash *t, Node *mp, const TObject *key) {
|
||||
if (ttype(&mp->val) != LUA_TNIL) { /* main position is not free? */
|
||||
Node *othern = luaH_mainposition(t, &mp->key); /* `mp' of colliding node */
|
||||
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? */
|
||||
/* yes; move colliding node into free position */
|
||||
@ -176,10 +181,10 @@ static TObject *newkey (lua_State *L, Hash *t, Node *mp, const TObject *key) {
|
||||
mp = n;
|
||||
}
|
||||
}
|
||||
setobj(&mp->key, key);
|
||||
setobj2key(mp, key);
|
||||
lua_assert(ttype(&mp->val) == LUA_TNIL);
|
||||
for (;;) { /* correct `firstfree' */
|
||||
if (ttype(&t->firstfree->key) == LUA_TNIL)
|
||||
if (ttype_key(t->firstfree) == LUA_TNIL)
|
||||
return &mp->val; /* OK; table still has a free place */
|
||||
else if (t->firstfree == t->node) break; /* cannot decrement from here */
|
||||
else (t->firstfree)--;
|
||||
@ -197,7 +202,7 @@ 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 (nvalue(&n->key) == key && ttype(&n->key) == LUA_TNUMBER)
|
||||
if (nvalue_key(n) == key && ttype_key(n) == LUA_TNUMBER)
|
||||
return &n->val; /* that's all */
|
||||
else n = n->next;
|
||||
} while (n);
|
||||
@ -216,7 +221,7 @@ 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 (tsvalue(&n->key) == key && ttype(&n->key) == LUA_TSTRING)
|
||||
if (tsvalue_key(n) == key && ttype_key(n) == LUA_TSTRING)
|
||||
return &n->val; /* that's all */
|
||||
else n = n->next;
|
||||
} while (n);
|
||||
@ -234,8 +239,8 @@ static TObject *luaH_setany (lua_State *L, Hash *t, const TObject *key) {
|
||||
Node *mp = hashpointer(t, hvalue(key));
|
||||
Node *n = mp;
|
||||
do { /* check whether `key' is somewhere in the chain */
|
||||
/* compare as `hvalue', but may be other pointers (it is the same) */
|
||||
if (hvalue(&n->key) == hvalue(key) && ttype(&n->key) == ttype(key))
|
||||
/* compare as `tsvalue', but may be other pointers (it is the same) */
|
||||
if (tsvalue_key(n) == tsvalue(key) && ttype_key(n) == ttype(key))
|
||||
return &n->val; /* that's all */
|
||||
else n = n->next;
|
||||
} while (n);
|
||||
|
23
ltable.h
23
ltable.h
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: ltable.h,v 1.29 2001/01/26 14:16:35 roberto Exp roberto $
|
||||
** $Id: ltable.h,v 1.30 2001/01/29 13:02:20 roberto Exp roberto $
|
||||
** Lua tables (hash)
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -10,13 +10,20 @@
|
||||
#include "lobject.h"
|
||||
|
||||
|
||||
#define node(t,i) (&(t)->node[i])
|
||||
#define key(n) (&(n)->key)
|
||||
#define val(n) (&(n)->val)
|
||||
#define node(_t,_i) (&(_t)->node[_i])
|
||||
#define val(_n) (&(_n)->val)
|
||||
|
||||
#define luaH_get(t,k) luaH_set(NULL,t,k)
|
||||
#define luaH_getnum(t,k) luaH_setnum(NULL,t,k)
|
||||
#define luaH_getstr(t,k) luaH_setstr(NULL,t,k)
|
||||
#define ttype_key(_n) ((_n)->key_tt)
|
||||
#define nvalue_key(_n) ((_n)->key_value.n)
|
||||
#define tsvalue_key(_n) ((TString *)(_n)->key_value.v)
|
||||
#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)
|
||||
#define luaH_getstr(_t,_k) luaH_setstr(NULL,_t,_k)
|
||||
|
||||
Hash *luaH_new (lua_State *L, int nhash);
|
||||
void luaH_free (lua_State *L, Hash *t);
|
||||
@ -27,7 +34,7 @@ TObject *luaH_setnum (lua_State *L, Hash *t, lua_Number key);
|
||||
TObject *luaH_setstr (lua_State *L, Hash *t, TString *key);
|
||||
|
||||
/* exported only for debugging */
|
||||
Node *luaH_mainposition (const Hash *t, const TObject *key);
|
||||
Node *luaH_mainposition (const Hash *t, const Node *n);
|
||||
|
||||
|
||||
#endif
|
||||
|
11
ltests.c
11
ltests.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: ltests.c,v 1.58 2001/01/19 13:20:30 roberto Exp roberto $
|
||||
** $Id: ltests.c,v 1.59 2001/01/22 18:01:38 roberto Exp roberto $
|
||||
** Internal Module for Debugging of the Lua Implementation
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -182,9 +182,12 @@ static int hash_query (lua_State *L) {
|
||||
}
|
||||
else {
|
||||
Hash *t;
|
||||
Node n;
|
||||
TObject *o = luaA_index(L, 1);
|
||||
luaL_checktype(L, 2, LUA_TTABLE);
|
||||
t = hvalue(luaA_index(L, 2));
|
||||
lua_pushnumber(L, luaH_mainposition(t, luaA_index(L, 1)) - t->node);
|
||||
setobj2key(&n, o);
|
||||
lua_pushnumber(L, luaH_mainposition(t, &n) - t->node);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@ -201,7 +204,9 @@ static int table_query (lua_State *L) {
|
||||
return 2;
|
||||
}
|
||||
else if (i < t->size) {
|
||||
luaA_pushobject(L, &t->node[i].key);
|
||||
TObject o;
|
||||
setkey2obj(&o, &t->node[i]);
|
||||
luaA_pushobject(L, &o);
|
||||
luaA_pushobject(L, &t->node[i].val);
|
||||
if (t->node[i].next) {
|
||||
lua_pushnumber(L, t->node[i].next - t->node);
|
||||
|
4
lvm.c
4
lvm.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: lvm.c,v 1.159 2001/01/29 13:02:20 roberto Exp roberto $
|
||||
** $Id: lvm.c,v 1.160 2001/01/29 15:26:40 roberto Exp roberto $
|
||||
** Lua virtual machine
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -662,7 +662,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) {
|
||||
else {
|
||||
Node *node = node(t, n);
|
||||
setnvalue(top-3, n); /* index */
|
||||
setobj(top-2, key(node));
|
||||
setkey2obj(top-2, node);
|
||||
setobj(top-1, val(node));
|
||||
dojump(pc, i); /* repeat loop */
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user