To-be-closed variables in the C API

This commit is contained in:
Roberto Ierusalimschy
2018-10-25 15:30:15 -03:00
parent 41c800b352
commit 34840301b5
6 changed files with 122 additions and 16 deletions

View File

@@ -967,6 +967,77 @@ T.closestate(L1)
L1 = nil
print('+')
-------------------------------------------------------------------------
-- testing to-be-closed variables
-------------------------------------------------------------------------
print"testing to-be-closed variables"
do
local openresource = {}
local function newresource ()
local x = setmetatable({10}, {__close = function(y)
assert(openresource[#openresource] == y)
openresource[#openresource] = nil
y[1] = y[1] + 1
end})
openresource[#openresource + 1] = x
return x
end
local a = T.testC([[
call 0 1 # create resource
tobeclosed # mark it to be closed
return 1
]], newresource)
assert(a[1] == 11)
assert(#openresource == 0) -- was closed
-- repeat the test, but calling function in a 'multret' context
local a = {T.testC([[
call 0 1 # create resource
tobeclosed # mark it to be closed
return 2
]], newresource)}
assert(type(a[1]) == "string" and a[2][1] == 11)
assert(#openresource == 0) -- was closed
-- error
local a, b = pcall(T.testC, [[
call 0 1 # create resource
tobeclosed # mark it to be closed
error # resource is the error object
]], newresource)
assert(a == false and b[1] == 11)
assert(#openresource == 0) -- was closed
local function check (n)
assert(#openresource == n)
end
-- closing resources with 'settop'
local a = T.testC([[
pushvalue 2
call 0 1 # create resource
tobeclosed # mark it to be closed
pushvalue 2
call 0 1 # create another resource
tobeclosed # mark it to be closed
pushvalue 3
pushint 2 # there should be two open resources
call 1 0
pop 1 # pop second resource from the stack
pushvalue 3
pushint 1 # there should be one open resource
call 1 0
pop 1 # pop second resource from the stack
pushint *
return 1 # return stack size
]], newresource, check)
assert(a == 3) -- no extra items left in the stack
end
-------------------------------------------------------------------------
-- testing memory limits