Преглед изворни кода

Tracebacks recognize metamethods '__close'

Roberto Ierusalimschy пре 6 година
родитељ
комит
fe040633a1
2 измењених фајлова са 20 додато и 4 уклоњено
  1. 3 0
      ldebug.c
  2. 17 4
      testes/locals.lua

+ 3 - 0
ldebug.c

@@ -651,6 +651,9 @@ static const char *funcnamefromcode (lua_State *L, CallInfo *ci,
     case OP_SHRI: case OP_SHLI:
       *name = "shift";
       return "metamethod";
+    case OP_CLOSE: case OP_RETURN:
+      *name = "close";
+      return "metamethod";
     default:
       return NULL;  /* cannot find a reasonable name */
   }

+ 17 - 4
testes/locals.lua

@@ -316,14 +316,27 @@ do   -- errors in __close
   assert(log[1] == 5 and log[2] == 4 and log[3] == 4 and log[4] == 4
          and #log == 4)
 
+  -- error leaving a block
+  local function foo (...)
+    do
+      local x1 <close> = func2close(function () error("Y") end)
+      local x123 <close> = func2close(function () error("X") end)
+    end
+  end
+
+  local st, msg = xpcall(foo, debug.traceback)
+  assert(string.match(msg, "^[^ ]* X"))
+  assert(string.find(msg, "in metamethod 'close'"))
+
   -- error in toclose in vararg function
-  function foo (...)
-    local x123 <close> = 10
+  local function foo (...)
+    local x123 <close> = func2close(function () error("X") end)
   end
 
-  local st, msg = pcall(foo)
-  assert(string.find(msg, "'x123'"))
+  local st, msg = xpcall(foo, debug.traceback)
+  assert(string.match(msg, "^[^ ]* X"))
 
+  assert(string.find(msg, "in metamethod 'close'"))
 end