diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-10-22 14:55:51 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-10-22 14:55:51 -0300 |
commit | c90176f96924ee7d207501b32f216925773d3bdb (patch) | |
tree | 234f3aefb0617dd7e3d1ff5faf32f9fbdf96c2d7 /testes/locals.lua | |
parent | 3c7dc52909ce0688bdb20cacaf686413a79aaf48 (diff) | |
download | lua-c90176f96924ee7d207501b32f216925773d3bdb.tar.gz lua-c90176f96924ee7d207501b32f216925773d3bdb.tar.bz2 lua-c90176f96924ee7d207501b32f216925773d3bdb.zip |
Complete implementation of to-be-closed variables
Diffstat (limited to 'testes/locals.lua')
-rw-r--r-- | testes/locals.lua | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/testes/locals.lua b/testes/locals.lua index d12c70a0..f21fa2ec 100644 --- a/testes/locals.lua +++ b/testes/locals.lua | |||
@@ -274,13 +274,38 @@ if rawget(_G, "T") then | |||
274 | end | 274 | end |
275 | 275 | ||
276 | 276 | ||
277 | -- to-be-closed variables in coroutines | ||
278 | do | ||
279 | -- an error in a coroutine closes variables | ||
280 | local x = false | ||
281 | local y = false | ||
282 | local co = coroutine.create(function () | ||
283 | local scoped xv = function () x = true end | ||
284 | do | ||
285 | local scoped yv = function () y = true end | ||
286 | coroutine.yield(100) -- yield doesn't close variable | ||
287 | end | ||
288 | coroutine.yield(200) -- yield doesn't close variable | ||
289 | error(23) -- error does | ||
290 | end) | ||
291 | |||
292 | local a, b = coroutine.resume(co) | ||
293 | assert(a and b == 100 and not x and not y) | ||
294 | a, b = coroutine.resume(co) | ||
295 | assert(a and b == 200 and not x and y) | ||
296 | a, b = coroutine.resume(co) | ||
297 | assert(not a and b == 23 and x and y) | ||
298 | end | ||
299 | |||
277 | -- a suspended coroutine should not close its variables when collected | 300 | -- a suspended coroutine should not close its variables when collected |
278 | local co = coroutine.wrap(function() | 301 | local co |
302 | co = coroutine.wrap(function() | ||
279 | local scoped x = function () os.exit(false) end -- should not run | 303 | local scoped x = function () os.exit(false) end -- should not run |
280 | coroutine.yield() | 304 | co = nil |
305 | coroutine.yield() | ||
281 | end) | 306 | end) |
282 | co() | 307 | co() -- start coroutine |
283 | co = nil | 308 | assert(co == nil) -- eventually it will be collected |
284 | 309 | ||
285 | print('OK') | 310 | print('OK') |
286 | 311 | ||