From a580480b07cdf7201306b246deeb2fe84f2c25a9 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Fri, 26 Sep 1997 12:02:26 -0300 Subject: new implementation for globals: Global value is stored in TaggedString --- lapi.c | 22 ++++++------ lauxlib.c | 11 +++++- lauxlib.h | 3 +- lbuiltin.c | 76 +++++++++++++++++++++-------------------- ldo.c | 4 ++- lgc.c | 31 +++++++++++------ lglobal.c | 71 -------------------------------------- lglobal.h | 35 ------------------- llex.c | 11 +++--- lobject.h | 113 ++++++++++++++++++++++++++++++------------------------------- lstring.c | 84 ++++++++++++++++++++++++++++++++++----------- lstring.h | 6 +++- ltm.c | 4 +-- lua.stx | 8 ++--- lvm.c | 21 ++++++------ lvm.h | 6 ++-- makefile | 33 ++++++++---------- 17 files changed, 251 insertions(+), 288 deletions(-) delete mode 100644 lglobal.c delete mode 100644 lglobal.h diff --git a/lapi.c b/lapi.c index 7a7e13e7..d67ecd45 100644 --- a/lapi.c +++ b/lapi.c @@ -1,5 +1,5 @@ /* -** $Id: lapi.c,v 1.1 1997/08/14 13:40:46 roberto Exp roberto $ +** $Id: lapi.c,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ ** Lua API ** See Copyright Notice in lua.h */ @@ -13,7 +13,6 @@ #include "ldo.h" #include "lfunc.h" #include "lgc.h" -#include "lglobal.h" #include "lmem.h" #include "lobject.h" #include "lstring.h" @@ -182,14 +181,15 @@ lua_Object lua_createtable (void) lua_Object lua_getglobal (char *name) { luaD_checkstack(2); /* may need that to call T.M. */ - luaV_getglobal(luaG_findsymbolbyname(name)); + luaV_getglobal(luaS_new(name)); return put_luaObjectonTop(); } lua_Object lua_rawgetglobal (char *name) { - return put_luaObject(&luaG_global[luaG_findsymbolbyname(name)].object); + TaggedString *ts = luaS_new(name); + return put_luaObject(&ts->u.globalval); } @@ -197,15 +197,15 @@ void lua_setglobal (char *name) { checkCparams(1); luaD_checkstack(2); /* may need that to call T.M. */ - luaV_setglobal(luaG_findsymbolbyname(name)); + luaV_setglobal(luaS_new(name)); } void lua_rawsetglobal (char *name) { - Word n = luaG_findsymbolbyname(name); + TaggedString *ts = luaS_new(name); checkCparams(1); - s_object(n) = *(--luaD_stack.top); + luaS_rawsetglobal(ts, --luaD_stack.top); } @@ -268,7 +268,7 @@ void *lua_getuserdata (lua_Object object) { if (object == LUA_NOOBJECT || ttype(Address(object)) != LUA_T_USERDATA) return NULL; - else return tsvalue(Address(object))->u.v; + else return tsvalue(Address(object))->u.d.v; } lua_CFunction lua_getcfunction (lua_Object object) @@ -352,7 +352,7 @@ int lua_tag (lua_Object lo) TObject *o = Address(lo); lua_Type t = ttype(o); if (t == LUA_T_USERDATA) - return o->value.ts->tag; + return o->value.ts->u.d.tag; else if (t == LUA_T_ARRAY) return o->value.a->htag; else return t; @@ -369,7 +369,7 @@ void lua_settag (int tag) (luaD_stack.top-1)->value.a->htag = tag; break; case LUA_T_USERDATA: - (luaD_stack.top-1)->value.ts->tag = tag; + (luaD_stack.top-1)->value.ts->u.d.tag = tag; break; default: luaL_verror("cannot change the tag of a %s", @@ -483,7 +483,7 @@ char *lua_getobjname (lua_Object o, char **name) functofind = Address(o); if ((*name = luaT_travtagmethods(checkfunc)) != NULL) return "tag-method"; - else if ((*name = luaG_travsymbol(checkfunc)) != NULL) + else if ((*name = luaS_travsymbol(checkfunc)) != NULL) return "global"; else return ""; } diff --git a/lauxlib.c b/lauxlib.c index 37a6e41a..bc602141 100644 --- a/lauxlib.c +++ b/lauxlib.c @@ -1,5 +1,5 @@ /* -** $Id: $ +** $Id: lauxlib.c,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ ** Auxiliar functions for building Lua libraries ** See Copyright Notice in lua.h */ @@ -57,6 +57,13 @@ double luaL_opt_number (int numArg, double def) luaL_check_number(numArg); } +lua_Object luaL_nonnullarg (int numArg) +{ + lua_Object o = lua_getparam(numArg); + luaL_arg_check(o != LUA_NOOBJECT, numArg, "value expected"); + return o; +} + void luaL_openlib (struct luaL_reg *l, int n) { int i; @@ -74,3 +81,5 @@ void luaL_verror (char *fmt, ...) va_end(argp); lua_error(buff); } + + diff --git a/lauxlib.h b/lauxlib.h index 9c616c2b..9bf15d27 100644 --- a/lauxlib.h +++ b/lauxlib.h @@ -1,5 +1,5 @@ /* -** $Id: $ +** $Id: lauxlib.h,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ ** Auxiliar functions for building Lua libraries ** See Copyright Notice in lua.h */ @@ -23,6 +23,7 @@ char *luaL_check_string (int numArg); char *luaL_opt_string (int numArg, char *def); double luaL_check_number (int numArg); double luaL_opt_number (int numArg, double def); +lua_Object luaL_nonnullarg (int numArg); void luaL_verror (char *fmt, ...); diff --git a/lbuiltin.c b/lbuiltin.c index eeb3daf8..58c3e57b 100644 --- a/lbuiltin.c +++ b/lbuiltin.c @@ -1,5 +1,5 @@ /* -** $Id: $ +** $Id: lbuiltin.c,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ ** Built-in functions ** See Copyright Notice in lua.h */ @@ -10,7 +10,6 @@ #include "lapi.h" #include "lauxlib.h" #include "lbuiltin.h" -#include "lglobal.h" #include "lmem.h" #include "lstring.h" #include "ltable.h" @@ -18,13 +17,25 @@ #include "lua.h" + static void nextvar (void) { - int i = luaG_nextvar(lua_isnil(lua_getparam(1)) ? 0 : - luaG_findsymbolbyname(luaL_check_string(1))+1); - if (i >= 0) { - lua_pushstring(luaG_global[i].varname->str); - luaA_pushobject(&s_object(i)); + lua_Object v = luaL_nonnullarg(1); + TaggedString *g; + if (lua_isnil(v)) + g = (TaggedString *)luaS_root.next; + else { + TObject *o = luaA_Address(v); + luaL_arg_check(ttype(o) == LUA_T_STRING, 1, "variable name expected"); + g = tsvalue(o); + luaL_arg_check((GCnode *)g != g->head.next, 1, "variable name expected"); + g = (TaggedString *)g->head.next; + } + while (g && g->u.globalval.ttype == LUA_T_NIL) + g = (TaggedString *)g->head.next; + if (g) { + lua_pushstring(g->str); + luaA_pushobject(&g->u.globalval); } } @@ -32,10 +43,9 @@ static void nextvar (void) static void next (void) { lua_Object o = lua_getparam(1); - lua_Object r = lua_getparam(2); + lua_Object r = luaL_nonnullarg(2); Node *n; luaL_arg_check(lua_istable(o), 1, "table expected"); - luaL_arg_check(r != LUA_NOOBJECT, 2, "value expected"); n = luaH_next(luaA_Address(o), luaA_Address(r)); if (n) { luaA_pushobject(&n->ref); @@ -90,7 +100,7 @@ static char *to_string (lua_Object obj) return buff; } case LUA_T_USERDATA: { - sprintf(buff, "userdata: %p", o->value.ts->u.v); + sprintf(buff, "userdata: %p", o->value.ts->u.d.v); return buff; } case LUA_T_NIL: @@ -116,8 +126,7 @@ static void luaI_print (void) static void luaI_type (void) { - lua_Object o = lua_getparam(1); - luaL_arg_check(o != LUA_NOOBJECT, 1, "no argument"); + lua_Object o = luaL_nonnullarg(1); lua_pushstring(luaO_typenames[-ttype(luaA_Address(o))]); lua_pushnumber(lua_tag(o)); } @@ -149,8 +158,7 @@ static void luaI_assert (void) static void setglobal (void) { - lua_Object value = lua_getparam(2); - luaL_arg_check(value != LUA_NOOBJECT, 2, NULL); + lua_Object value = luaL_nonnullarg(2); lua_pushobject(value); lua_setglobal(luaL_check_string(1)); lua_pushobject(value); /* return given value */ @@ -158,8 +166,7 @@ static void setglobal (void) static void rawsetglobal (void) { - lua_Object value = lua_getparam(2); - luaL_arg_check(value != LUA_NOOBJECT, 2, NULL); + lua_Object value = luaL_nonnullarg(2); lua_pushobject(value); lua_rawsetglobal(luaL_check_string(1)); lua_pushobject(value); /* return given value */ @@ -233,10 +240,8 @@ static void newtag (void) static void rawgettable (void) { - lua_Object t = lua_getparam(1); - lua_Object i = lua_getparam(2); - luaL_arg_check(t != LUA_NOOBJECT, 1, NULL); - luaL_arg_check(i != LUA_NOOBJECT, 2, NULL); + lua_Object t = luaL_nonnullarg(1); + lua_Object i = luaL_nonnullarg(2); lua_pushobject(t); lua_pushobject(i); lua_pushobject(lua_rawgettable()); @@ -245,11 +250,9 @@ static void rawgettable (void) static void rawsettable (void) { - lua_Object t = lua_getparam(1); - lua_Object i = lua_getparam(2); - lua_Object v = lua_getparam(3); - luaL_arg_check(t != LUA_NOOBJECT && i != LUA_NOOBJECT && v != LUA_NOOBJECT, - 0, NULL); + lua_Object t = luaL_nonnullarg(1); + lua_Object i = luaL_nonnullarg(2); + lua_Object v = luaL_nonnullarg(3); lua_pushobject(t); lua_pushobject(i); lua_pushobject(v); @@ -259,8 +262,7 @@ static void rawsettable (void) static void settagmethod (void) { - lua_Object nf = lua_getparam(3); - luaL_arg_check(nf != LUA_NOOBJECT, 3, "value expected"); + lua_Object nf = luaL_nonnullarg(3); lua_pushobject(nf); lua_pushobject(lua_settagmethod((int)luaL_check_number(1), luaL_check_string(2))); @@ -276,8 +278,7 @@ static void gettagmethod (void) static void seterrormethod (void) { - lua_Object nf = lua_getparam(1); - luaL_arg_check(nf != LUA_NOOBJECT, 1, "value expected"); + lua_Object nf = luaL_nonnullarg(1); lua_pushobject(nf); lua_pushobject(lua_seterrormethod()); } @@ -387,18 +388,21 @@ static struct luaL_reg int_funcs[] = { void luaB_predefine (void) { int i; - Word n; + TaggedString *ts; + TObject o; /* pre-register mem error messages, to avoid loop when error arises */ luaS_newfixedstring(tableEM); luaS_newfixedstring(memEM); + o.ttype = LUA_T_CFUNCTION; for (i=0; i #include +#include "lbuiltin.h" #include "ldo.h" #include "lgc.h" #include "lmem.h" @@ -50,6 +51,7 @@ static void initstack (int n) luaD_stack.last = luaD_stack.stack+(maxstack-1); luaD_stack.top = luaD_stack.stack; *(luaD_stack.top++) = initial_stack; + luaB_predefine(); } diff --git a/lgc.c b/lgc.c index d50d5d07..87e37d19 100644 --- a/lgc.c +++ b/lgc.c @@ -1,5 +1,5 @@ /* -** $Id: $ +** $Id: lgc.c,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -8,7 +8,6 @@ #include "ldo.h" #include "lfunc.h" #include "lgc.h" -#include "lglobal.h" #include "lmem.h" #include "lobject.h" #include "lstring.h" @@ -91,7 +90,7 @@ static int ismarked (TObject *o) { switch (o->ttype) { case LUA_T_STRING: case LUA_T_USERDATA: - return o->value.ts->marked; + return o->value.ts->head.marked; case LUA_T_FUNCTION: return o->value.cl->head.marked; case LUA_T_PROTO: @@ -129,10 +128,11 @@ static void strcallIM (TaggedString *l) { TObject o; ttype(&o) = LUA_T_USERDATA; - for (; l; l=l->uu.next) { - tsvalue(&o) = l; - luaD_gcIM(&o); - } + for (; l; l=(TaggedString *)l->head.next) + if (l->constindex == -1) { /* is userdata? */ + tsvalue(&o) = l; + luaD_gcIM(&o); + } } @@ -164,8 +164,8 @@ static GCnode *listcollect (GCnode **root) static void strmark (TaggedString *s) { - if (!s->marked) - s->marked = 1; + if (!s->head.marked) + s->head.marked = 1; } @@ -215,6 +215,17 @@ static void hashmark (Hash *h) } +static void globalmark (void) +{ + TaggedString *g; + for (g=(TaggedString *)luaS_root.next; g; g=(TaggedString *)g->head.next) + if (g->u.globalval.ttype != LUA_T_NIL) { + markobject(&g->u.globalval); + strmark(g); /* cannot collect non nil global variables */ + } +} + + static int markobject (TObject *o) { switch (ttype(o)) { @@ -253,7 +264,7 @@ long luaC_threshold = GARBAGE_BLOCK; static void markall (void) { luaD_travstack(markobject); /* mark stack objects */ - luaG_travsymbol(markobject); /* mark symbol table objects */ + globalmark(); /* mark global variable values and names */ travlock(); /* mark locked objects */ luaT_travtagmethods(markobject); /* mark fallbacks */ } diff --git a/lglobal.c b/lglobal.c deleted file mode 100644 index 9f2b9f90..00000000 --- a/lglobal.c +++ /dev/null @@ -1,71 +0,0 @@ -/* -** $Id: $ -** Global variables -** See Copyright Notice in lua.h -*/ - -#include - -#include "lbuiltin.h" -#include "lglobal.h" -#include "lmem.h" -#include "lobject.h" -#include "lstring.h" - - -Symbol *luaG_global = NULL; -int luaG_nglobal = 0; -static int maxglobal = 0; - - - -Word luaG_findsymbol (TaggedString *t) -{ - if (maxglobal == 0) { /* first time? */ - maxglobal = 50; - luaG_global = luaM_newvector(maxglobal, Symbol); - luaB_predefine(); - } - if (t->u.s.varindex == NOT_USED) { - if (!t->marked) t->marked = 2; /* avoid GC of global variable names */ - if (luaG_nglobal >= maxglobal) - maxglobal = luaM_growvector(&luaG_global, maxglobal, Symbol, - symbolEM, MAX_WORD); - t->u.s.varindex = luaG_nglobal; - luaG_global[luaG_nglobal].varname = t; - s_ttype(luaG_nglobal) = LUA_T_NIL; - luaG_nglobal++; - } - return t->u.s.varindex; -} - - -Word luaG_findsymbolbyname (char *name) -{ - return luaG_findsymbol(luaS_new(name)); -} - - -int luaG_globaldefined (char *name) -{ - return s_ttype(luaG_findsymbolbyname(name)) != LUA_T_NIL; -} - - -int luaG_nextvar (Word next) -{ - while (next < luaG_nglobal && s_ttype(next) == LUA_T_NIL) - next++; - return (next < luaG_nglobal ? next : -1); -} - - -char *luaG_travsymbol (int (*fn)(TObject *)) -{ - int i; - for (i=0; istr; - return NULL; -} - diff --git a/lglobal.h b/lglobal.h deleted file mode 100644 index 00edb4c6..00000000 --- a/lglobal.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -** $Id: $ -** Global variables -** See Copyright Notice in lua.h -*/ - -#ifndef lglobal_h -#define lglobal_h - - -#include "lobject.h" - - -typedef struct { - TObject object; - TaggedString *varname; -} Symbol; - - -extern Symbol *luaG_global; /* global variables */ -extern int luaG_nglobal; /* number of global variable (for luac) */ - - -Word luaG_findsymbolbyname (char *name); -Word luaG_findsymbol (TaggedString *t); -int luaG_globaldefined (char *name); -int luaG_nextvar (Word next); -char *luaG_travsymbol (int (*fn)(TObject *)); - - -#define s_object(i) (luaG_global[i].object) -#define s_ttype(i) (ttype(&s_object(i))) - - -#endif diff --git a/llex.c b/llex.c index 0cbce7eb..3d843224 100644 --- a/llex.c +++ b/llex.c @@ -1,5 +1,5 @@ /* -** $Id: $ +** $Id: llex.c,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ ** Lexical Analizer ** See Copyright Notice in lua.h */ @@ -8,7 +8,6 @@ #include #include -#include "lglobal.h" #include "llex.h" #include "lmem.h" #include "lobject.h" @@ -48,7 +47,7 @@ static void addReserved (void) firsttime = 0; for (i=0; i<(sizeof(reserved)/sizeof(reserved[0])); i++) { TaggedString *ts = luaS_new(reserved[i].name); - ts->marked = reserved[i].token; /* reserved word (always > 255) */ + ts->head.marked = reserved[i].token; /* reserved word (always > 255) */ } } } @@ -120,7 +119,7 @@ static int checkcond (char *buff) int i = luaO_findstring(buff, opts); if (i >= 0) return i; else if (isalpha((unsigned char)buff[0]) || buff[0] == '_') - return luaG_globaldefined(buff); + return luaS_globaldefined(buff); else { luaY_syntaxerror("invalid $if condition", buff); return 0; /* to avoid warnings */ @@ -451,8 +450,8 @@ int luaY_lex (void) } while (isalnum(current) || current == '_'); save(0); ts = luaS_new(textbuff.text); - if (ts->marked > 255) - return ts->marked; /* reserved word */ + if (ts->head.marked > 255) + return ts->head.marked; /* reserved word */ luaY_lval.pTStr = ts; return NAME; } diff --git a/lobject.h b/lobject.h index 710d4a6a..398155f2 100644 --- a/lobject.h +++ b/lobject.h @@ -1,5 +1,5 @@ /* -** $Id: $ +** $Id: lobject.h,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ ** Type definitions for Lua objects ** See Copyright Notice in lua.h */ @@ -29,30 +29,43 @@ typedef unsigned short Word; /* unsigned 16 bits */ typedef unsigned int IntPoint; /* unsigned with same size as a pointer (for hashing) */ - - /* -** String headers for string table +** Lua TYPES +** WARNING: if you change the order of this enumeration, +** grep "ORDER LUA_T" */ +typedef enum { + LUA_T_NIL = -10, + LUA_T_NUMBER = -9, + LUA_T_STRING = -8, + LUA_T_ARRAY = -7, /* array==table */ + LUA_T_PROTO = -6, + LUA_T_FUNCTION = -5, + LUA_T_CFUNCTION= -4, + LUA_T_MARK = -3, + LUA_T_CMARK = -2, + LUA_T_LINE = -1, + LUA_T_USERDATA = 0 +} lua_Type; -#define NOT_USED 0xFFFE +#define NUM_TYPES 11 + + +typedef union { + lua_CFunction f; /* LUA_T_CFUNCTION, LUA_T_CMARK */ + real n; /* LUA_T_NUMBER */ + struct TaggedString *ts; /* LUA_T_STRING, LUA_T_USERDATA */ + struct TProtoFunc *tf; /* LUA_T_PROTO */ + struct Closure *cl; /* LUA_T_FUNCTION, LUA_T_MARK */ + struct Hash *a; /* LUA_T_ARRAY */ + int i; /* LUA_T_LINE */ +} Value; -typedef struct TaggedString { - int tag; /* if != LUA_T_STRING, this is a userdata */ - union { - unsigned long hash; - struct TaggedString *next; - } uu; - union { - struct { - Word varindex; /* != NOT_USED if this is a symbol */ - Word constindex; /* hint to reuse constant indexes */ - } s; - void *v; /* if this is a userdata, here is its value */ - } u; - int marked; /* for garbage collection; never collect (nor change) if > 1 */ - char str[1]; /* \0 byte already reserved */ -} TaggedString; + +typedef struct TObject { + lua_Type ttype; + Value value; +} TObject; @@ -65,6 +78,27 @@ typedef struct GCnode { } GCnode; +/* +** String headers for string table +*/ + +typedef struct TaggedString { + GCnode head; + int constindex; /* hint to reuse constants (= -1 if this is a userdata) */ + unsigned long hash; + union { + TObject globalval; + struct { + void *v; /* if this is a userdata, here is its value */ + int tag; + } d; + } u; + char str[1]; /* \0 byte already reserved */ +} TaggedString; + + + + /* ** Function Prototypes */ @@ -87,43 +121,6 @@ typedef struct LocVar { -/* -** Lua TYPES -** WARNING: if you change the order of this enumeration, -** grep "ORDER LUA_T" -*/ -typedef enum { - LUA_T_NIL = -10, - LUA_T_NUMBER = -9, - LUA_T_STRING = -8, - LUA_T_ARRAY = -7, /* array==table */ - LUA_T_PROTO = -6, - LUA_T_FUNCTION = -5, - LUA_T_CFUNCTION= -4, - LUA_T_MARK = -3, - LUA_T_CMARK = -2, - LUA_T_LINE = -1, - LUA_T_USERDATA = 0 -} lua_Type; - -#define NUM_TYPES 11 - - -typedef union { - lua_CFunction f; - real n; - TaggedString *ts; - TProtoFunc *tf; - struct Closure *cl; - struct Hash *a; - int i; -} Value; - -typedef struct TObject { - lua_Type ttype; - Value value; -} TObject; - /* Macros to access structure members */ #define ttype(o) ((o)->ttype) diff --git a/lstring.c b/lstring.c index c6c77aa6..1b82cf20 100644 --- a/lstring.c +++ b/lstring.c @@ -1,5 +1,5 @@ /* -** $Id: lstring.c,v 1.1 1997/08/14 20:23:30 roberto Exp $ +** $Id: lstring.c,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ ** String table (keep all strings handled by Lua) ** See Copyright Notice in lua.h */ @@ -15,6 +15,10 @@ #define NUM_HASHS 61 + +GCnode luaS_root = {NULL, 0}; /* list of global variables */ + + typedef struct { int size; int nuse; /* number of elements (including EMPTYs) */ @@ -39,7 +43,7 @@ static stringtable string_root[NUM_HASHS] = { }; -static TaggedString EMPTY = {LUA_T_STRING, {0}, {{NOT_USED, NOT_USED}}, 2, {0}}; +static TaggedString EMPTY = {{NULL, 2}, 0, 0L, {{LUA_T_NIL, {NULL}}}, {0}}; @@ -68,7 +72,7 @@ static void grow (stringtable *tb) tb->nuse = 0; for (i=0; isize; i++) { if (tb->hash[i] != NULL && tb->hash[i] != &EMPTY) { - int h = tb->hash[i]->uu.hash%newsize; + int h = tb->hash[i]->hash%newsize; while (newhash[h]) h = (h+1)%newsize; newhash[h] = tb->hash[i]; @@ -87,16 +91,18 @@ static TaggedString *newone(char *buff, int tag, unsigned long h) if (tag == LUA_T_STRING) { ts = (TaggedString *)luaM_malloc(sizeof(TaggedString)+strlen(buff)); strcpy(ts->str, buff); - ts->u.s.varindex = ts->u.s.constindex = NOT_USED; - ts->tag = LUA_T_STRING; + ts->u.globalval.ttype = LUA_T_NIL; /* initialize global value */ + ts->constindex = 0; } else { ts = (TaggedString *)luaM_malloc(sizeof(TaggedString)); - ts->u.v = buff; - ts->tag = tag == LUA_ANYTAG ? 0 : tag; + ts->u.d.v = buff; + ts->u.d.tag = tag == LUA_ANYTAG ? 0 : tag; + ts->constindex = -1; /* tag -> this is a userdata */ } - ts->marked = 0; - ts->uu.hash = h; + ts->head.marked = 0; + ts->head.next = (GCnode *)ts; /* signal it is in no list */ + ts->hash = h; return ts; } @@ -113,9 +119,9 @@ static TaggedString *insert (char *buff, int tag, stringtable *tb) { if (ts == &EMPTY) j = i; - else if ((ts->tag == LUA_T_STRING) ? + else if ((ts->constindex >= 0) ? /* is a string? */ (tag == LUA_T_STRING && (strcmp(buff, ts->str) == 0)) : - ((tag == ts->tag || tag == LUA_ANYTAG) && buff == ts->u.v)) + ((tag == ts->u.d.tag || tag == LUA_ANYTAG) && buff == ts->u.d.v)) return ts; i = (i+1)%tb->size; } @@ -142,8 +148,8 @@ TaggedString *luaS_new (char *str) TaggedString *luaS_newfixedstring (char *str) { TaggedString *ts = luaS_new(str); - if (ts->marked == 0) - ts->marked = 2; /* avoid GC */ + if (ts->head.marked == 0) + ts->head.marked = 2; /* avoid GC */ return ts; } @@ -151,7 +157,7 @@ TaggedString *luaS_newfixedstring (char *str) void luaS_free (TaggedString *l) { while (l) { - TaggedString *next = l->uu.next; + TaggedString *next = (TaggedString *)l->head.next; luaM_free(l); l = next; } @@ -159,22 +165,35 @@ void luaS_free (TaggedString *l) /* -** Garbage collection function. +** Garbage collection functions. */ + +static void remove_from_list (GCnode *l) +{ + while (l) { + GCnode *next = l->next; + while (next && !next->marked) + next = l->next = next->next; + l = next; + } +} + + TaggedString *luaS_collector (void) { TaggedString *frees = NULL; int i; + remove_from_list(&luaS_root); for (i=0; isize; j++) { TaggedString *t = tb->hash[j]; if (t == NULL) continue; - if (t->marked == 1) - t->marked = 0; - else if (!t->marked) { - t->uu.next = frees; + if (t->head.marked == 1) + t->head.marked = 0; + else if (!t->head.marked) { + t->head.next = (GCnode *)frees; frees = t; tb->hash[j] = &EMPTY; --luaO_nentities; @@ -184,3 +203,30 @@ TaggedString *luaS_collector (void) return frees; } + +void luaS_rawsetglobal (TaggedString *ts, TObject *newval) +{ + ts->u.globalval = *newval; + if (ts->head.next == (GCnode *)ts) { /* is not in list? */ + ts->head.next = luaS_root.next; + luaS_root.next = (GCnode *)ts; + } +} + + +char *luaS_travsymbol (int (*fn)(TObject *)) +{ + TaggedString *g; + for (g=(TaggedString *)luaS_root.next; g; g=(TaggedString *)g->head.next) + if (fn(&g->u.globalval)) + return g->str; + return NULL; +} + + +int luaS_globaldefined (char *name) +{ + TaggedString *ts = luaS_new(name); + return ts->u.globalval.ttype != LUA_T_NIL; +} + diff --git a/lstring.h b/lstring.h index 74106224..23f624d0 100644 --- a/lstring.h +++ b/lstring.h @@ -1,5 +1,5 @@ /* -** $Id: lstring.h,v 1.1 1997/08/14 20:23:40 roberto Exp roberto $ +** $Id: lstring.h,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ ** String table (keep all strings handled by Lua) ** See Copyright Notice in lua.h */ @@ -10,6 +10,7 @@ #include "lobject.h" +extern GCnode luaS_root; TaggedString *luaS_createudata (void *udata, int tag); TaggedString *luaS_collector (void); @@ -17,5 +18,8 @@ void luaS_free (TaggedString *l); void luaS_callIM (TaggedString *l); TaggedString *luaS_new (char *str); TaggedString *luaS_newfixedstring (char *str); +void luaS_rawsetglobal (TaggedString *ts, TObject *newval); +char *luaS_travsymbol (int (*fn)(TObject *)); +int luaS_globaldefined (char *name); #endif diff --git a/ltm.c b/ltm.c index 215c7bf5..7e787902 100644 --- a/ltm.c +++ b/ltm.c @@ -1,5 +1,5 @@ /* -** $Id: $ +** $Id: ltm.c,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ ** Tag methods ** See Copyright Notice in lua.h */ @@ -176,7 +176,7 @@ int luaT_efectivetag (TObject *o) { lua_Type t = ttype(o); if (t == LUA_T_USERDATA) { - int tag = o->value.ts->tag; + int tag = o->value.ts->u.d.tag; return (tag >= 0) ? LUA_T_USERDATA : tag; } else if (t == LUA_T_ARRAY) diff --git a/lua.stx b/lua.stx index dfb80ce3..2f650f4e 100644 --- a/lua.stx +++ b/lua.stx @@ -1,6 +1,6 @@ %{ /* -** $Id: lua.stx,v 1.4 1997/09/22 20:53:20 roberto Exp roberto $ +** $Id: lua.stx,v 1.5 1997/09/24 19:43:11 roberto Exp roberto $ ** Syntax analizer and code generator ** See Copyright Notice in lua.h */ @@ -203,13 +203,13 @@ static int next_constant (State *cs) static int string_constant (TaggedString *s, State *cs) { TProtoFunc *f = cs->f; - int c = s->u.s.constindex; - if (!(0 <= c && c < f->nconsts && + int c = s->constindex; + if (!(c < f->nconsts && ttype(&f->consts[c]) == LUA_T_STRING && tsvalue(&f->consts[c]) == s)) { c = next_constant(cs); ttype(&f->consts[c]) = LUA_T_STRING; tsvalue(&f->consts[c]) = s; - s->u.s.constindex = c; /* hint for next time */ + s->constindex = c; /* hint for next time */ } return c; } diff --git a/lvm.c b/lvm.c index 5b7971c6..6051067e 100644 --- a/lvm.c +++ b/lvm.c @@ -1,5 +1,5 @@ /* -** $Id: lvm.c,v 1.4 1997/09/22 20:53:20 roberto Exp roberto $ +** $Id: lvm.c,v 1.5 1997/09/24 19:43:11 roberto Exp roberto $ ** Lua virtual machine ** See Copyright Notice in lua.h */ @@ -12,7 +12,6 @@ #include "ldo.h" #include "lfunc.h" #include "lgc.h" -#include "lglobal.h" #include "lmem.h" #include "lopcodes.h" #include "lstring.h" @@ -155,17 +154,17 @@ void luaV_settable (TObject *t, int mode) } -void luaV_getglobal (Word n) +void luaV_getglobal (TaggedString *ts) { /* WARNING: caller must assure stack space */ - TObject *value = &luaG_global[n].object; + TObject *value = &ts->u.globalval; TObject *im = luaT_getimbyObj(value, IM_GETGLOBAL); if (ttype(im) == LUA_T_NIL) { /* default behavior */ *luaD_stack.top++ = *value; } else { ttype(luaD_stack.top) = LUA_T_STRING; - tsvalue(luaD_stack.top) = luaG_global[n].varname; + tsvalue(luaD_stack.top) = ts; luaD_stack.top++; *luaD_stack.top++ = *value; luaD_callTM(im, 2, 1); @@ -173,17 +172,17 @@ void luaV_getglobal (Word n) } -void luaV_setglobal (Word n) +void luaV_setglobal (TaggedString *ts) { - TObject *oldvalue = &luaG_global[n].object; + TObject *oldvalue = &ts->u.globalval; TObject *im = luaT_getimbyObj(oldvalue, IM_SETGLOBAL); if (ttype(im) == LUA_T_NIL) /* default behavior */ - s_object(n) = *(--luaD_stack.top); + luaS_rawsetglobal(ts, --luaD_stack.top); else { /* WARNING: caller must assure stack space */ TObject newvalue = *(luaD_stack.top-1); ttype(luaD_stack.top-1) = LUA_T_STRING; - tsvalue(luaD_stack.top-1) = luaG_global[n].varname; + tsvalue(luaD_stack.top-1) = ts; *luaD_stack.top++ = *oldvalue; *luaD_stack.top++ = newvalue; luaD_callTM(im, 3, 0); @@ -334,7 +333,7 @@ StkId luaV_execute (Closure *cl, StkId base) case GETGLOBAL9: aux -= GETGLOBAL0; getglobal: - luaV_getglobal(luaG_findsymbol(tsvalue(&consts[aux]))); + luaV_getglobal(tsvalue(&consts[aux])); break; case GETTABLE: @@ -396,7 +395,7 @@ StkId luaV_execute (Closure *cl, StkId base) case SETGLOBALB: aux = *pc++; setglobal: - luaV_setglobal(luaG_findsymbol(tsvalue(&consts[aux]))); + luaV_setglobal(tsvalue(&consts[aux])); break; case SETTABLE0: diff --git a/lvm.h b/lvm.h index 9a180e3e..312ce871 100644 --- a/lvm.h +++ b/lvm.h @@ -1,5 +1,5 @@ /* -** $Id: $ +** $Id: lvm.h,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ ** Lua virtual machine ** See Copyright Notice in lua.h */ @@ -21,8 +21,8 @@ int luaV_tonumber (TObject *obj); int luaV_tostring (TObject *obj); void luaV_gettable (void); void luaV_settable (TObject *t, int mode); -void luaV_getglobal (Word n); -void luaV_setglobal (Word n); +void luaV_getglobal (TaggedString *ts); +void luaV_setglobal (TaggedString *ts); StkId luaV_execute (Closure *func, StkId base); void luaV_closure (void); diff --git a/makefile b/makefile index 8d1a8261..14bcbb08 100644 --- a/makefile +++ b/makefile @@ -1,5 +1,5 @@ # -## $Id: $ +## $Id: makefile,v 1.1 1997/09/16 19:33:21 roberto Exp roberto $ ## Makefile ## See Copyright Notice in lua.h # @@ -18,7 +18,7 @@ # define LUA_COMPAT2_5=0 if yous system does not need to be compatible with # version 2.5 (or older) -CONFIG = -DPOPEN -D_POSIX_SOURCE +CONFIG = -DPOPEN -D_POSIX_SOURCE #CONFIG = -DLUA_COMPAT2_5=0 -DOLD_ANSI -DDEBUG @@ -40,7 +40,6 @@ LUAOBJS = \ ldo.o \ lfunc.o \ lgc.o \ - lglobal.o \ llex.o \ lmem.o \ lobject.o \ @@ -96,31 +95,29 @@ clear : lapi.o: lapi.c lapi.h lua.h lobject.h lauxlib.h ldo.h lfunc.h lgc.h \ - lglobal.h lmem.h lstring.h ltable.h ltm.h luadebug.h lvm.h + lmem.h lstring.h ltable.h ltm.h luadebug.h lvm.h lauxlib.o: lauxlib.c lauxlib.h lua.h luadebug.h lbuiltin.o: lbuiltin.c lapi.h lua.h lobject.h lauxlib.h lbuiltin.h \ - lglobal.h lmem.h lstring.h ltable.h ltm.h -ldo.o: ldo.c ldo.h lobject.h lua.h lgc.h lmem.h lparser.h lzio.h ltm.h \ - luadebug.h lundump.h lvm.h + lmem.h lstring.h ltable.h ltm.h +ldo.o: ldo.c lbuiltin.h ldo.h lobject.h lua.h lgc.h lmem.h lparser.h \ + lzio.h ltm.h luadebug.h lundump.h lvm.h lfunc.o: lfunc.c lfunc.h lobject.h lua.h lmem.h -lgc.o: lgc.c ldo.h lobject.h lua.h lfunc.h lgc.h lglobal.h lmem.h \ - lstring.h ltable.h ltm.h -lglobal.o: lglobal.c lbuiltin.h lglobal.h lobject.h lua.h lmem.h \ - lstring.h +lgc.o: lgc.c ldo.h lobject.h lua.h lfunc.h lgc.h lmem.h lstring.h \ + ltable.h ltm.h liolib.o: liolib.c lauxlib.h lua.h luadebug.h lualib.h -llex.o: llex.c lglobal.h lobject.h lua.h llex.h lzio.h lmem.h \ - lparser.h lstring.h ltokens.h luadebug.h +llex.o: llex.c llex.h lobject.h lua.h lzio.h lmem.h lparser.h \ + lstring.h ltokens.h luadebug.h lmathlib.o: lmathlib.c lauxlib.h lua.h lualib.h lmem.o: lmem.c lmem.h lua.h lobject.o: lobject.c lobject.h lua.h -lparser.o: lparser.c lauxlib.h lua.h ldo.h lobject.h lfunc.h lglobal.h \ - llex.h lzio.h lmem.h lopcodes.h lparser.h lstring.h luadebug.h +lparser.o: lparser.c lauxlib.h lua.h ldo.h lobject.h lfunc.h llex.h \ + lzio.h lmem.h lopcodes.h lparser.h lstring.h luadebug.h lstring.o: lstring.c lmem.h lobject.h lua.h lstring.h lstrlib.o: lstrlib.c lauxlib.h lua.h lualib.h ltable.o: ltable.c lauxlib.h lua.h lmem.h lobject.h ltable.h ltm.o: ltm.c lauxlib.h lua.h ldo.h lobject.h lmem.h ltm.h lapi.h -lua.o: lua.c lua.h lualib.h luadebug.h +lua.o: lua.c lua.h luadebug.h lualib.h lundump.o: lundump.c lundump.h lobject.h lua.h lzio.h -lvm.o: lvm.c lauxlib.h lua.h ldo.h lobject.h lfunc.h lgc.h lglobal.h \ - lmem.h lopcodes.h lstring.h ltable.h ltm.h luadebug.h lvm.h +lvm.o: lvm.c lauxlib.h lua.h ldo.h lobject.h lfunc.h lgc.h lmem.h \ + lopcodes.h lstring.h ltable.h ltm.h luadebug.h lvm.h lzio.o: lzio.c lzio.h -- cgit v1.2.3-55-g6feb