Added a '__close' metamethod to file handles

This commit is contained in:
Roberto Ierusalimschy
2018-10-23 13:57:25 -03:00
parent ea1322ef54
commit 0a9aca56ca
2 changed files with 36 additions and 22 deletions

View File

@@ -743,6 +743,7 @@ static const luaL_Reg flib[] = {
{"setvbuf", f_setvbuf}, {"setvbuf", f_setvbuf},
{"write", f_write}, {"write", f_write},
{"__gc", f_gc}, {"__gc", f_gc},
{"__close", f_gc},
{"__tostring", f_tostring}, {"__tostring", f_tostring},
{NULL, NULL} {NULL, NULL}
}; };

View File

@@ -120,8 +120,22 @@ io.output(io.open(otherfile, "ab"))
assert(io.write("\n\n\t\t ", 3450, "\n")); assert(io.write("\n\n\t\t ", 3450, "\n"));
io.close() io.close()
do
-- closing file by scope
local F = nil
do
local scoped f = assert(io.open(file, "w"))
F = f
end
assert(tostring(F) == "file (closed)")
end
assert(os.remove(file))
do
-- test writing/reading numbers -- test writing/reading numbers
f = assert(io.open(file, "w")) local scoped f = assert(io.open(file, "w"))
f:write(maxint, '\n') f:write(maxint, '\n')
f:write(string.format("0X%x\n", maxint)) f:write(string.format("0X%x\n", maxint))
f:write("0xABCp-3", '\n') f:write("0xABCp-3", '\n')
@@ -138,13 +152,13 @@ assert(f:read("n") == 0)
assert(f:read("*n") == -maxint) -- test old format (with '*') assert(f:read("*n") == -maxint) -- test old format (with '*')
assert(f:read("n") == -maxint) assert(f:read("n") == -maxint)
assert(f:read("*n") == -0xABCp-3) -- test old format (with '*') assert(f:read("*n") == -0xABCp-3) -- test old format (with '*')
assert(f:close()) end
assert(os.remove(file)) assert(os.remove(file))
-- testing multiple arguments to io.read -- testing multiple arguments to io.read
do do
local f = assert(io.open(file, "w")) local scoped f = assert(io.open(file, "w"))
f:write[[ f:write[[
a line a line
another line another line
@@ -171,9 +185,8 @@ three
-- second item failing -- second item failing
l1, n1, n2, dummy = f:read("l", "n", "n", "l") l1, n1, n2, dummy = f:read("l", "n", "n", "l")
assert(l1 == "a line" and n1 == nil) assert(l1 == "a line" and n1 == nil)
assert(f:close())
assert(os.remove(file))
end end
assert(os.remove(file))