new implementation for global variable values (separated from strings)

This commit is contained in:
Roberto Ierusalimschy
1999-11-04 15:23:12 -02:00
parent 80b39d83c3
commit cde179b369
12 changed files with 166 additions and 145 deletions

67
lapi.c
View File

@@ -1,5 +1,5 @@
/*
** $Id: lapi.c,v 1.53 1999/10/11 16:13:11 roberto Exp roberto $
** $Id: lapi.c,v 1.54 1999/10/14 19:13:31 roberto Exp roberto $
** Lua API
** See Copyright Notice in lua.h
*/
@@ -60,18 +60,6 @@ static const TObject *luaA_protovalue (const TObject *o) {
}
void luaA_packresults (void) {
luaV_pack(L->Cstack.lua2C, L->Cstack.num, L->stack.top);
incr_top;
}
int luaA_passresults (void) {
L->Cstack.base = L->Cstack.lua2C; /* position of first result */
return L->Cstack.num;
}
static void checkCparams (int nParams) {
if (L->stack.top-L->stack.stack < L->Cstack.base+nParams)
lua_error("API error - wrong number of arguments in C2lua stack");
@@ -191,28 +179,28 @@ lua_Object lua_createtable (void) {
lua_Object lua_getglobal (const char *name) {
luaD_checkstack(2); /* may need that to call T.M. */
luaV_getglobal(luaS_new(name));
luaV_getglobal(luaS_assertglobalbyname(name));
return luaA_putObjectOnTop();
}
lua_Object lua_rawgetglobal (const char *name) {
TaggedString *ts = luaS_new(name);
return put_luaObject(&ts->u.s.globalval);
GlobalVar *gv = luaS_assertglobalbyname(name);
return put_luaObject(&gv->value);
}
void lua_setglobal (const char *name) {
checkCparams(1);
luaD_checkstack(2); /* may need that to call T.M. */
luaV_setglobal(luaS_new(name));
luaV_setglobal(luaS_assertglobalbyname(name));
}
void lua_rawsetglobal (const char *name) {
TaggedString *ts = luaS_new(name);
GlobalVar *gv = luaS_assertglobalbyname(name);
checkCparams(1);
luaS_rawsetglobal(ts, --L->stack.top);
gv->value = *(--L->stack.top);
}
@@ -274,7 +262,7 @@ long lua_strlen (lua_Object object) {
void *lua_getuserdata (lua_Object object) {
if (object == LUA_NOOBJECT || ttype(Address(object)) != LUA_T_USERDATA)
return NULL;
else return tsvalue(Address(object))->u.d.v;
else return tsvalue(Address(object))->u.d.value;
}
lua_CFunction lua_getcfunction (lua_Object object) {
@@ -388,31 +376,32 @@ void lua_settag (int tag) {
}
TaggedString *luaA_nextvar (TaggedString *g) {
if (g == NULL)
g = L->rootglobal; /* first variable */
GlobalVar *luaA_nextvar (TaggedString *ts) {
GlobalVar *gv;
if (ts == NULL)
gv = L->rootglobal; /* first variable */
else {
/* check whether name is in global var list */
luaL_arg_check(g != g->nextglobal, 1, "variable name expected");
g = g->nextglobal; /* get next */
luaL_arg_check(ts->u.s.gv, 1, "variable name expected");
gv = ts->u.s.gv->next; /* get next */
}
while (g && g->u.s.globalval.ttype == LUA_T_NIL) /* skip globals with nil */
g = g->nextglobal;
if (g) {
ttype(L->stack.top) = LUA_T_STRING; tsvalue(L->stack.top) = g;
while (gv && gv->value.ttype == LUA_T_NIL) /* skip globals with nil */
gv = gv->next;
if (gv) {
ttype(L->stack.top) = LUA_T_STRING; tsvalue(L->stack.top) = gv->name;
incr_top;
luaA_pushobject(&g->u.s.globalval);
luaA_pushobject(&gv->value);
}
return g;
return gv;
}
const char *lua_nextvar (const char *varname) {
TaggedString *g = (varname == NULL) ? NULL : luaS_new(varname);
g = luaA_nextvar(g);
if (g) {
TaggedString *ts = (varname == NULL) ? NULL : luaS_new(varname);
GlobalVar *gv = luaA_nextvar(ts);
if (gv) {
top2LC(2);
return g->str;
return gv->name->str;
}
else {
top2LC(0);
@@ -577,11 +566,11 @@ static int checkfunc (TObject *o) {
const char *lua_getobjname (lua_Object o, const char **name) {
/* try to find a name for given function */
TaggedString *g;
GlobalVar *g;
set_normalized(L->stack.top, Address(o)); /* to be accessed by "checkfunc" */
for (g=L->rootglobal; g; g=g->nextglobal) {
if (checkfunc(&g->u.s.globalval)) {
*name = g->str;
for (g=L->rootglobal; g; g=g->next) {
if (checkfunc(&g->value)) {
*name = g->name->str;
return "global";
}
}