diff options
| -rw-r--r-- | lcorolib.c | 4 | ||||
| -rw-r--r-- | ldo.c | 2 |
2 files changed, 2 insertions, 4 deletions
| @@ -35,10 +35,6 @@ static int auxresume (lua_State *L, lua_State *co, int narg) { | |||
| 35 | lua_pushliteral(L, "too many arguments to resume"); | 35 | lua_pushliteral(L, "too many arguments to resume"); |
| 36 | return -1; /* error flag */ | 36 | return -1; /* error flag */ |
| 37 | } | 37 | } |
| 38 | if (lua_status(co) == LUA_OK && lua_gettop(co) == 0) { | ||
| 39 | lua_pushliteral(L, "cannot resume dead coroutine"); | ||
| 40 | return -1; /* error flag */ | ||
| 41 | } | ||
| 42 | lua_xmove(L, co, narg); | 38 | lua_xmove(L, co, narg); |
| 43 | status = lua_resume(co, L, narg, &nres); | 39 | status = lua_resume(co, L, narg, &nres); |
| 44 | if (status == LUA_OK || status == LUA_YIELD) { | 40 | if (status == LUA_OK || status == LUA_YIELD) { |
| @@ -666,6 +666,8 @@ LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs, | |||
| 666 | if (L->status == LUA_OK) { /* may be starting a coroutine */ | 666 | if (L->status == LUA_OK) { /* may be starting a coroutine */ |
| 667 | if (L->ci != &L->base_ci) /* not in base level? */ | 667 | if (L->ci != &L->base_ci) /* not in base level? */ |
| 668 | return resume_error(L, "cannot resume non-suspended coroutine", nargs); | 668 | return resume_error(L, "cannot resume non-suspended coroutine", nargs); |
| 669 | else if (L->top - (L->ci->func + 1) == nargs) /* no function? */ | ||
| 670 | return resume_error(L, "cannot resume dead coroutine", nargs); | ||
| 669 | } | 671 | } |
| 670 | else if (L->status != LUA_YIELD) | 672 | else if (L->status != LUA_YIELD) |
| 671 | return resume_error(L, "cannot resume dead coroutine", nargs); | 673 | return resume_error(L, "cannot resume dead coroutine", nargs); |
