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 | ||
