From a93e0144479f1eb0ac19b8c31862f4cbc2fbe1c4 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 10 Apr 2019 13:23:14 -0300 Subject: [PATCH] Added an optional parameter to 'coroutine.isyieldable' --- lcorolib.c | 3 ++- manual/manual.of | 7 ++++--- testes/coroutine.lua | 7 +++++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/lcorolib.c b/lcorolib.c index cdb5fedc..f7c9e165 100644 --- a/lcorolib.c +++ b/lcorolib.c @@ -146,7 +146,8 @@ static int luaB_costatus (lua_State *L) { static int luaB_yieldable (lua_State *L) { - lua_pushboolean(L, lua_isyieldable(L)); + lua_State *co = lua_isnone(L, 1) ? L : getco(L); + lua_pushboolean(L, lua_isyieldable(co)); return 1; } diff --git a/manual/manual.of b/manual/manual.of index 6da2e494..fea6922e 100644 --- a/manual/manual.of +++ b/manual/manual.of @@ -6307,11 +6307,12 @@ an object with type @T{"thread"}. } -@LibEntry{coroutine.isyieldable ()| +@LibEntry{coroutine.isyieldable ([co])| -Returns true when the running coroutine can yield. +Returns true when the coroutine @id{co} can yield. +The default for @id{co} is the running coroutine. -A running coroutine is yieldable if it is not the main thread and +A coroutine is yieldable if it is not the main thread and it is not inside a non-yieldable @N{C function}. } diff --git a/testes/coroutine.lua b/testes/coroutine.lua index a4321bed..35ff27fb 100644 --- a/testes/coroutine.lua +++ b/testes/coroutine.lua @@ -10,7 +10,7 @@ local f local main, ismain = coroutine.running() assert(type(main) == "thread" and ismain) assert(not coroutine.resume(main)) -assert(not coroutine.isyieldable()) +assert(not coroutine.isyieldable(main) and not coroutine.isyieldable()) assert(not pcall(coroutine.yield)) @@ -38,7 +38,7 @@ function foo (a, ...) assert(coroutine.resume(f) == false) assert(coroutine.status(f) == "running") local arg = {...} - assert(coroutine.isyieldable()) + assert(coroutine.isyieldable(x)) for i=1,#arg do _G.x = {coroutine.yield(table.unpack(arg[i]))} end @@ -46,14 +46,17 @@ function foo (a, ...) end f = coroutine.create(foo) +assert(coroutine.isyieldable(f)) assert(type(f) == "thread" and coroutine.status(f) == "suspended") assert(string.find(tostring(f), "thread")) local s,a,b,c,d s,a,b,c,d = coroutine.resume(f, {1,2,3}, {}, {1}, {'a', 'b', 'c'}) +assert(coroutine.isyieldable(f)) assert(s and a == nil and coroutine.status(f) == "suspended") s,a,b,c,d = coroutine.resume(f) eqtab(_G.x, {}) assert(s and a == 1 and b == nil) +assert(coroutine.isyieldable(f)) s,a,b,c,d = coroutine.resume(f, 1, 2, 3) eqtab(_G.x, {1, 2, 3}) assert(s and a == 'a' and b == 'b' and c == 'c' and d == nil)