diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-11-15 15:25:11 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-11-15 15:25:11 -0300 |
| commit | f12ce4029dfbce7b89ec136e6b7ba5f6bca039da (patch) | |
| tree | 6f395f013dcd0841efe00ebbf73c18d855c9fd28 /ldo.c | |
| parent | a4762b6ffe74f5878882ef238d37bfa92d90e418 (diff) | |
| download | lua-f12ce4029dfbce7b89ec136e6b7ba5f6bca039da.tar.gz lua-f12ce4029dfbce7b89ec136e6b7ba5f6bca039da.tar.bz2 lua-f12ce4029dfbce7b89ec136e6b7ba5f6bca039da.zip | |
More integration of 'nresults' into 'callstatus'
Diffstat (limited to 'ldo.c')
| -rw-r--r-- | ldo.c | 25 |
1 files changed, 13 insertions, 12 deletions
| @@ -564,12 +564,12 @@ void luaD_poscall (lua_State *L, CallInfo *ci, int nres) { | |||
| 564 | #define next_ci(L) (L->ci->next ? L->ci->next : luaE_extendCI(L)) | 564 | #define next_ci(L) (L->ci->next ? L->ci->next : luaE_extendCI(L)) |
| 565 | 565 | ||
| 566 | 566 | ||
| 567 | l_sinline CallInfo *prepCallInfo (lua_State *L, StkId func, int nresults, | 567 | l_sinline CallInfo *prepCallInfo (lua_State *L, StkId func, unsigned status, |
| 568 | l_uint32 mask, StkId top) { | 568 | StkId top) { |
| 569 | CallInfo *ci = L->ci = next_ci(L); /* new frame */ | 569 | CallInfo *ci = L->ci = next_ci(L); /* new frame */ |
| 570 | ci->func.p = func; | 570 | ci->func.p = func; |
| 571 | lua_assert(((nresults + 1) & ~CIST_NRESULTS) == 0); | 571 | lua_assert((status & ~(CIST_NRESULTS | CIST_C)) == 0); |
| 572 | ci->callstatus = mask | cast(l_uint32, nresults + 1); | 572 | ci->callstatus = status; |
| 573 | ci->top.p = top; | 573 | ci->top.p = top; |
| 574 | return ci; | 574 | return ci; |
| 575 | } | 575 | } |
| @@ -578,12 +578,12 @@ l_sinline CallInfo *prepCallInfo (lua_State *L, StkId func, int nresults, | |||
| 578 | /* | 578 | /* |
| 579 | ** precall for C functions | 579 | ** precall for C functions |
| 580 | */ | 580 | */ |
| 581 | l_sinline int precallC (lua_State *L, StkId func, int nresults, | 581 | l_sinline int precallC (lua_State *L, StkId func, unsigned status, |
| 582 | lua_CFunction f) { | 582 | lua_CFunction f) { |
| 583 | int n; /* number of returns */ | 583 | int n; /* number of returns */ |
| 584 | CallInfo *ci; | 584 | CallInfo *ci; |
| 585 | checkstackp(L, LUA_MINSTACK, func); /* ensure minimum stack size */ | 585 | checkstackp(L, LUA_MINSTACK, func); /* ensure minimum stack size */ |
| 586 | L->ci = ci = prepCallInfo(L, func, nresults, CIST_C, | 586 | L->ci = ci = prepCallInfo(L, func, status | CIST_C, |
| 587 | L->top.p + LUA_MINSTACK); | 587 | L->top.p + LUA_MINSTACK); |
| 588 | lua_assert(ci->top.p <= L->stack_last.p); | 588 | lua_assert(ci->top.p <= L->stack_last.p); |
| 589 | if (l_unlikely(L->hookmask & LUA_MASKCALL)) { | 589 | if (l_unlikely(L->hookmask & LUA_MASKCALL)) { |
| @@ -610,9 +610,9 @@ int luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func, | |||
| 610 | retry: | 610 | retry: |
| 611 | switch (ttypetag(s2v(func))) { | 611 | switch (ttypetag(s2v(func))) { |
| 612 | case LUA_VCCL: /* C closure */ | 612 | case LUA_VCCL: /* C closure */ |
| 613 | return precallC(L, func, LUA_MULTRET, clCvalue(s2v(func))->f); | 613 | return precallC(L, func, LUA_MULTRET + 1, clCvalue(s2v(func))->f); |
| 614 | case LUA_VLCF: /* light C function */ | 614 | case LUA_VLCF: /* light C function */ |
| 615 | return precallC(L, func, LUA_MULTRET, fvalue(s2v(func))); | 615 | return precallC(L, func, LUA_MULTRET + 1, fvalue(s2v(func))); |
| 616 | case LUA_VLCL: { /* Lua function */ | 616 | case LUA_VLCL: { /* Lua function */ |
| 617 | Proto *p = clLvalue(s2v(func))->p; | 617 | Proto *p = clLvalue(s2v(func))->p; |
| 618 | int fsize = p->maxstacksize; /* frame size */ | 618 | int fsize = p->maxstacksize; /* frame size */ |
| @@ -651,13 +651,15 @@ int luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func, | |||
| 651 | ** original function position. | 651 | ** original function position. |
| 652 | */ | 652 | */ |
| 653 | CallInfo *luaD_precall (lua_State *L, StkId func, int nresults) { | 653 | CallInfo *luaD_precall (lua_State *L, StkId func, int nresults) { |
| 654 | unsigned status = cast_uint(nresults + 1); | ||
| 655 | lua_assert(status <= MAXRESULTS + 1); | ||
| 654 | retry: | 656 | retry: |
| 655 | switch (ttypetag(s2v(func))) { | 657 | switch (ttypetag(s2v(func))) { |
| 656 | case LUA_VCCL: /* C closure */ | 658 | case LUA_VCCL: /* C closure */ |
| 657 | precallC(L, func, nresults, clCvalue(s2v(func))->f); | 659 | precallC(L, func, status, clCvalue(s2v(func))->f); |
| 658 | return NULL; | 660 | return NULL; |
| 659 | case LUA_VLCF: /* light C function */ | 661 | case LUA_VLCF: /* light C function */ |
| 660 | precallC(L, func, nresults, fvalue(s2v(func))); | 662 | precallC(L, func, status, fvalue(s2v(func))); |
| 661 | return NULL; | 663 | return NULL; |
| 662 | case LUA_VLCL: { /* Lua function */ | 664 | case LUA_VLCL: { /* Lua function */ |
| 663 | CallInfo *ci; | 665 | CallInfo *ci; |
| @@ -666,7 +668,7 @@ CallInfo *luaD_precall (lua_State *L, StkId func, int nresults) { | |||
| 666 | int nfixparams = p->numparams; | 668 | int nfixparams = p->numparams; |
| 667 | int fsize = p->maxstacksize; /* frame size */ | 669 | int fsize = p->maxstacksize; /* frame size */ |
| 668 | checkstackp(L, fsize, func); | 670 | checkstackp(L, fsize, func); |
| 669 | L->ci = ci = prepCallInfo(L, func, nresults, 0, func + 1 + fsize); | 671 | L->ci = ci = prepCallInfo(L, func, status, func + 1 + fsize); |
| 670 | ci->u.l.savedpc = p->code; /* starting point */ | 672 | ci->u.l.savedpc = p->code; /* starting point */ |
| 671 | for (; narg < nfixparams; narg++) | 673 | for (; narg < nfixparams; narg++) |
| 672 | setnilvalue(s2v(L->top.p++)); /* complete missing arguments */ | 674 | setnilvalue(s2v(L->top.p++)); /* complete missing arguments */ |
| @@ -675,7 +677,6 @@ CallInfo *luaD_precall (lua_State *L, StkId func, int nresults) { | |||
| 675 | } | 677 | } |
| 676 | default: { /* not a function */ | 678 | default: { /* not a function */ |
| 677 | func = tryfuncTM(L, func); /* try to get '__call' metamethod */ | 679 | func = tryfuncTM(L, func); /* try to get '__call' metamethod */ |
| 678 | /* return luaD_precall(L, func, nresults); */ | ||
| 679 | goto retry; /* try again with metamethod */ | 680 | goto retry; /* try again with metamethod */ |
| 680 | } | 681 | } |
| 681 | } | 682 | } |
