aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-11-08 16:22:50 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-11-08 16:22:50 -0200
commit686705554686358b75a5247643007bca6f5a880c (patch)
treea320145d5c27a337df85590f84e3e7270449ae6c
parent2fb7d94bd606715d0163cab7b4546f8a4d1f3426 (diff)
downloadlua-686705554686358b75a5247643007bca6f5a880c.tar.gz
lua-686705554686358b75a5247643007bca6f5a880c.tar.bz2
lua-686705554686358b75a5247643007bca6f5a880c.zip
bug: Resuming the running coroutine makes it unyieldable
-rw-r--r--ldo.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/ldo.c b/ldo.c
index d02e1132..7ab9312f 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 2.108.1.1 2013/04/12 18:48:47 roberto Exp roberto $ 2** $Id: ldo.c,v 2.108.1.2 2013/04/19 21:03:23 roberto Exp roberto $
3** Stack and Call structure of Lua 3** Stack and Call structure of Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -534,6 +534,7 @@ static void resume (lua_State *L, void *ud) {
534 534
535LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs) { 535LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs) {
536 int status; 536 int status;
537 int oldnny = L->nny; /* save 'nny' */
537 lua_lock(L); 538 lua_lock(L);
538 luai_userstateresume(L, nargs); 539 luai_userstateresume(L, nargs);
539 L->nCcalls = (from) ? from->nCcalls + 1 : 1; 540 L->nCcalls = (from) ? from->nCcalls + 1 : 1;
@@ -555,7 +556,7 @@ LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs) {
555 } 556 }
556 lua_assert(status == L->status); 557 lua_assert(status == L->status);
557 } 558 }
558 L->nny = 1; /* do not allow yields */ 559 L->nny = oldnny; /* restore 'nny' */
559 L->nCcalls--; 560 L->nCcalls--;
560 lua_assert(L->nCcalls == ((from) ? from->nCcalls : 0)); 561 lua_assert(L->nCcalls == ((from) ? from->nCcalls : 0));
561 lua_unlock(L); 562 lua_unlock(L);