浏览代码

no more fenvs!

Roberto Ierusalimschy 15 年之前
父节点
当前提交
064e406f67
共有 16 个文件被更改,包括 78 次插入170 次删除
  1. 29 68
      lapi.c
  2. 1 39
      lbaselib.c
  3. 11 11
      ldblib.c
  4. 2 2
      ldo.c
  5. 3 5
      lfunc.c
  6. 3 3
      lfunc.h
  7. 2 5
      lgc.c
  8. 4 5
      linit.c
  9. 4 4
      liolib.c
  10. 2 3
      lobject.h
  11. 2 5
      lstate.c
  12. 1 2
      lstate.h
  13. 7 3
      ltests.c
  14. 4 5
      lua.h
  15. 1 8
      luaconf.h
  16. 2 2
      lvm.c

+ 29 - 68
lapi.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lapi.c,v 2.115 2010/03/22 18:28:03 roberto Exp roberto $
+** $Id: lapi.c,v 2.116 2010/03/25 19:37:23 roberto Exp roberto $
 ** Lua API
 ** Lua API
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -39,16 +39,6 @@ const char lua_ident[] =
 					  "invalid index")
 					  "invalid index")
 
 
 
 
-static Table *getcurrenv (lua_State *L) {
-  if (L->ci->previous == NULL)  /* no enclosing function? */
-    return G(L)->l_gt;  /* use global table as environment */
-  else {
-    Closure *func = curr_func(L);
-    return func->c.env;
-  }
-}
-
-
 static TValue *index2addr (lua_State *L, int idx) {
 static TValue *index2addr (lua_State *L, int idx) {
   CallInfo *ci = L->ci;
   CallInfo *ci = L->ci;
   if (idx > 0) {
   if (idx > 0) {
@@ -61,20 +51,15 @@ static TValue *index2addr (lua_State *L, int idx) {
     api_check(L, idx != 0 && -idx <= L->top - (ci->func + 1), "invalid index");
     api_check(L, idx != 0 && -idx <= L->top - (ci->func + 1), "invalid index");
     return L->top + idx;
     return L->top + idx;
   }
   }
-  else switch (idx) {  /* pseudo-indices */
-    case LUA_REGISTRYINDEX: return &G(L)->l_registry;
-    case LUA_ENVIRONINDEX: {
-      sethvalue(L, &L->env, getcurrenv(L));
-      return &L->env;
-    }
-    default: {
-      Closure *func = curr_func(L);
-      idx = LUA_ENVIRONINDEX - idx;
-      api_check(L, idx <= UCHAR_MAX + 1, "upvalue index too large");
-      return (idx <= func->c.nupvalues)
-                ? &func->c.upvalue[idx-1]
-                : cast(TValue *, luaO_nilobject);
-    }
+  else if (idx == LUA_REGISTRYINDEX)
+    return &G(L)->l_registry;
+  else {  /* upvalues */
+    Closure *func = curr_func(L);
+    idx = LUA_REGISTRYINDEX - idx;
+    api_check(L, idx <= UCHAR_MAX + 1, "upvalue index too large");
+    return (idx <= func->c.nupvalues)
+              ? &func->c.upvalue[idx-1]
+              : cast(TValue *, luaO_nilobject);
   }
   }
 }
 }
 
 
@@ -195,17 +180,9 @@ LUA_API void lua_insert (lua_State *L, int idx) {
 static void moveto (lua_State *L, TValue *fr, int idx) {
 static void moveto (lua_State *L, TValue *fr, int idx) {
   TValue *to = index2addr(L, idx);
   TValue *to = index2addr(L, idx);
   api_checkvalidindex(L, to);
   api_checkvalidindex(L, to);
-  if (idx == LUA_ENVIRONINDEX) {
-    Closure *func = curr_func(L);
-    api_check(L, ttistable(fr), "table expected");
-    func->c.env = hvalue(fr);
-    luaC_barrier(L, func, fr);
-  }
-  else {
-    setobj(L, to, fr);
-    if (idx < LUA_ENVIRONINDEX)  /* function upvalue? */
-      luaC_barrier(L, curr_func(L), fr);
-  }
+  setobj(L, to, fr);
+  if (idx < LUA_REGISTRYINDEX)  /* function upvalue? */
+    luaC_barrier(L, curr_func(L), fr);
   /* LUA_REGISTRYINDEX does not need gc barrier
   /* LUA_REGISTRYINDEX does not need gc barrier
      (collector revisits it before finishing collection) */
      (collector revisits it before finishing collection) */
 }
 }
@@ -213,9 +190,6 @@ static void moveto (lua_State *L, TValue *fr, int idx) {
 
 
 LUA_API void lua_replace (lua_State *L, int idx) {
 LUA_API void lua_replace (lua_State *L, int idx) {
   lua_lock(L);
   lua_lock(L);
-  /* explicit test for incompatible code */
-  if (idx == LUA_ENVIRONINDEX && L->ci->previous == NULL)
-    luaG_runerror(L, "no calling environment");
   api_checknelems(L, 1);
   api_checknelems(L, 1);
   moveto(L, L->top - 1, idx);
   moveto(L, L->top - 1, idx);
   L->top--;
   L->top--;
@@ -503,7 +477,7 @@ LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
   api_checknelems(L, n);
   api_checknelems(L, n);
   api_check(L, n <= UCHAR_MAX, "upvalue index too large");
   api_check(L, n <= UCHAR_MAX, "upvalue index too large");
   luaC_checkGC(L);
   luaC_checkGC(L);
-  cl = luaF_newCclosure(L, n, getcurrenv(L));
+  cl = luaF_newCclosure(L, n);
   cl->c.f = fn;
   cl->c.f = fn;
   L->top -= n;
   L->top -= n;
   while (n--)
   while (n--)
@@ -631,22 +605,16 @@ LUA_API int lua_getmetatable (lua_State *L, int objindex) {
 }
 }
 
 
 
 
-LUA_API void lua_getfenv (lua_State *L, int idx) {
+LUA_API void lua_getenv (lua_State *L, int idx) {
   StkId o;
   StkId o;
   lua_lock(L);
   lua_lock(L);
   o = index2addr(L, idx);
   o = index2addr(L, idx);
   api_checkvalidindex(L, o);
   api_checkvalidindex(L, o);
-  switch (ttype(o)) {
-    case LUA_TFUNCTION:
-      sethvalue(L, L->top, clvalue(o)->c.env);
-      break;
-    case LUA_TUSERDATA:
-      sethvalue(L, L->top, uvalue(o)->env);
-      break;
-    default:
-      setnilvalue(L->top);
-      break;
-  }
+  api_check(L, ttisuserdata(o), "userdata expected");
+  if (uvalue(o)->env) {
+    sethvalue(L, L->top, uvalue(o)->env);
+  } else
+    setnilvalue(L->top);
   api_incr_top(L);
   api_incr_top(L);
   lua_unlock(L);
   lua_unlock(L);
 }
 }
@@ -747,29 +715,22 @@ LUA_API int lua_setmetatable (lua_State *L, int objindex) {
 }
 }
 
 
 
 
-LUA_API int lua_setfenv (lua_State *L, int idx) {
+LUA_API void lua_setenv (lua_State *L, int idx) {
   StkId o;
   StkId o;
-  int res = 1;
   lua_lock(L);
   lua_lock(L);
   api_checknelems(L, 1);
   api_checknelems(L, 1);
   o = index2addr(L, idx);
   o = index2addr(L, idx);
   api_checkvalidindex(L, o);
   api_checkvalidindex(L, o);
-  api_check(L, ttistable(L->top - 1), "table expected");
-  switch (ttype(o)) {
-    case LUA_TFUNCTION:
-      clvalue(o)->c.env = hvalue(L->top - 1);
-      break;
-    case LUA_TUSERDATA:
-      uvalue(o)->env = hvalue(L->top - 1);
-      break;
-    default:
-      res = 0;
-      break;
+  api_check(L, ttisuserdata(o), "userdata expected");
+  if (ttisnil(L->top - 1))
+    uvalue(o)->env = NULL;
+  else {
+    api_check(L, ttistable(L->top - 1), "table expected");
+    uvalue(o)->env = hvalue(L->top - 1);
+    luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1));
   }
   }
-  if (res) luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1));
   L->top--;
   L->top--;
   lua_unlock(L);
   lua_unlock(L);
-  return res;
 }
 }
 
 
 
 
