aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-12-06 15:05:15 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-12-06 15:05:15 -0200
commitacf62ddfbe1163f7cc1ab463842fb6a1b6aba8fe (patch)
treec2e842a7d655432b5dfe2cfe6ea691e41af70c37
parent04f95ce879ed3d942099145f5e408181a11f4411 (diff)
downloadlua-acf62ddfbe1163f7cc1ab463842fb6a1b6aba8fe.tar.gz
lua-acf62ddfbe1163f7cc1ab463842fb6a1b6aba8fe.tar.bz2
lua-acf62ddfbe1163f7cc1ab463842fb6a1b6aba8fe.zip
"load*" creates chunk with same global table than caller
-rw-r--r--lbaselib.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/lbaselib.c b/lbaselib.c
index 8f8b8fe2..05b08b7f 100644
--- a/lbaselib.c
+++ b/lbaselib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lbaselib.c,v 1.113 2002/12/04 15:38:25 roberto Exp roberto $ 2** $Id: lbaselib.c,v 1.114 2002/12/04 17:38:31 roberto Exp roberto $
3** Basic library 3** Basic library
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -242,8 +242,16 @@ static int luaB_ipairs (lua_State *L) {
242} 242}
243 243
244 244
245static int passresults (lua_State *L, int status) { 245static int load_aux (lua_State *L, int status) {
246 if (status == 0) return 1; 246 if (status == 0) { /* OK? */
247 lua_Debug ar;
248 lua_getstack(L, 1, &ar);
249 lua_getinfo(L, "f", &ar); /* get calling function */
250 lua_getglobals(L, -1); /* get its global table */
251 lua_setglobals(L, -3); /* set it as the global table of the new chunk */
252 lua_pop(L, 1); /* remove calling function */
253 return 1;
254 }
247 else { 255 else {
248 lua_pushnil(L); 256 lua_pushnil(L);
249 lua_insert(L, -2); 257 lua_insert(L, -2);
@@ -256,13 +264,13 @@ static int luaB_loadstring (lua_State *L) {
256 size_t l; 264 size_t l;
257 const char *s = luaL_checklstring(L, 1, &l); 265 const char *s = luaL_checklstring(L, 1, &l);
258 const char *chunkname = luaL_optstring(L, 2, s); 266 const char *chunkname = luaL_optstring(L, 2, s);
259 return passresults(L, luaL_loadbuffer(L, s, l, chunkname)); 267 return load_aux(L, luaL_loadbuffer(L, s, l, chunkname));
260} 268}
261 269
262 270
263static int luaB_loadfile (lua_State *L) { 271static int luaB_loadfile (lua_State *L) {
264 const char *fname = luaL_optstring(L, 1, NULL); 272 const char *fname = luaL_optstring(L, 1, NULL);
265 return passresults(L, luaL_loadfile(L, fname)); 273 return load_aux(L, luaL_loadfile(L, fname));
266} 274}
267 275
268 276