Explorar o código

correct error message when yielding from outside a coroutine

Roberto Ierusalimschy %!s(int64=15) %!d(string=hai) anos
pai
achega
0c7de97d47
Modificáronse 1 ficheiros con 7 adicións e 3 borrados
  1. 7 3
      ldo.c

+ 7 - 3
ldo.c

@@ -1,5 +1,5 @@
 /*
-** $Id: ldo.c,v 2.78 2009/12/17 12:28:57 roberto Exp roberto $
+** $Id: ldo.c,v 2.79 2009/12/22 15:32:50 roberto Exp roberto $
 ** Stack and Call structure of Lua
 ** See Copyright Notice in lua.h
 */
@@ -554,8 +554,12 @@ LUA_API int lua_yieldk (lua_State *L, int nresults, int ctx, lua_CFunction k) {
   luai_userstateyield(L, nresults);
   lua_lock(L);
   api_checknelems(L, nresults);
-  if (L->nny > 0)
-    luaG_runerror(L, "attempt to yield across metamethod/C-call boundary");
+  if (L->nny > 0) {
+    if (L != G(L)->mainthread)
+      luaG_runerror(L, "attempt to yield across metamethod/C-call boundary");
+    else
+      luaG_runerror(L, "attempt to yield from outside a coroutine");
+  }
   L->status = LUA_YIELD;
   if (isLua(ci)) {  /* inside a hook? */
     api_check(L, k == NULL, "hooks cannot continue after yielding");