aboutsummaryrefslogtreecommitdiff
path: root/testes
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2020-10-07 10:42:00 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2020-10-12 12:29:09 -0300
commit171dcd7d745566e69c61845599705707500a104e (patch)
tree129d0c97107e75e2308ab93d4100cc089ec2a5c4 /testes
parent5aa36e894f5a0348dfd19bd9cdcdd27ce8aa5f05 (diff)
downloadlua-171dcd7d745566e69c61845599705707500a104e.tar.gz
lua-171dcd7d745566e69c61845599705707500a104e.tar.bz2
lua-171dcd7d745566e69c61845599705707500a104e.zip
'recover' finish of 'luaD_pcall' should follow the original
Diffstat (limited to 'testes')
-rw-r--r--testes/coroutine.lua26
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
128local function func2close (f)
129 return setmetatable({}, {__close = f})
130end
131
127do 132do
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
193end 194end
194 195
196do
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")
211end
212
195 213
196-- yielding across C boundaries 214-- yielding across C boundaries
197 215