Browse Source

Test for dead coroutine moved to 'lua_resume'

The test for dead coroutines done in the 'coro' library was moved
to 'lua_resume', in the kernel, which already does other similar
tests.
Roberto Ierusalimschy 6 years ago
parent
commit
3f253f116e
2 changed files with 2 additions and 4 deletions
  1. 0 4
      lcorolib.c
  2. 2 0
      ldo.c

+ 0 - 4
lcorolib.c

@@ -35,10 +35,6 @@ static int auxresume (lua_State *L, lua_State *co, int narg) {
     lua_pushliteral(L, "too many arguments to resume");
     return -1;  /* error flag */
   }
-  if (lua_status(co) == LUA_OK && lua_gettop(co) == 0) {
-    lua_pushliteral(L, "cannot resume dead coroutine");
-    return -1;  /* error flag */
-  }
   lua_xmove(L, co, narg);
   status = lua_resume(co, L, narg, &nres);
   if (status == LUA_OK || status == LUA_YIELD) {

+ 2 - 0
ldo.c

@@ -666,6 +666,8 @@ LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs,
   if (L->status == LUA_OK) {  /* may be starting a coroutine */
     if (L->ci != &L->base_ci)  /* not in base level? */
       return resume_error(L, "cannot resume non-suspended coroutine", nargs);
+    else if (L->top - (L->ci->func + 1) == nargs)  /* no function? */
+      return resume_error(L, "cannot resume dead coroutine", nargs);
   }
   else if (L->status != LUA_YIELD)
     return resume_error(L, "cannot resume dead coroutine", nargs);