diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-11-04 15:23:12 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-11-04 15:23:12 -0200 |
| commit | cde179b36979c58d9380d3c4dd29b61412d13b51 (patch) | |
| tree | 804c457691024d797a7479eddf711e103966b513 /lapi.c | |
| parent | 80b39d83c3512e1dd627842e64c69841638d9088 (diff) | |
| download | lua-cde179b36979c58d9380d3c4dd29b61412d13b51.tar.gz lua-cde179b36979c58d9380d3c4dd29b61412d13b51.tar.bz2 lua-cde179b36979c58d9380d3c4dd29b61412d13b51.zip | |
new implementation for global variable values (separated from strings)
Diffstat (limited to 'lapi.c')
| -rw-r--r-- | lapi.c | 67 |
1 files changed, 28 insertions, 39 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lapi.c,v 1.53 1999/10/11 16:13:11 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 1.54 1999/10/14 19:13:31 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 | */ |
| @@ -60,18 +60,6 @@ static const TObject *luaA_protovalue (const TObject *o) { | |||
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | 62 | ||
| 63 | void luaA_packresults (void) { | ||
| 64 | luaV_pack(L->Cstack.lua2C, L->Cstack.num, L->stack.top); | ||
| 65 | incr_top; | ||
| 66 | } | ||
| 67 | |||
| 68 | |||
| 69 | int luaA_passresults (void) { | ||
| 70 | L->Cstack.base = L->Cstack.lua2C; /* position of first result */ | ||
| 71 | return L->Cstack.num; | ||
| 72 | } | ||
| 73 | |||
| 74 | |||
| 75 | static void checkCparams (int nParams) { | 63 | static void checkCparams (int nParams) { |
| 76 | if (L->stack.top-L->stack.stack < L->Cstack.base+nParams) | 64 | if (L->stack.top-L->stack.stack < L->Cstack.base+nParams) |
| 77 | lua_error("API error - wrong number of arguments in C2lua stack"); | 65 | lua_error("API error - wrong number of arguments in C2lua stack"); |
| @@ -191,28 +179,28 @@ lua_Object lua_createtable (void) { | |||
| 191 | 179 | ||
| 192 | lua_Object lua_getglobal (const char *name) { | 180 | lua_Object lua_getglobal (const char *name) { |
| 193 | luaD_checkstack(2); /* may need that to call T.M. */ | 181 | luaD_checkstack(2); /* may need that to call T.M. */ |
| 194 | luaV_getglobal(luaS_new(name)); | 182 | luaV_getglobal(luaS_assertglobalbyname(name)); |
| 195 | return luaA_putObjectOnTop(); | 183 | return luaA_putObjectOnTop(); |
| 196 | } | 184 | } |
| 197 | 185 | ||
| 198 | 186 | ||
| 199 | lua_Object lua_rawgetglobal (const char *name) { | 187 | lua_Object lua_rawgetglobal (const char *name) { |
| 200 | TaggedString *ts = luaS_new(name); | 188 | GlobalVar *gv = luaS_assertglobalbyname(name); |
| 201 | return put_luaObject(&ts->u.s.globalval); | 189 | return put_luaObject(&gv->value); |
| 202 | } | 190 | } |
| 203 | 191 | ||
| 204 | 192 | ||
| 205 | void lua_setglobal (const char *name) { | 193 | void lua_setglobal (const char *name) { |
| 206 | checkCparams(1); | 194 | checkCparams(1); |
| 207 | luaD_checkstack(2); /* may need that to call T.M. */ | 195 | luaD_checkstack(2); /* may need that to call T.M. */ |
| 208 | luaV_setglobal(luaS_new(name)); | 196 | luaV_setglobal(luaS_assertglobalbyname(name)); |
| 209 | } | 197 | } |
| 210 | 198 | ||
| 211 | 199 | ||
| 212 | void lua_rawsetglobal (const char *name) { | 200 | void lua_rawsetglobal (const char *name) { |
| 213 | TaggedString *ts = luaS_new(name); | 201 | GlobalVar *gv = luaS_assertglobalbyname(name); |
| 214 | checkCparams(1); | 202 | checkCparams(1); |
| 215 | luaS_rawsetglobal(ts, --L->stack.top); | 203 | gv->value = *(--L->stack.top); |
| 216 | } | 204 | } |
| 217 | 205 | ||
| 218 | 206 | ||
| @@ -274,7 +262,7 @@ long lua_strlen (lua_Object object) { | |||
| 274 | void *lua_getuserdata (lua_Object object) { | 262 | void *lua_getuserdata (lua_Object object) { |
| 275 | if (object == LUA_NOOBJECT || ttype(Address(object)) != LUA_T_USERDATA) | 263 | if (object == LUA_NOOBJECT || ttype(Address(object)) != LUA_T_USERDATA) |
| 276 | return NULL; | 264 | return NULL; |
| 277 | else return tsvalue(Address(object))->u.d.v; | 265 | else return tsvalue(Address(object))->u.d.value; |
| 278 | } | 266 | } |
| 279 | 267 | ||
| 280 | lua_CFunction lua_getcfunction (lua_Object object) { | 268 | lua_CFunction lua_getcfunction (lua_Object object) { |
| @@ -388,31 +376,32 @@ void lua_settag (int tag) { | |||
| 388 | } | 376 | } |
| 389 | 377 | ||
| 390 | 378 | ||
| 391 | TaggedString *luaA_nextvar (TaggedString *g) { | 379 | GlobalVar *luaA_nextvar (TaggedString *ts) { |
| 392 | if (g == NULL) | 380 | GlobalVar *gv; |
| 393 | g = L->rootglobal; /* first variable */ | 381 | if (ts == NULL) |
| 382 | gv = L->rootglobal; /* first variable */ | ||
| 394 | else { | 383 | else { |
| 395 | /* check whether name is in global var list */ | 384 | /* check whether name is in global var list */ |
| 396 | luaL_arg_check(g != g->nextglobal, 1, "variable name expected"); | 385 | luaL_arg_check(ts->u.s.gv, 1, "variable name expected"); |
| 397 | g = g->nextglobal; /* get next */ | 386 | gv = ts->u.s.gv->next; /* get next */ |
| 398 | } | 387 | } |
| 399 | while (g && g->u.s.globalval.ttype == LUA_T_NIL) /* skip globals with nil */ | 388 | while (gv && gv->value.ttype == LUA_T_NIL) /* skip globals with nil */ |
| 400 | g = g->nextglobal; | 389 | gv = gv->next; |
| 401 | if (g) { | 390 | if (gv) { |
| 402 | ttype(L->stack.top) = LUA_T_STRING; tsvalue(L->stack.top) = g; | 391 | ttype(L->stack.top) = LUA_T_STRING; tsvalue(L->stack.top) = gv->name; |
| 403 | incr_top; | 392 | incr_top; |
| 404 | luaA_pushobject(&g->u.s.globalval); | 393 | luaA_pushobject(&gv->value); |
| 405 | } | 394 | } |
| 406 | return g; | 395 | return gv; |
| 407 | } | 396 | } |
| 408 | 397 | ||
| 409 | 398 | ||
| 410 | const char *lua_nextvar (const char *varname) { | 399 | const char *lua_nextvar (const char *varname) { |
| 411 | TaggedString *g = (varname == NULL) ? NULL : luaS_new(varname); | 400 | TaggedString *ts = (varname == NULL) ? NULL : luaS_new(varname); |
| 412 | g = luaA_nextvar(g); | 401 | GlobalVar *gv = luaA_nextvar(ts); |
| 413 | if (g) { | 402 | if (gv) { |
| 414 | top2LC(2); | 403 | top2LC(2); |
| 415 | return g->str; | 404 | return gv->name->str; |
| 416 | } | 405 | } |
| 417 | else { | 406 | else { |
| 418 | top2LC(0); | 407 | top2LC(0); |
| @@ -577,11 +566,11 @@ static int checkfunc (TObject *o) { | |||
| 577 | 566 | ||
| 578 | const char *lua_getobjname (lua_Object o, const char **name) { | 567 | const char *lua_getobjname (lua_Object o, const char **name) { |
| 579 | /* try to find a name for given function */ | 568 | /* try to find a name for given function */ |
| 580 | TaggedString *g; | 569 | GlobalVar *g; |
| 581 | set_normalized(L->stack.top, Address(o)); /* to be accessed by "checkfunc" */ | 570 | set_normalized(L->stack.top, Address(o)); /* to be accessed by "checkfunc" */ |
| 582 | for (g=L->rootglobal; g; g=g->nextglobal) { | 571 | for (g=L->rootglobal; g; g=g->next) { |
| 583 | if (checkfunc(&g->u.s.globalval)) { | 572 | if (checkfunc(&g->value)) { |
| 584 | *name = g->str; | 573 | *name = g->name->str; |
| 585 | return "global"; | 574 | return "global"; |
| 586 | } | 575 | } |
| 587 | } | 576 | } |
