From 1514e49d4321efc30d597e05a072266c7c4d697d Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 17 Mar 2010 18:37:37 -0300 Subject: avoid using function environments in C libraries (as it probably will be deprecated) --- loadlib.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) (limited to 'loadlib.c') diff --git a/loadlib.c b/loadlib.c index eba25e30..44112e31 100644 --- a/loadlib.c +++ b/loadlib.c @@ -1,5 +1,5 @@ /* -** $Id: loadlib.c,v 1.79 2010/01/13 16:09:05 roberto Exp roberto $ +** $Id: loadlib.c,v 1.80 2010/01/13 16:30:27 roberto Exp roberto $ ** Dynamic library loader for Lua ** See Copyright Notice in lua.h ** @@ -353,9 +353,7 @@ static int ll_loadfunc (lua_State *L, const char *path, const char *sym) { lua_CFunction f = ll_sym(L, *reg, sym); if (f == NULL) return ERRFUNC; /* unable to find function */ - lua_pushcfunction(L, f); /* else create new function... */ - lua_pushglobaltable(L); /* ... and set the standard global table... */ - lua_setfenv(L, -2); /* ... as its environment */ + lua_pushcfunction(L, f); /* else create new function */ return 0; /* no errors */ } } @@ -435,7 +433,7 @@ static int ll_searchpath (lua_State *L) { static const char *findfile (lua_State *L, const char *name, const char *pname) { const char *path; - lua_getfield(L, LUA_ENVIRONINDEX, pname); + lua_getfield(L, lua_upvalueindex(1), pname); path = lua_tostring(L, -1); if (path == NULL) luaL_error(L, LUA_QL("package.%s") " must be a string", pname); @@ -509,7 +507,7 @@ static int loader_Croot (lua_State *L) { static int loader_preload (lua_State *L) { const char *name = luaL_checkstring(L, 1); - lua_getfield(L, LUA_ENVIRONINDEX, "preload"); + lua_getfield(L, lua_upvalueindex(1), "preload"); if (!lua_istable(L, -1)) luaL_error(L, LUA_QL("package.preload") " must be a table"); lua_getfield(L, -1, name); @@ -535,7 +533,7 @@ static int ll_require (lua_State *L) { return 1; /* package is already loaded */ } /* else must load it; iterate over available loaders */ - lua_getfield(L, LUA_ENVIRONINDEX, "loaders"); + lua_getfield(L, lua_upvalueindex(1), "loaders"); if (!lua_istable(L, -1)) luaL_error(L, LUA_QL("package.loaders") " must be a table"); lua_pushliteral(L, ""); /* error message accumulator */ @@ -709,12 +707,12 @@ LUAMOD_API int luaopen_package (lua_State *L) { lua_setfield(L, -2, "__gc"); /* create `package' table */ luaL_register(L, LUA_LOADLIBNAME, pk_funcs); - lua_copy(L, -1, LUA_ENVIRONINDEX); /* create `loaders' table */ lua_createtable(L, sizeof(loaders)/sizeof(loaders[0]) - 1, 0); /* fill it with pre-defined loaders */ for (i=0; loaders[i] != NULL; i++) { - lua_pushcfunction(L, loaders[i]); + lua_pushvalue(L, -2); /* set 'package' as upvalue for all loaders */ + lua_pushcclosure(L, loaders[i], 1); lua_rawseti(L, -2, i+1); } lua_setfield(L, -2, "loaders"); /* put it in field `loaders' */ @@ -731,8 +729,9 @@ LUAMOD_API int luaopen_package (lua_State *L) { lua_newtable(L); lua_setfield(L, -2, "preload"); lua_pushglobaltable(L); - luaL_register(L, NULL, ll_funcs); /* open lib into global table */ - lua_pop(L, 1); + lua_pushvalue(L, -2); /* set 'package' as upvalue for next lib */ + luaL_openlib(L, NULL, ll_funcs, 1); /* open lib into global table */ + lua_pop(L, 1); /* pop global table */ return 1; /* return 'package' table */ } -- cgit v1.2.3-55-g6feb