@@ -1072,7 +1033,7 @@ LUA_API void *lua_newuserdata (lua_State *L, size_t size) {
   Udata *u;
   Udata *u;
   lua_lock(L);
   lua_lock(L);
   luaC_checkGC(L);
   luaC_checkGC(L);
-  u = luaS_newudata(L, size, getcurrenv(L));
+  u = luaS_newudata(L, size, NULL);
   setuvalue(L, L->top, u);
   setuvalue(L, L->top, u);
   api_incr_top(L);
   api_incr_top(L);
   lua_unlock(L);
   lua_unlock(L);

+ 1 - 39
lbaselib.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lbaselib.c,v 1.238 2010/03/19 15:52:48 roberto Exp roberto $
+** $Id: lbaselib.c,v 1.239 2010/03/22 18:28:03 roberto Exp roberto $
 ** Basic library
 ** Basic library
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -107,50 +107,12 @@ static int luaB_setmetatable (lua_State *L) {
 }
 }
 
 
 
 
-
-#if defined(LUA_COMPAT_FENV)
-
-static void getfunc (lua_State *L, int opt) {
-  if (lua_isfunction(L, 1)) lua_pushvalue(L, 1);
-  else {
-    lua_Debug ar;
-    int level = opt ? luaL_optint(L, 1, 1) : luaL_checkint(L, 1);
-    luaL_argcheck(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_getfenv (lua_State *L) {
-  getfunc(L, 1);
-  if (lua_iscfunction(L, -1))  /* is a C function? */
-    lua_pushglobaltable(L);  /* return the global env. */
-  else
-    lua_getfenv(L, -1);
-  return 1;
-}
-
-static int luaB_setfenv (lua_State *L) {
-  luaL_checktype(L, 2, LUA_TTABLE);
-  getfunc(L, 0);
-  lua_pushvalue(L, 2);
-  if (lua_iscfunction(L, -2) || lua_setfenv(L, -2) == 0)
-    return luaL_error(L,
-             LUA_QL("setfenv") " cannot change environment of given object");
-  return 1;
-}
-
-#else
-
 static int luaB_getfenv (lua_State *L) {
 static int luaB_getfenv (lua_State *L) {
   return luaL_error(L, "getfenv/setfenv deprecated");
   return luaL_error(L, "getfenv/setfenv deprecated");
 }
 }
 
 
 #define luaB_setfenv	luaB_getfenv
 #define luaB_setfenv	luaB_getfenv
 
 
-#endif
-
 
 
 static int luaB_rawequal (lua_State *L) {
 static int luaB_rawequal (lua_State *L) {
   luaL_checkany(L, 1);
   luaL_checkany(L, 1);

+ 11 - 11
ldblib.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: ldblib.c,v 1.119 2010/01/06 14:42:35 roberto Exp roberto $
+** $Id: ldblib.c,v 1.120 2010/02/18 19:18:41 roberto Exp roberto $
 ** Interface from Lua to its debug API
 ** Interface from Lua to its debug API
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -44,19 +44,19 @@ static int db_setmetatable (lua_State *L) {
 }
 }
 
 
 
 
-static int db_getfenv (lua_State *L) {
-  luaL_checkany(L, 1);
-  lua_getfenv(L, 1);
+static int db_getenv (lua_State *L) {
+  luaL_checktype(L, 1, LUA_TUSERDATA);
+  lua_getenv(L, 1);
   return 1;
   return 1;
 }
 }
 
 
 
 
-static int db_setfenv (lua_State *L) {
-  luaL_checktype(L, 2, LUA_TTABLE);
+static int db_setenv (lua_State *L) {
+  luaL_checktype(L, 1, LUA_TUSERDATA);
+  if (!lua_isnoneornil(L, 2))
+    luaL_checktype(L, 2, LUA_TTABLE);
   lua_settop(L, 2);
   lua_settop(L, 2);
-  if (lua_setfenv(L, 1) == 0)
-    luaL_error(L, LUA_QL("setfenv")
-                  " cannot change environment of given object");
+  lua_setenv(L, 1);
   return 1;
   return 1;
 }
 }
 
 
@@ -367,7 +367,7 @@ static int db_traceback (lua_State *L) {
 
 
 static const luaL_Reg dblib[] = {
 static const luaL_Reg dblib[] = {
   {"debug", db_debug},
   {"debug", db_debug},
-  {"getfenv", db_getfenv},
+  {"getenv", db_getenv},
   {"gethook", db_gethook},
   {"gethook", db_gethook},
   {"getinfo", db_getinfo},
   {"getinfo", db_getinfo},
   {"getlocal", db_getlocal},
   {"getlocal", db_getlocal},
@@ -376,7 +376,7 @@ static const luaL_Reg dblib[] = {
   {"getupvalue", db_getupvalue},
   {"getupvalue", db_getupvalue},
   {"upvaluejoin", db_upvaluejoin},
   {"upvaluejoin", db_upvaluejoin},
   {"upvalueid", db_upvalueid},
   {"upvalueid", db_upvalueid},
-  {"setfenv", db_setfenv},
+  {"setenv", db_setenv},
   {"sethook", db_sethook},
   {"sethook", db_sethook},
   {"setlocal", db_setlocal},
   {"setlocal", db_setlocal},
   {"setmetatable", db_setmetatable},
   {"setmetatable", db_setmetatable},

+ 2 - 2
ldo.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: ldo.c,v 2.80 2010/01/13 16:17:32 roberto Exp roberto $
+** $Id: ldo.c,v 2.81 2010/02/09 11:56:29 roberto Exp roberto $
 ** Stack and Call structure of Lua
 ** Stack and Call structure of Lua
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -622,7 +622,7 @@ static void f_parser (lua_State *L, void *ud) {
            : luaY_parser(L, p->z, &p->buff, &p->varl, p->name);
            : luaY_parser(L, p->z, &p->buff, &p->varl, p->name);
   setptvalue2s(L, L->top, tf);
   setptvalue2s(L, L->top, tf);
   incr_top(L);
   incr_top(L);
-  cl = luaF_newLclosure(L, tf->sizeupvalues, G(L)->l_gt);
+  cl = luaF_newLclosure(L, tf->sizeupvalues);
   cl->l.p = tf;
   cl->l.p = tf;
   setclvalue(L, L->top - 1, cl);
   setclvalue(L, L->top - 1, cl);
   for (i = 0; i < tf->sizeupvalues; i++)  /* initialize upvalues */
   for (i = 0; i < tf->sizeupvalues; i++)  /* initialize upvalues */

+ 3 - 5
lfunc.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lfunc.c,v 2.19 2009/12/16 16:42:58 roberto Exp roberto $
+** $Id: lfunc.c,v 2.20 2010/03/12 19:14:06 roberto Exp roberto $
 ** Auxiliary functions to manipulate prototypes and closures
 ** Auxiliary functions to manipulate prototypes and closures
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -21,19 +21,17 @@
 
 
 
 
 
 
-Closure *luaF_newCclosure (lua_State *L, int n, Table *e) {
+Closure *luaF_newCclosure (lua_State *L, int n) {
   Closure *c = &luaC_newobj(L, LUA_TFUNCTION, sizeCclosure(n), NULL, 0)->cl;
   Closure *c = &luaC_newobj(L, LUA_TFUNCTION, sizeCclosure(n), NULL, 0)->cl;
   c->c.isC = 1;
   c->c.isC = 1;
-  c->c.env = e;
   c->c.nupvalues = cast_byte(n);
   c->c.nupvalues = cast_byte(n);
   return c;
   return c;
 }
 }
 
 
 
 
-Closure *luaF_newLclosure (lua_State *L, int n, Table *e) {
+Closure *luaF_newLclosure (lua_State *L, int n) {
   Closure *c = &luaC_newobj(L, LUA_TFUNCTION, sizeLclosure(n), NULL, 0)->cl;
   Closure *c = &luaC_newobj(L, LUA_TFUNCTION, sizeLclosure(n), NULL, 0)->cl;
   c->l.isC = 0;
   c->l.isC = 0;
-  c->l.env = e;
   c->l.nupvalues = cast_byte(n);
   c->l.nupvalues = cast_byte(n);
   while (n--) c->l.upvals[n] = NULL;
   while (n--) c->l.upvals[n] = NULL;
   return c;
   return c;

+ 3 - 3
lfunc.h

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lfunc.h,v 2.3 2005/02/18 12:40:02 roberto Exp roberto $
+** $Id: lfunc.h,v 2.4 2005/04/25 19:24:10 roberto Exp roberto $
 ** Auxiliary functions to manipulate prototypes and closures
 ** Auxiliary functions to manipulate prototypes and closures
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -19,8 +19,8 @@
 
 
 
 
 LUAI_FUNC Proto *luaF_newproto (lua_State *L);
 LUAI_FUNC Proto *luaF_newproto (lua_State *L);
-LUAI_FUNC Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e);
-LUAI_FUNC Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e);
+LUAI_FUNC Closure *luaF_newCclosure (lua_State *L, int nelems);
+LUAI_FUNC Closure *luaF_newLclosure (lua_State *L, int nelems);
 LUAI_FUNC UpVal *luaF_newupval (lua_State *L);
 LUAI_FUNC UpVal *luaF_newupval (lua_State *L);
 LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level);
 LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level);
 LUAI_FUNC void luaF_close (lua_State *L, StkId level);
 LUAI_FUNC void luaF_close (lua_State *L, StkId level);

+ 2 - 5
lgc.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lgc.c,v 2.72 2010/03/25 13:06:36 roberto Exp roberto $
+** $Id: lgc.c,v 2.73 2010/03/25 19:37:23 roberto Exp roberto $
 ** Garbage Collector
 ** Garbage Collector
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -375,7 +375,6 @@ static void traverseproto (global_State *g, Proto *f) {
 
 
 
 
 static void traverseclosure (global_State *g, Closure *cl) {
 static void traverseclosure (global_State *g, Closure *cl) {
-  markobject(g, cl->c.env);
   if (cl->c.isC) {
   if (cl->c.isC) {
     int i;
     int i;
     for (i=0; i<cl->c.nupvalues; i++)  /* mark its upvalues */
     for (i=0; i<cl->c.nupvalues; i++)  /* mark its upvalues */
@@ -605,8 +604,6 @@ static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count) {
 
 
 static void checkSizes (lua_State *L) {
 static void checkSizes (lua_State *L) {
   global_State *g = G(L);
   global_State *g = G(L);
-  if (g->gckind == KGC_EMERGENCY)
-    return;  /* do not move buffers during emergency collection */
   if (g->strt.nuse < cast(lu_int32, g->strt.size)) {
   if (g->strt.nuse < cast(lu_int32, g->strt.size)) {
     /* string-table size could be the smaller power of 2 larger than 'nuse' */
     /* string-table size could be the smaller power of 2 larger than 'nuse' */
     int size = 1 << luaO_ceillog2(g->strt.nuse);
     int size = 1 << luaO_ceillog2(g->strt.nuse);
@@ -787,7 +784,6 @@ static l_mem singlestep (lua_State *L) {
         sweeplist(L, cast(GCObject **, &g->mainthread), 1);
         sweeplist(L, cast(GCObject **, &g->mainthread), 1);
         g->sweepgc = &g->udgc;  /* prepare to sweep userdata */
         g->sweepgc = &g->udgc;  /* prepare to sweep userdata */
         g->gcstate = GCSsweepudata;
         g->gcstate = GCSsweepudata;
-        checkSizes(L);
       }
       }
       return GCSWEEPCOST;
       return GCSWEEPCOST;
     }
     }
@@ -809,6 +805,7 @@ static l_mem singlestep (lua_State *L) {
         return GCFINALIZECOST;
         return GCFINALIZECOST;
       }
       }
       else {
       else {
+        checkSizes(L);
         g->gcstate = GCSpause;  /* end collection */
         g->gcstate = GCSpause;  /* end collection */
         return 0;
         return 0;
       }
       }

+ 4 - 5
linit.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: linit.c,v 1.22 2009/12/17 12:26:09 roberto Exp roberto $
+** $Id: linit.c,v 1.23 2009/12/22 15:32:50 roberto Exp roberto $
 ** Initialization of libraries for lua.c and other clients        
 ** Initialization of libraries for lua.c and other clients        
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -52,9 +52,9 @@ LUALIB_API void luaL_openlibs (lua_State *L) {
   const luaL_Reg *lib;
   const luaL_Reg *lib;
   /* call open functions from 'loadedlibs' */
   /* call open functions from 'loadedlibs' */
   for (lib = loadedlibs; lib->func; lib++) {
   for (lib = loadedlibs; lib->func; lib++) {
-    lua_pushcfunction(L, lib->func);
+    lua_settop(L, 0);
     lua_pushstring(L, lib->name);
     lua_pushstring(L, lib->name);
-    lua_call(L, 1, 0);
+    (lib->func)(L);
   }
   }
   /* add open functions from 'preloadedlibs' into 'package.preload' table */
   /* add open functions from 'preloadedlibs' into 'package.preload' table */
   lua_pushglobaltable(L);
   lua_pushglobaltable(L);
@@ -65,8 +65,7 @@ LUALIB_API void luaL_openlibs (lua_State *L) {
   }
   }
   lua_pop(L, 1);  /* remove package.preload table */
   lua_pop(L, 1);  /* remove package.preload table */
 #if defined(LUA_COMPAT_DEBUGLIB)
 #if defined(LUA_COMPAT_DEBUGLIB)
-  lua_pushglobaltable(L);
-  lua_getfield(L, -1, "require");
+  lua_getglobal(L, "require");
   lua_pushliteral(L, LUA_DBLIBNAME);
   lua_pushliteral(L, LUA_DBLIBNAME);
   lua_call(L, 1, 0);  /* call 'require"debug"' */
   lua_call(L, 1, 0);  /* call 'require"debug"' */
   lua_pop(L, 1);  /* remove global table */
   lua_pop(L, 1);  /* remove global table */

+ 4 - 4
liolib.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: liolib.c,v 2.86 2010/03/03 18:48:57 roberto Exp roberto $
+** $Id: liolib.c,v 2.87 2010/03/17 21:37:37 roberto Exp roberto $
 ** Standard I/O (and system) library
 ** Standard I/O (and system) library
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -120,7 +120,7 @@ static FILE **newprefile (lua_State *L) {
 static FILE **newfile (lua_State *L) {
 static FILE **newfile (lua_State *L) {
   FILE **pf = newprefile(L);
   FILE **pf = newprefile(L);
   lua_pushvalue(L, lua_upvalueindex(1));  /* set upvalue... */
   lua_pushvalue(L, lua_upvalueindex(1));  /* set upvalue... */
-  lua_setfenv(L, -2);  /* ... as environment for new file */
+  lua_setenv(L, -2);  /* ... as environment for new file */
   return pf;
   return pf;
 }
 }
 
 
@@ -163,7 +163,7 @@ static int io_fclose (lua_State *L) {
 
 
 
 
 static int aux_close (lua_State *L) {
 static int aux_close (lua_State *L) {
-  lua_getfenv(L, 1);
+  lua_getenv(L, 1);
   lua_getfield(L, -1, "__close");
   lua_getfield(L, -1, "__close");
   return (lua_tocfunction(L, -1))(L);
   return (lua_tocfunction(L, -1))(L);
 }
 }
@@ -595,7 +595,7 @@ static void createstdfile (lua_State *L, FILE *f, int k, const char *fname) {
     lua_rawseti(L, 1, k);  /* add it to common upvalue */
     lua_rawseti(L, 1, k);  /* add it to common upvalue */
   }
   }
   lua_pushvalue(L, 3);  /* get environment for default files */
   lua_pushvalue(L, 3);  /* get environment for default files */
-  lua_setfenv(L, -2);  /* set it as environment for file */
+  lua_setenv(L, -2);  /* set it as environment for file */
   lua_setfield(L, 2, fname);  /* add file to module */
   lua_setfield(L, 2, fname);  /* add file to module */
 }
 }
 
 

+ 2 - 3
lobject.h

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lobject.h,v 2.34 2010/01/08 20:00:20 roberto Exp roberto $
+** $Id: lobject.h,v 2.35 2010/03/12 19:14:06 roberto Exp roberto $
 ** Type definitions for Lua objects
 ** Type definitions for Lua objects
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -297,8 +297,7 @@ typedef struct UpVal {
 */
 */
 
 
 #define ClosureHeader \
 #define ClosureHeader \
-	CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist; \
-	struct Table *env
+	CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist
 
 
 typedef struct CClosure {
 typedef struct CClosure {
   ClosureHeader;
   ClosureHeader;

+ 2 - 5
lstate.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lstate.c,v 2.73 2010/03/25 13:06:36 roberto Exp roberto $
+** $Id: lstate.c,v 2.74 2010/03/25 19:37:23 roberto Exp roberto $
 ** Global State
 ** Global State
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -118,9 +118,6 @@ static void freestack (lua_State *L) {
 static int ccall (lua_State *L) {
 static int ccall (lua_State *L) {
   lua_CFunction f = *(lua_CFunction *)lua_touserdata(L, 1);
   lua_CFunction f = *(lua_CFunction *)lua_touserdata(L, 1);
   lua_remove(L, 1);  /* remove f from stack */
   lua_remove(L, 1);  /* remove f from stack */
-  /* restore original environment for 'ccall' */
-  lua_pushglobaltable(L);
-  lua_replace(L, LUA_ENVIRONINDEX);
   return f(L);
   return f(L);
 }
 }
 
 
@@ -139,7 +136,7 @@ static void init_registry (lua_State *L, global_State *g) {
   setthvalue(L, &mt, L);
   setthvalue(L, &mt, L);
   setobj2t(L, luaH_setint(L, registry, LUA_RIDX_MAINTHREAD), &mt);
   setobj2t(L, luaH_setint(L, registry, LUA_RIDX_MAINTHREAD), &mt);
   /* registry[LUA_RIDX_CCALL] = ccall */
   /* registry[LUA_RIDX_CCALL] = ccall */
-  cp = luaF_newCclosure(L, 0, g->l_gt);
+  cp = luaF_newCclosure(L, 0);
   cp->c.f = ccall;
   cp->c.f = ccall;
   setclvalue(L, &mt, cp);
   setclvalue(L, &mt, cp);
   setobj2t(L, luaH_setint(L, registry, LUA_RIDX_CCALL), &mt);
   setobj2t(L, luaH_setint(L, registry, LUA_RIDX_CCALL), &mt);

+ 1 - 2
lstate.h

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lstate.h,v 2.56 2010/03/24 13:07:01 roberto Exp roberto $
+** $Id: lstate.h,v 2.57 2010/03/25 19:37:23 roberto Exp roberto $
 ** Global State
 ** Global State
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -168,7 +168,6 @@ struct lua_State {
   int basehookcount;
   int basehookcount;
   int hookcount;
   int hookcount;
   lua_Hook hook;
   lua_Hook hook;
-  TValue env;  /* temporary place for environments */
   GCObject *openupval;  /* list of open upvalues in this stack */
   GCObject *openupval;  /* list of open upvalues in this stack */
   GCObject *gclist;
   GCObject *gclist;
   struct lua_longjmp *errorJmp;  /* current error recover point */
   struct lua_longjmp *errorJmp;  /* current error recover point */

+ 7 - 3
ltests.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: ltests.c,v 2.88 2010/03/24 13:07:01 roberto Exp roberto $
+** $Id: ltests.c,v 2.89 2010/03/25 13:06:36 roberto Exp roberto $
 ** Internal Module for Debugging of the Lua Implementation
 ** Internal Module for Debugging of the Lua Implementation
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -275,7 +275,6 @@ static void checkproto (global_State *g, Proto *f) {
 
 
 static void checkclosure (global_State *g, Closure *cl) {
 static void checkclosure (global_State *g, Closure *cl) {
   GCObject *clgc = obj2gco(cl);
   GCObject *clgc = obj2gco(cl);
-  checkobjref(g, clgc, cl->l.env);
   if (cl->c.isC) {
   if (cl->c.isC) {
     int i;
     int i;
     for (i=0; i<cl->c.nupvalues; i++)
     for (i=0; i<cl->c.nupvalues; i++)
@@ -875,7 +874,6 @@ static int getindex_aux (lua_State *L, lua_State *L1, const char **pc) {
   switch (*(*pc)++) {
   switch (*(*pc)++) {
     case 'R': return LUA_REGISTRYINDEX;
     case 'R': return LUA_REGISTRYINDEX;
     case 'G': return luaL_error(L, "deprecated index 'G'");
     case 'G': return luaL_error(L, "deprecated index 'G'");
-    case 'E': return LUA_ENVIRONINDEX;
     case 'U': return lua_upvalueindex(getnum_aux(L, L1, pc));
     case 'U': return lua_upvalueindex(getnum_aux(L, L1, pc));
     default: (*pc)--; return getnum_aux(L, L1, pc);
     default: (*pc)--; return getnum_aux(L, L1, pc);
   }
   }
@@ -1021,6 +1019,9 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) {
     else if EQ("gettable") {
     else if EQ("gettable") {
       lua_gettable(L1, getindex);
       lua_gettable(L1, getindex);
     }
     }
+    else if EQ("getglobal") {
+      lua_getglobal(L1, getstring);
+    }
     else if EQ("getfield") {
     else if EQ("getfield") {
       int t = getindex;
       int t = getindex;
       lua_getfield(L1, t, getstring);
       lua_getfield(L1, t, getstring);
@@ -1036,6 +1037,9 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) {
     else if EQ("settable") {
     else if EQ("settable") {
       lua_settable(L1, getindex);
       lua_settable(L1, getindex);
     }
     }
+    else if EQ("setglobal") {
+      lua_setglobal(L1, getstring);
+    }
     else if EQ("next") {
     else if EQ("next") {
       lua_next(L1, -2);
       lua_next(L1, -2);
     }
     }

+ 4 - 5
lua.h

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lua.h,v 1.263 2010/03/19 21:04:17 roberto Exp roberto $
+** $Id: lua.h,v 1.264 2010/03/22 18:28:03 roberto Exp roberto $
 ** Lua - A Scripting Language
 ** Lua - A Scripting Language
 ** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
 ** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
 ** See Copyright Notice at the end of this file
 ** See Copyright Notice at the end of this file
@@ -34,8 +34,7 @@
 ** pseudo-indices
 ** pseudo-indices
 */
 */
 #define LUA_REGISTRYINDEX	LUAI_FIRSTPSEUDOIDX
 #define LUA_REGISTRYINDEX	LUAI_FIRSTPSEUDOIDX
-#define LUA_ENVIRONINDEX	(LUA_REGISTRYINDEX - 1)
-#define lua_upvalueindex(i)	(LUA_ENVIRONINDEX - (i))
+#define lua_upvalueindex(i)	(LUA_REGISTRYINDEX - (i))
 
 
 
 
 /* thread status */
 /* thread status */
@@ -212,7 +211,7 @@ LUA_API void  (lua_rawgeti) (lua_State *L, int idx, int n);
 LUA_API void  (lua_createtable) (lua_State *L, int narr, int nrec);
 LUA_API void  (lua_createtable) (lua_State *L, int narr, int nrec);
 LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);
 LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);
 LUA_API int   (lua_getmetatable) (lua_State *L, int objindex);
 LUA_API int   (lua_getmetatable) (lua_State *L, int objindex);
-LUA_API void  (lua_getfenv) (lua_State *L, int idx);
+LUA_API void  (lua_getenv) (lua_State *L, int idx);
 
 
 
 
 /*
 /*
@@ -223,7 +222,7 @@ LUA_API void  (lua_setfield) (lua_State *L, int idx, const char *k);
 LUA_API void  (lua_rawset) (lua_State *L, int idx);
 LUA_API void  (lua_rawset) (lua_State *L, int idx);
 LUA_API void  (lua_rawseti) (lua_State *L, int idx, int n);
 LUA_API void  (lua_rawseti) (lua_State *L, int idx, int n);
 LUA_API int   (lua_setmetatable) (lua_State *L, int objindex);
 LUA_API int   (lua_setmetatable) (lua_State *L, int objindex);
-LUA_API int   (lua_setfenv) (lua_State *L, int idx);
+LUA_API void  (lua_setenv) (lua_State *L, int idx);
 
 
 
 
 /*
 /*

+ 1 - 8
luaconf.h

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: luaconf.h,v 1.133 2010/02/18 19:18:41 roberto Exp roberto $
+** $Id: luaconf.h,v 1.134 2010/03/03 18:53:02 roberto Exp roberto $
 ** Configuration file for Lua
 ** Configuration file for Lua
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -233,13 +233,6 @@
 #define lua_cpcall(L,f,u)  \
 #define lua_cpcall(L,f,u)  \
 	(lua_pushlightuserdata(L,(u)), luaL_cpcall(L,(f),1,0))
 	(lua_pushlightuserdata(L,(u)), luaL_cpcall(L,(f),1,0))
 
 
-/*
-@@ LUA_COMPAT_FENV controls the presence of functions 'setfenv/getfenv'.
-** You can replace them with lexical environments, 'loadin', or the
-** debug library.
-*/
-#define LUA_COMPAT_FENV
-
 
 
 /*
 /*
 @@ LUA_COMPAT_LOG10 defines the function 'log10' in the math library.
 @@ LUA_COMPAT_LOG10 defines the function 'log10' in the math library.

+ 2 - 2
lvm.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lvm.c,v 2.105 2010/02/27 21:16:24 roberto Exp roberto $
+** $Id: lvm.c,v 2.106 2010/03/12 19:14:06 roberto Exp roberto $
 ** Lua virtual machine
 ** Lua virtual machine
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -771,7 +771,7 @@ void luaV_execute (lua_State *L) {
       case OP_CLOSURE: {
       case OP_CLOSURE: {
         Proto *p = cl->p->p[GETARG_Bx(i)];  /* prototype for new closure */
         Proto *p = cl->p->p[GETARG_Bx(i)];  /* prototype for new closure */
         int nup = p->sizeupvalues;
         int nup = p->sizeupvalues;
-        Closure *ncl = luaF_newLclosure(L, nup, cl->env);
+        Closure *ncl = luaF_newLclosure(L, nup);
         Upvaldesc *uv = p->upvalues;
         Upvaldesc *uv = p->upvalues;
         int j;
         int j;
         ncl->l.p = p;
         ncl->l.p = p;