aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2021-06-30 12:53:21 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2021-06-30 12:53:21 -0300
commitdbdc74dc5502c2e05e1c1e2ac894943f418c8431 (patch)
treee5f97ad48e953a4c435f6cff0b234b87e5449697
parent6a0dace25a4b5b77f0fa6911de2ba26ef0fdff2c (diff)
downloadlua-dbdc74dc5502c2e05e1c1e2ac894943f418c8431.tar.gz
lua-dbdc74dc5502c2e05e1c1e2ac894943f418c8431.tar.bz2
lua-dbdc74dc5502c2e05e1c1e2ac894943f418c8431.zip
Simplification in the parameters of 'luaD_precall'
The parameters 'nresults' and 'delta1', in 'luaD_precall', were never meaningful simultaneously. So, they were combined in a single parameter 'retdel'.
-rw-r--r--ldo.c19
-rw-r--r--ldo.h15
-rw-r--r--lvm.c4
3 files changed, 24 insertions, 14 deletions
diff --git a/ldo.c b/ldo.c
index 38540561..93fcbb1a 100644
--- a/ldo.c
+++ b/ldo.c
@@ -486,20 +486,19 @@ static void moveparams (lua_State *L, StkId prevf, StkId func) {
486} 486}
487 487
488 488
489static CallInfo *prepCallInfo (lua_State *L, StkId func, int nresults, 489static CallInfo *prepCallInfo (lua_State *L, StkId func, int retdel,
490 int delta1, int mask) { 490 int mask) {
491 CallInfo *ci; 491 CallInfo *ci;
492 if (delta1) { /* tail call? */ 492 if (isdelta(retdel)) { /* tail call? */
493 ci = L->ci; /* reuse stack frame */ 493 ci = L->ci; /* reuse stack frame */
494 ci->func -= delta1 - 1; /* correct 'func' */ 494 ci->func -= retdel2delta(retdel); /* correct 'func' */
495
496 ci->callstatus |= mask | CIST_TAIL; 495 ci->callstatus |= mask | CIST_TAIL;
497 moveparams(L, ci->func, func); 496 moveparams(L, ci->func, func);
498 } 497 }
499 else { /* regular call */ 498 else { /* regular call */
500 ci = L->ci = next_ci(L); /* new frame */ 499 ci = L->ci = next_ci(L); /* new frame */
501 ci->func = func; 500 ci->func = func;
502 ci->nresults = nresults; 501 ci->nresults = retdel;
503 ci->callstatus = mask; 502 ci->callstatus = mask;
504 } 503 }
505 return ci; 504 return ci;
@@ -518,7 +517,7 @@ static CallInfo *prepCallInfo (lua_State *L, StkId func, int nresults,
518** cannot be zero. Like 'moveparams', this correction can only be done 517** cannot be zero. Like 'moveparams', this correction can only be done
519** when no more errors can occur in the call. 518** when no more errors can occur in the call.
520*/ 519*/
521CallInfo *luaD_precall (lua_State *L, StkId func, int nresults, int delta1) { 520CallInfo *luaD_precall (lua_State *L, StkId func, int retdel) {
522 lua_CFunction f; 521 lua_CFunction f;
523 retry: 522 retry:
524 switch (ttypetag(s2v(func))) { 523 switch (ttypetag(s2v(func))) {
@@ -531,7 +530,7 @@ CallInfo *luaD_precall (lua_State *L, StkId func, int nresults, int delta1) {
531 int n; /* number of returns */ 530 int n; /* number of returns */
532 CallInfo *ci; 531 CallInfo *ci;
533 checkstackGCp(L, LUA_MINSTACK, func); /* ensure minimum stack size */ 532 checkstackGCp(L, LUA_MINSTACK, func); /* ensure minimum stack size */
534 ci = prepCallInfo(L, func, nresults, delta1, CIST_C); 533 ci = prepCallInfo(L, func, retdel, CIST_C);
535 ci->top = L->top + LUA_MINSTACK; 534 ci->top = L->top + LUA_MINSTACK;
536 lua_assert(ci->top <= L->stack_last); 535 lua_assert(ci->top <= L->stack_last);
537 if (l_unlikely(L->hookmask & LUA_MASKCALL)) { 536 if (l_unlikely(L->hookmask & LUA_MASKCALL)) {
@@ -552,7 +551,7 @@ CallInfo *luaD_precall (lua_State *L, StkId func, int nresults, int delta1) {
552 int nfixparams = p->numparams; 551 int nfixparams = p->numparams;
553 int fsize = p->maxstacksize; /* frame size */ 552 int fsize = p->maxstacksize; /* frame size */
554 checkstackGCp(L, fsize, func); 553 checkstackGCp(L, fsize, func);
555 ci = prepCallInfo(L, func, nresults, delta1, 0); 554 ci = prepCallInfo(L, func, retdel, 0);
556 ci->u.l.savedpc = p->code; /* starting point */ 555 ci->u.l.savedpc = p->code; /* starting point */
557 ci->top = func + 1 + fsize; 556 ci->top = func + 1 + fsize;
558 for (; narg < nfixparams; narg++) 557 for (; narg < nfixparams; narg++)
@@ -579,7 +578,7 @@ static void ccall (lua_State *L, StkId func, int nResults, int inc) {
579 L->nCcalls += inc; 578 L->nCcalls += inc;
580 if (l_unlikely(getCcalls(L) >= LUAI_MAXCCALLS)) 579 if (l_unlikely(getCcalls(L) >= LUAI_MAXCCALLS))
581 luaE_checkcstack(L); 580 luaE_checkcstack(L);
582 if ((ci = luaD_precall(L, func, nResults, 0)) != NULL) { /* Lua function? */ 581 if ((ci = luaD_precall(L, func, nResults)) != NULL) { /* Lua function? */
583 ci->callstatus = CIST_FRESH; /* mark that it is a "fresh" execute */ 582 ci->callstatus = CIST_FRESH; /* mark that it is a "fresh" execute */
584 luaV_execute(L, ci); /* call it */ 583 luaV_execute(L, ci); /* call it */
585 } 584 }
diff --git a/ldo.h b/ldo.h
index 6edc4450..49fbb492 100644
--- a/ldo.h
+++ b/ldo.h
@@ -49,6 +49,18 @@
49 luaD_checkstackaux(L, (fsize), luaC_checkGC(L), (void)0) 49 luaD_checkstackaux(L, (fsize), luaC_checkGC(L), (void)0)
50 50
51 51
52/*
53** 'luaD_precall' is used for regular calls, when it needs the
54** number of results, and in tail calls, when it needs the 'delta'
55** (correction of base for vararg functions). The argument 'retdel'
56** codes these two options. A number of results is represented by
57** itself, while a delta is represented by 'delta2retdel(delta)'
58*/
59#define delta2retdel(d) (-(d) + LUA_MULTRET - 1)
60#define retdel2delta(d) (-(d) + LUA_MULTRET - 1)
61#define isdelta(rd) ((rd) < LUA_MULTRET)
62
63
52/* type of protected functions, to be ran by 'runprotected' */ 64/* type of protected functions, to be ran by 'runprotected' */
53typedef void (*Pfunc) (lua_State *L, void *ud); 65typedef void (*Pfunc) (lua_State *L, void *ud);
54 66
@@ -58,8 +70,7 @@ LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name,
58LUAI_FUNC void luaD_hook (lua_State *L, int event, int line, 70LUAI_FUNC void luaD_hook (lua_State *L, int event, int line,
59 int fTransfer, int nTransfer); 71 int fTransfer, int nTransfer);
60LUAI_FUNC void luaD_hookcall (lua_State *L, CallInfo *ci); 72LUAI_FUNC void luaD_hookcall (lua_State *L, CallInfo *ci);
61LUAI_FUNC CallInfo *luaD_precall (lua_State *L, StkId func, int nresults, 73LUAI_FUNC CallInfo *luaD_precall (lua_State *L, StkId func, int retdel);
62 int delta1);
63LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults); 74LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults);
64LUAI_FUNC void luaD_callnoyield (lua_State *L, StkId func, int nResults); 75LUAI_FUNC void luaD_callnoyield (lua_State *L, StkId func, int nResults);
65LUAI_FUNC void luaD_tryfuncTM (lua_State *L, StkId func); 76LUAI_FUNC void luaD_tryfuncTM (lua_State *L, StkId func);
diff --git a/lvm.c b/lvm.c
index 62ff70da..ec83f415 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1632,7 +1632,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1632 L->top = ra + b; /* top signals number of arguments */ 1632 L->top = ra + b; /* top signals number of arguments */
1633 /* else previous instruction set top */ 1633 /* else previous instruction set top */
1634 savepc(L); /* in case of errors */ 1634 savepc(L); /* in case of errors */
1635 if ((newci = luaD_precall(L, ra, nresults, 0)) == NULL) 1635 if ((newci = luaD_precall(L, ra, nresults)) == NULL)
1636 updatetrap(ci); /* C call; nothing else to be done */ 1636 updatetrap(ci); /* C call; nothing else to be done */
1637 else { /* Lua call: run function in this same C frame */ 1637 else { /* Lua call: run function in this same C frame */
1638 ci = newci; 1638 ci = newci;
@@ -1654,7 +1654,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1654 lua_assert(L->tbclist < base); /* no pending tbc variables */ 1654 lua_assert(L->tbclist < base); /* no pending tbc variables */
1655 lua_assert(base == ci->func + 1); 1655 lua_assert(base == ci->func + 1);
1656 } 1656 }
1657 if (luaD_precall(L, ra, LUA_MULTRET, delta + 1)) /* Lua function? */ 1657 if (luaD_precall(L, ra, delta2retdel(delta))) /* Lua function? */
1658 goto startfunc; /* execute the callee */ 1658 goto startfunc; /* execute the callee */
1659 else { /* C function */ 1659 else { /* C function */
1660 updatetrap(ci); 1660 updatetrap(ci);