Exemple #1
0
static int luaB_costatus (lua_State *L)
{
	lua_State *co = lua_tothread(L, 1);
	luaL_argcheck(L, co, 1, "coroutine expected");
	lua_pushstring(L, statnames[costatus(L, co)]);
	return 1;
}
Exemple #2
0
static int auxresume(lua_State* L, lua_State* co, int narg)
{
	int status = costatus(L, co);
	if (!lua_checkstack(co, narg))
		luaL_error(L, "too many arguments to resume");
	if (status != CO_SUS)
	{
		lua_pushfstring(L, "cannot resume %s coroutine", statnames[status]);
		return -1;	/* error flag */
	}
	lua_xmove(L, co, narg);
	lua_setlevel(L, co);
	status = lua_resume(co, narg);
	if (status == 0 || status == LUA_YIELD)
	{
		int nres = lua_gettop(co);
		if (!lua_checkstack(L, nres + 1))
			luaL_error(L, "too many results to resume");
		lua_xmove(co, L, nres);  /* move yielded values */
		return nres;
	}
	else
	{
		lua_xmove(co, L, 1);  /* move error message */
		return -1;	/* error flag */
	}
}