diff options
Diffstat (limited to 'testes')
| -rw-r--r-- | testes/coroutine.lua | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/testes/coroutine.lua b/testes/coroutine.lua index 955f6776..5b927151 100644 --- a/testes/coroutine.lua +++ b/testes/coroutine.lua | |||
| @@ -124,6 +124,11 @@ x, a = nil | |||
| 124 | 124 | ||
| 125 | 125 | ||
| 126 | -- coroutine closing | 126 | -- coroutine closing |
| 127 | |||
| 128 | local function func2close (f) | ||
| 129 | return setmetatable({}, {__close = f}) | ||
| 130 | end | ||
| 131 | |||
| 127 | do | 132 | do |
| 128 | -- ok to close a dead coroutine | 133 | -- ok to close a dead coroutine |
| 129 | local co = coroutine.create(print) | 134 | local co = coroutine.create(print) |
| @@ -146,10 +151,6 @@ do | |||
| 146 | -- to-be-closed variables in coroutines | 151 | -- to-be-closed variables in coroutines |
| 147 | local X | 152 | local X |
| 148 | 153 | ||
| 149 | local function func2close (f) | ||
| 150 | return setmetatable({}, {__close = f}) | ||
| 151 | end | ||
| 152 | |||
| 153 | co = coroutine.create(function () | 154 | co = coroutine.create(function () |
| 154 | local x <close> = func2close(function (self, err) | 155 | local x <close> = func2close(function (self, err) |
| 155 | assert(err == nil); X = false | 156 | assert(err == nil); X = false |
| @@ -192,6 +193,23 @@ do | |||
| 192 | 193 | ||
| 193 | end | 194 | end |
| 194 | 195 | ||
| 196 | do | ||
| 197 | -- <close> versus pcall in coroutines | ||
| 198 | local X = false | ||
| 199 | local Y = false | ||
| 200 | function foo () | ||
| 201 | local x <close> = func2close(function (self, err) | ||
| 202 | Y = debug.getinfo(2) | ||
| 203 | X = err | ||
| 204 | end) | ||
| 205 | error(43) | ||
| 206 | end | ||
| 207 | co = coroutine.create(function () return pcall(foo) end) | ||
| 208 | local st1, st2, err = coroutine.resume(co) | ||
| 209 | assert(st1 and not st2 and err == 43) | ||
| 210 | assert(X == 43 and Y.name == "pcall") | ||
| 211 | end | ||
| 212 | |||
| 195 | 213 | ||
| 196 | -- yielding across C boundaries | 214 | -- yielding across C boundaries |
| 197 | 215 | ||
