diff --git a/ldebug.c b/ldebug.c index acaa653a..9593039b 100644 --- a/ldebug.c +++ b/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 */ } diff --git a/testes/locals.lua b/testes/locals.lua index 6eb1ba0e..99fa79cd 100644 --- a/testes/locals.lua +++ b/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 in toclose in vararg function - function foo (...) - local x123 = 10 + -- error leaving a block + local function foo (...) + do + local x1 = func2close(function () error("Y") end) + local x123 = func2close(function () error("X") end) + 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'")) + -- error in toclose in vararg function + local function foo (...) + local x123 = func2close(function () error("X") end) + end + + local st, msg = xpcall(foo, debug.traceback) + assert(string.match(msg, "^[^ ]* X")) + + assert(string.find(msg, "in metamethod 'close'")) end