aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2015-11-02 16:48:49 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2015-11-02 16:48:49 -0200
commite61ee8a036e83667de9c4378e70a278876c81135 (patch)
tree011ae3672032c0297da48e36b97977f1bb647c9d
parentff1289a361eb2b077d0df83eaed21647444541ef (diff)
downloadlua-e61ee8a036e83667de9c4378e70a278876c81135.tar.gz
lua-e61ee8a036e83667de9c4378e70a278876c81135.tar.bz2
lua-e61ee8a036e83667de9c4378e70a278876c81135.zip
in 'luaD_call', use two functions instead of one with fixed boolean
argument + stack error handling in 'luaD_call' moved to a separated function
-rw-r--r--ldo.c39
1 files changed, 29 insertions, 10 deletions
diff --git a/ldo.c b/ldo.c
index beb77bcb..e4f09076 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 2.146 2015/11/02 14:06:01 roberto Exp roberto $ 2** $Id: ldo.c,v 2.147 2015/11/02 16:09:30 roberto Exp roberto $
3** Stack and Call structure of Lua 3** Stack and Call structure of Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -434,27 +434,46 @@ int luaD_poscall (lua_State *L, StkId firstResult, int nres) {
434 434
435 435
436/* 436/*
437** Check appropriate error for stack overflow ("regular" overflow or
438** overflow while handling stack overflow). If 'nCalls' is larger than
439** LUAI_MAXCCALLS (which means it is handling a "regular" overflow) but
440** smaller than 9/8 of LUAI_MAXCCALLS, does not report an error (to
441** allow overflow handling to work)
442*/
443static void stackerror (lua_State *L) {
444 if (L->nCcalls == LUAI_MAXCCALLS)
445 luaG_runerror(L, "C stack overflow");
446 else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3)))
447 luaD_throw(L, LUA_ERRERR); /* error while handing stack error */
448}
449
450
451/*
437** Call a function (C or Lua). The function to be called is at *func. 452** Call a function (C or Lua). The function to be called is at *func.
438** The arguments are on the stack, right after the function. 453** The arguments are on the stack, right after the function.
439** When returns, all the results are on the stack, starting at the original 454** When returns, all the results are on the stack, starting at the original
440** function position. 455** function position.
441*/ 456*/
442void luaD_call (lua_State *L, StkId func, int nResults, int allowyield) { 457void luaD_call (lua_State *L, StkId func, int nResults) {
443 if (++L->nCcalls >= LUAI_MAXCCALLS) { 458 if (++L->nCcalls >= LUAI_MAXCCALLS)
444 if (L->nCcalls == LUAI_MAXCCALLS) 459 stackerror(L);
445 luaG_runerror(L, "C stack overflow");
446 else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3)))
447 luaD_throw(L, LUA_ERRERR); /* error while handing stack error */
448 }
449 if (!allowyield) L->nny++;
450 if (!luaD_precall(L, func, nResults)) /* is a Lua function? */ 460 if (!luaD_precall(L, func, nResults)) /* is a Lua function? */
451 luaV_execute(L); /* call it */ 461 luaV_execute(L); /* call it */
452 if (!allowyield) L->nny--;
453 L->nCcalls--; 462 L->nCcalls--;
454} 463}
455 464
456 465
457/* 466/*
467** Similar to 'luaD_call', but does not allow yields during the call
468*/
469void luaD_callnoyield (lua_State *L, StkId func, int nResults) {
470 L->nny++;
471 luaD_call(L, func, nResults);
472 L->nny--;
473}
474
475
476/*
458** Completes the execution of an interrupted C function, calling its 477** Completes the execution of an interrupted C function, calling its
459** continuation function. 478** continuation function.
460*/ 479*/