commit 4664f2e9270a956f6175481abe590ba4931b7477
parent 2e38c6ae5a53cbf1a607a790460fca45ba3b9ca8
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Tue, 6 Aug 2002 15:53:56 -0300
any Lua closure has a table of globals (not only active functions)
Diffstat:
M | lapi.c | | | 37 | ++++++++++++++----------------------- |
M | lbaselib.c | | | 31 | +++++++++++++++++++++---------- |
M | lua.h | | | 6 | +++--- |
3 files changed, 38 insertions(+), 36 deletions(-)
diff --git a/lapi.c b/lapi.c
@@ -1,5 +1,5 @@
/*
-** $Id: lapi.c,v 1.207 2002/08/06 15:32:22 roberto Exp roberto $
+** $Id: lapi.c,v 1.208 2002/08/06 17:06:56 roberto Exp roberto $
** Lua API
** See Copyright Notice in lua.h
*/
@@ -506,24 +506,11 @@ LUA_API int lua_getmetatable (lua_State *L, int objindex) {
}
-static LClosure *getfunc (lua_State *L, int level) {
- CallInfo *ci;
- TObject *f;
- if (L->ci - L->base_ci < level) ci = L->base_ci;
- else ci = L->ci - level;
- f = ci->base - 1;
- if (isLfunction(f))
- return &clvalue(f)->l;
- else
- return NULL;
-}
-
-
-LUA_API void lua_getglobals (lua_State *L, int level) {
- LClosure *f;
+LUA_API void lua_getglobals (lua_State *L, int index) {
+ StkId o;
lua_lock(L);
- f = getfunc(L, level);
- setobj(L->top, (f ? &f->g : gt(L)));
+ o = luaA_index(L, index);
+ setobj(L->top, isLfunction(o) ? &clvalue(o)->l.g : gt(L));
api_incr_top(L);
lua_unlock(L);
}
@@ -608,16 +595,20 @@ LUA_API int lua_setmetatable (lua_State *L, int objindex) {
}
-LUA_API int lua_setglobals (lua_State *L, int level) {
- LClosure *f;
+LUA_API int lua_setglobals (lua_State *L, int index) {
+ StkId o;
+ int res = 0;
lua_lock(L);
api_checknelems(L, 1);
- f = getfunc(L, level);
+ o = luaA_index(L, index);
L->top--;
api_check(L, ttistable(L->top));
- if (f) f->g = *(L->top);
+ if (isLfunction(o)) {
+ res = 1;
+ clvalue(o)->l.g = *(L->top);
+ }
lua_unlock(L);
- return (f != NULL);
+ return res;
}
diff --git a/lbaselib.c b/lbaselib.c
@@ -1,5 +1,5 @@
/*
-** $Id: lbaselib.c,v 1.94 2002/08/06 17:06:56 roberto Exp roberto $
+** $Id: lbaselib.c,v 1.95 2002/08/06 18:01:50 roberto Exp roberto $
** Basic library
** See Copyright Notice in lua.h
*/
@@ -123,21 +123,32 @@ static int luaB_setmetatable (lua_State *L) {
}
+static void getfunc (lua_State *L) {
+ if (lua_isfunction(L, 1)) lua_pushvalue(L, 1);
+ else {
+ lua_Debug ar;
+ int level = luaL_opt_int(L, 1, 1);
+ luaL_arg_check(L, level >= 0, 1, "level must be non-negative");
+ if (lua_getstack(L, level, &ar) == 0)
+ luaL_argerror(L, 1, "invalid level");
+ lua_getinfo(L, "f", &ar);
+ }
+}
+
+
static int luaB_getglobals (lua_State *L) {
- int level = luaL_opt_int(L, 1, 1);
- luaL_arg_check(L, level >= 0, 2, "level must be non-negative");
- lua_getglobals(L, level); /* value to be returned */
+ getfunc(L);
+ lua_getglobals(L, -1);
return 1;
}
static int luaB_setglobals (lua_State *L) {
- int level = luaL_opt_int(L, 2, 1);
- luaL_arg_check(L, level >= 1, 2, "level must be positive");
- luaL_check_type(L, 1, LUA_TTABLE);
- lua_settop(L, 1);
- if (lua_setglobals(L, level) == 0)
- luaL_error(L, "cannot change global table at level %d", level);
+ luaL_check_type(L, 2, LUA_TTABLE);
+ getfunc(L);
+ lua_pushvalue(L, 2);
+ if (lua_setglobals(L, -2) == 0)
+ luaL_error(L, "cannot change global table of given function");
return 0;
}
diff --git a/lua.h b/lua.h
@@ -1,5 +1,5 @@
/*
-** $Id: lua.h,v 1.151 2002/08/06 17:26:45 roberto Exp roberto $
+** $Id: lua.h,v 1.152 2002/08/06 18:01:50 roberto Exp roberto $
** Lua - An Extensible Extension Language
** Tecgraf: Computer Graphics Technology Group, PUC-Rio, Brazil
** http://www.lua.org mailto:info@lua.org
@@ -167,7 +167,7 @@ LUA_API void lua_rawgeti (lua_State *L, int index, int n);
LUA_API void lua_newtable (lua_State *L);
LUA_API int lua_getmetatable (lua_State *L, int objindex);
LUA_API const char *lua_getmode (lua_State *L, int index);
-LUA_API void lua_getglobals (lua_State *L, int level);
+LUA_API void lua_getglobals (lua_State *L, int index);
/*
@@ -178,7 +178,7 @@ LUA_API void lua_rawset (lua_State *L, int index);
LUA_API void lua_rawseti (lua_State *L, int index, int n);
LUA_API void lua_setmode (lua_State *L, int index, const char *mode);
LUA_API int lua_setmetatable (lua_State *L, int objindex);
-LUA_API int lua_setglobals (lua_State *L, int level);
+LUA_API int lua_setglobals (lua_State *L, int index);
/*