No more to-be-closed functions
To-be-closed variables must contain objects with '__toclose' metamethods (or nil). Functions were removed for several reasons: * Functions interact badly with sandboxes. If a sandbox raises an error to interrupt a script, a to-be-closed function still can hijack control and continue running arbitrary sandboxed code. * Functions interact badly with coroutines. If a coroutine yields and is never resumed again, its to-be-closed functions will never run. To-be-closed objects, on the other hand, will still be closed, provided they have appropriate finalizers. * If you really need a function, it is easy to create a dummy object to run that function in its '__toclose' metamethod. This comit also adds closing of variables in case of panic.
This commit is contained in:
@@ -396,6 +396,23 @@ do
|
||||
assert(string.find(msg, "stack overflow"))
|
||||
end
|
||||
|
||||
-- exit in panic still close to-be-closed variables
|
||||
assert(T.checkpanic([[
|
||||
pushstring "return {__close = function () Y = 'ho'; end}"
|
||||
newtable
|
||||
loadstring -2
|
||||
call 0 1
|
||||
setmetatable -2
|
||||
toclose -1
|
||||
pushstring "hi"
|
||||
error
|
||||
]],
|
||||
[[
|
||||
getglobal Y
|
||||
concat 2 # concat original error with global Y
|
||||
]]) == "hiho")
|
||||
|
||||
|
||||
end
|
||||
|
||||
-- testing deep C stack
|
||||
@@ -1115,7 +1132,7 @@ end)
|
||||
testamem("to-be-closed variables", function()
|
||||
local flag
|
||||
do
|
||||
local *toclose x = function () flag = true end
|
||||
local *toclose x = setmetatable({}, {__close = function () flag = true end})
|
||||
flag = false
|
||||
local x = {}
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user