Browse Source

bug in 5.4 alpha rc1: to-be-closed x vararg functions

Closing methods must be run before correcting 'ci->func' when exiting
a vararg function, to get correct debug information (e.g., in case of
errors).
Roberto Ierusalimschy 6 năm trước cách đây
mục cha
commit
4a3fd8488d
2 tập tin đã thay đổi với 10 bổ sung1 xóa
  1. 1 1
      lvm.c
  2. 9 0
      testes/locals.lua

+ 1 - 1
lvm.c

@@ -1593,9 +1593,9 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
         savepc(ci);
         if (TESTARG_k(i)) {
           int nparams1 = GETARG_C(i);
+          luaF_close(L, base, LUA_OK);  /* there may be open upvalues */
           if (nparams1)  /* vararg function? */
             ci->func -= ci->u.l.nextraargs + nparams1;
-          luaF_close(L, base, LUA_OK);  /* there may be open upvalues */
         }
         luaD_poscall(L, ci, n);
         return;

+ 9 - 0
testes/locals.lua

@@ -276,6 +276,15 @@ do   -- errors in __close
   assert(msg == 1)
   assert(log[1] == 4 and log[2] == 3 and log[3] == 2 and log[4] == 2
          and #log == 4)
+
+  -- error in toclose in vararg function
+  function foo (...)
+    local <toclose> x123 = 10
+  end
+
+  local st, msg = pcall(foo)
+  assert(string.find(msg, "'x123'"))
+
 end