aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2018-02-07 13:55:18 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2018-02-07 13:55:18 -0200
commit4e0de3a43cc30a83334c272cb7575bf8412bfeae (patch)
treecfa3ca4d88a658d2d7d4ac2bc788ffb64fa7eeea
parent318a9a5859826d7af0294664e206236fc8814319 (diff)
downloadlua-4e0de3a43cc30a83334c272cb7575bf8412bfeae.tar.gz
lua-4e0de3a43cc30a83334c272cb7575bf8412bfeae.tar.bz2
lua-4e0de3a43cc30a83334c272cb7575bf8412bfeae.zip
details
-rw-r--r--ldo.c29
1 files changed, 16 insertions, 13 deletions
diff --git a/ldo.c b/ldo.c
index 89c63350..402b3703 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 2.190 2018/02/06 19:16:56 roberto Exp roberto $ 2** $Id: ldo.c,v 2.191 2018/02/07 15:18:04 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*/
@@ -398,7 +398,11 @@ void luaD_poscall (lua_State *L, CallInfo *ci, StkId firstResult, int nres) {
398 398
399 399
400 400
401#define next_ci(L) (L->ci = (L->ci->next ? L->ci->next : luaE_extendCI(L))) 401#define next_ci(L) (L->ci->next ? L->ci->next : luaE_extendCI(L))
402
403
404#define checkstackGC(L,fsize) \
405 luaD_checkstackaux(L, (fsize), (void)0, luaC_checkGC(L))
402 406
403 407
404/* 408/*
@@ -413,7 +417,7 @@ void luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func, int narg1) {
413 int i; 417 int i;
414 for (i = 0; i < narg1; i++) /* move down function and arguments */ 418 for (i = 0; i < narg1; i++) /* move down function and arguments */
415 setobjs2s(L, ci->func + i, func + i); 419 setobjs2s(L, ci->func + i, func + i);
416 luaD_checkstackaux(L, fsize, (void)0, luaC_checkGC(L)); 420 checkstackGC(L, fsize);
417 func = ci->func; /* moved-down function */ 421 func = ci->func; /* moved-down function */
418 for (; narg1 <= nfixparams; narg1++) 422 for (; narg1 <= nfixparams; narg1++)
419 setnilvalue(s2v(func + narg1)); /* complete missing arguments */ 423 setnilvalue(s2v(func + narg1)); /* complete missing arguments */
@@ -434,7 +438,8 @@ void luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func, int narg1) {
434void luaD_call (lua_State *L, StkId func, int nresults) { 438void luaD_call (lua_State *L, StkId func, int nresults) {
435 lua_CFunction f; 439 lua_CFunction f;
436 TValue *funcv = s2v(func); 440 TValue *funcv = s2v(func);
437 CallInfo *ci; 441 CallInfo *ci = next_ci(L);
442 ci->nresults = nresults;
438 switch (ttype(funcv)) { 443 switch (ttype(funcv)) {
439 case LUA_TCCL: /* C closure */ 444 case LUA_TCCL: /* C closure */
440 f = clCvalue(funcv)->f; 445 f = clCvalue(funcv)->f;
@@ -444,12 +449,11 @@ void luaD_call (lua_State *L, StkId func, int nresults) {
444 Cfunc: { 449 Cfunc: {
445 int n; /* number of returns */ 450 int n; /* number of returns */
446 checkstackp(L, LUA_MINSTACK, func); /* ensure minimum stack size */ 451 checkstackp(L, LUA_MINSTACK, func); /* ensure minimum stack size */
447 ci = next_ci(L); /* now 'enter' new function */ 452 ci->callstatus = CIST_C;
448 ci->nresults = nresults;
449 ci->func = func;
450 ci->top = L->top + LUA_MINSTACK; 453 ci->top = L->top + LUA_MINSTACK;
454 ci->func = func;
451 lua_assert(ci->top <= L->stack_last); 455 lua_assert(ci->top <= L->stack_last);
452 ci->callstatus = CIST_C; 456 L->ci = ci; /* now 'enter' new function */
453 if (L->hookmask & LUA_MASKCALL) 457 if (L->hookmask & LUA_MASKCALL)
454 luaD_hook(L, LUA_HOOKCALL, -1); 458 luaD_hook(L, LUA_HOOKCALL, -1);
455 lua_unlock(L); 459 lua_unlock(L);
@@ -464,16 +468,15 @@ void luaD_call (lua_State *L, StkId func, int nresults) {
464 int narg = cast_int(L->top - func) - 1; /* number of real arguments */ 468 int narg = cast_int(L->top - func) - 1; /* number of real arguments */
465 int nfixparams = p->numparams; 469 int nfixparams = p->numparams;
466 int fsize = p->maxstacksize; /* frame size */ 470 int fsize = p->maxstacksize; /* frame size */
471 ci->u.l.savedpc = p->code; /* starting point */
467 checkstackp(L, fsize, func); 472 checkstackp(L, fsize, func);
468 for (; narg < nfixparams; narg++) 473 for (; narg < nfixparams; narg++)
469 setnilvalue(s2v(L->top++)); /* complete missing arguments */ 474 setnilvalue(s2v(L->top++)); /* complete missing arguments */
470 ci = next_ci(L); /* now 'enter' new function */ 475 ci->callstatus = 0;
471 ci->nresults = nresults;
472 ci->func = func;
473 ci->top = func + 1 + fsize; 476 ci->top = func + 1 + fsize;
477 ci->func = func;
478 L->ci = ci; /* now 'enter' new function */
474 lua_assert(ci->top <= L->stack_last); 479 lua_assert(ci->top <= L->stack_last);
475 ci->u.l.savedpc = p->code; /* starting point */
476 ci->callstatus = 0;
477 luaV_execute(L, ci); /* run the function */ 480 luaV_execute(L, ci); /* run the function */
478 break; 481 break;
479 } 482 }