diff options
Diffstat (limited to 'ldo.c')
| -rw-r--r-- | ldo.c | 52 |
1 files changed, 26 insertions, 26 deletions
| @@ -448,10 +448,11 @@ void luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func, int narg1) { | |||
| 448 | 448 | ||
| 449 | 449 | ||
| 450 | /* | 450 | /* |
| 451 | ** Call a function (C or Lua). The function to be called is at *func. | 451 | ** Prepares the call to a function (C or Lua). For C functions, also do |
| 452 | ** The arguments are on the stack, right after the function. | 452 | ** the call. The function to be called is at '*func'. The arguments are |
| 453 | ** When returns, all the results are on the stack, starting at the original | 453 | ** on the stack, right after the function. Returns true if the call was |
| 454 | ** function position. | 454 | ** made (it was a C function). When returns true, all the results are |
| 455 | ** on the stack, starting at the original function position. | ||
| 455 | */ | 456 | */ |
| 456 | int luaD_precall (lua_State *L, StkId func, int nresults) { | 457 | int luaD_precall (lua_State *L, StkId func, int nresults) { |
| 457 | lua_CFunction f; | 458 | lua_CFunction f; |
| @@ -511,32 +512,34 @@ int luaD_precall (lua_State *L, StkId func, int nresults) { | |||
| 511 | } | 512 | } |
| 512 | 513 | ||
| 513 | 514 | ||
| 514 | static void stackerror (lua_State *L) { | 515 | /* |
| 515 | if (getCcalls(L) == LUAI_MAXCCALLS) | 516 | ** Call a function (C or Lua). 'inc' can be 1 (increment number |
| 516 | luaG_runerror(L, "C stack overflow"); | 517 | ** of recursive invocations in the C stack) or nyci (the same plus |
| 517 | else if (getCcalls(L) >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3))) | 518 | ** increment number of non-yieldable calls). |
| 518 | luaD_throw(L, LUA_ERRERR); /* error while handing stack error */ | 519 | */ |
| 519 | } | 520 | static void docall (lua_State *L, StkId func, int nResults, int inc) { |
| 520 | 521 | L->nCcalls += inc; | |
| 521 | |||
| 522 | void luaD_call (lua_State *L, StkId func, int nResults) { | ||
| 523 | L->nCcalls++; | ||
| 524 | if (getCcalls(L) >= LUAI_MAXCCALLS) | 522 | if (getCcalls(L) >= LUAI_MAXCCALLS) |
| 525 | stackerror(L); | 523 | luaE_checkcstack(L); |
| 526 | if (!luaD_precall(L, func, nResults)) /* is a Lua function? */ | 524 | if (!luaD_precall(L, func, nResults)) /* is a Lua function? */ |
| 527 | luaV_execute(L, L->ci); /* call it */ | 525 | luaV_execute(L, L->ci); /* call it */ |
| 528 | L->nCcalls--; | 526 | L->nCcalls -= inc; |
| 529 | } | 527 | } |
| 530 | 528 | ||
| 531 | 529 | ||
| 530 | /* | ||
| 531 | ** External interface for 'docall' | ||
| 532 | */ | ||
| 533 | void luaD_call (lua_State *L, StkId func, int nResults) { | ||
| 534 | return docall(L, func, nResults, 1); | ||
| 535 | } | ||
| 536 | |||
| 532 | 537 | ||
| 533 | /* | 538 | /* |
| 534 | ** Similar to 'luaD_call', but does not allow yields during the call. | 539 | ** Similar to 'luaD_call', but does not allow yields during the call. |
| 535 | */ | 540 | */ |
| 536 | void luaD_callnoyield (lua_State *L, StkId func, int nResults) { | 541 | void luaD_callnoyield (lua_State *L, StkId func, int nResults) { |
| 537 | incnny(L); | 542 | return docall(L, func, nResults, nyci); |
| 538 | luaD_call(L, func, nResults); | ||
| 539 | decnny(L); | ||
| 540 | } | 543 | } |
| 541 | 544 | ||
| 542 | 545 | ||
| @@ -650,13 +653,12 @@ static void resume (lua_State *L, void *ud) { | |||
| 650 | int n = *(cast(int*, ud)); /* number of arguments */ | 653 | int n = *(cast(int*, ud)); /* number of arguments */ |
| 651 | StkId firstArg = L->top - n; /* first argument */ | 654 | StkId firstArg = L->top - n; /* first argument */ |
| 652 | CallInfo *ci = L->ci; | 655 | CallInfo *ci = L->ci; |
| 653 | if (L->status == LUA_OK) { /* starting a coroutine? */ | 656 | if (L->status == LUA_OK) /* starting a coroutine? */ |
| 654 | if (!luaD_precall(L, firstArg - 1, LUA_MULTRET)) /* Lua function? */ | 657 | docall(L, firstArg - 1, LUA_MULTRET, 1); /* just call its body */ |
| 655 | luaV_execute(L, L->ci); /* call it */ | ||
| 656 | } | ||
| 657 | else { /* resuming from previous yield */ | 658 | else { /* resuming from previous yield */ |
| 658 | lua_assert(L->status == LUA_YIELD); | 659 | lua_assert(L->status == LUA_YIELD); |
| 659 | L->status = LUA_OK; /* mark that it is running (again) */ | 660 | L->status = LUA_OK; /* mark that it is running (again) */ |
| 661 | luaE_incCstack(L); /* control the C stack */ | ||
| 660 | if (isLua(ci)) /* yielded inside a hook? */ | 662 | if (isLua(ci)) /* yielded inside a hook? */ |
| 661 | luaV_execute(L, ci); /* just continue running Lua code */ | 663 | luaV_execute(L, ci); /* just continue running Lua code */ |
| 662 | else { /* 'common' yield */ | 664 | else { /* 'common' yield */ |
| @@ -684,9 +686,7 @@ LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs, | |||
| 684 | } | 686 | } |
| 685 | else if (L->status != LUA_YIELD) /* ended with errors? */ | 687 | else if (L->status != LUA_YIELD) /* ended with errors? */ |
| 686 | return resume_error(L, "cannot resume dead coroutine", nargs); | 688 | return resume_error(L, "cannot resume dead coroutine", nargs); |
| 687 | L->nCcalls = (from) ? getCcalls(from) + 1 : 1; | 689 | L->nCcalls = (from) ? getCcalls(from) : 0; |
| 688 | if (getCcalls(L) >= LUAI_MAXCCALLS) | ||
| 689 | return resume_error(L, "C stack overflow", nargs); | ||
| 690 | luai_userstateresume(L, nargs); | 690 | luai_userstateresume(L, nargs); |
| 691 | api_checknelems(L, (L->status == LUA_OK) ? nargs + 1 : nargs); | 691 | api_checknelems(L, (L->status == LUA_OK) ? nargs + 1 : nargs); |
| 692 | status = luaD_rawrunprotected(L, resume, &nargs); | 692 | status = luaD_rawrunprotected(L, resume, &nargs); |
