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