Răsfoiți Sursa

Fixed some bugs around stack reallocation

Long time without using HARDSTACKTESTS...
Roberto Ierusalimschy 4 ani în urmă
părinte
comite
2bfa13e520
4 a modificat fișierele cu 6 adăugiri și 1 ștergeri
  1. 1 0
      lapi.c
  2. 1 1
      ldo.c
  3. 2 0
      lfunc.c
  4. 2 0
      lvm.c

+ 1 - 0
lapi.c

@@ -207,6 +207,7 @@ LUA_API void lua_closeslot (lua_State *L, int idx) {
                uplevel(L->openupval) == level,
      "no variable to close at given level");
   luaF_close(L, level, CLOSEKTOP, 0);
+  level = index2stack(L, idx);  /* stack may be moved */
   setnilvalue(s2v(level));
   lua_unlock(L);
 }

+ 1 - 1
ldo.c

@@ -412,12 +412,12 @@ static void moveresults (lua_State *L, StkId res, int nres, int wanted) {
       if (hastocloseCfunc(wanted)) {  /* to-be-closed variables? */
         ptrdiff_t savedres = savestack(L, res);
         luaF_close(L, res, CLOSEKTOP, 0);  /* may change the stack */
-        res = restorestack(L, savedres);
         wanted = codeNresults(wanted);  /* correct value */
         if (wanted == LUA_MULTRET)
           wanted = nres;
         if (L->hookmask)  /* if needed, call hook after '__close's */
           rethook(L, L->ci, nres);
+        res = restorestack(L, savedres);  /* close and hook can move stack */
       }
       break;
   }

+ 2 - 0
lfunc.c

@@ -190,9 +190,11 @@ void luaF_close (lua_State *L, StkId level, int status, int yy) {
   UpVal *uv;
   StkId upl;  /* stack index pointed by 'uv' */
   if (unlikely(status == LUA_ERRMEM && L->ptbc != NULL)) {
+    ptrdiff_t levelrel = savestack(L, level);
     upl = L->ptbc;
     L->ptbc = NULL;  /* remove from "list" before closing */
     prepcallclosemth(L, upl, status, yy);
+    level = restorestack(L, levelrel);
   }
   else
     lua_assert(L->ptbc == NULL);  /* must be empty for other status */

+ 2 - 0
lvm.c

@@ -1150,6 +1150,8 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
     Instruction i;  /* instruction being executed */
     StkId ra;  /* instruction's A register */
     vmfetch();
+// low-level line tracing for debugging Lua
+// printf("line: %d\n", luaG_getfuncline(cl->p, pcRel(pc, cl->p)));
     lua_assert(base == ci->func + 1);
     lua_assert(base <= L->top && L->top < L->stack_last);
     /* invalidate top for instructions not expecting it */