diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2023-08-30 10:44:28 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2023-08-30 10:44:28 -0300 |
| commit | 96f77142374da8a4a7d4e5e8afd559fbaf0430e8 (patch) | |
| tree | 5514ffbf943c95bd5eed14b096a370fefe6586e6 | |
| parent | 05545816057cfdc54bb58199388a2d8878ae5542 (diff) | |
| download | lua-96f77142374da8a4a7d4e5e8afd559fbaf0430e8.tar.gz lua-96f77142374da8a4a7d4e5e8afd559fbaf0430e8.tar.bz2 lua-96f77142374da8a4a7d4e5e8afd559fbaf0430e8.zip | |
Field 'Proto.is_vararg' uses only one bit
So that the other bits can be used for other purposes.
| -rw-r--r-- | lcode.c | 4 | ||||
| -rw-r--r-- | ldebug.c | 8 | ||||
| -rw-r--r-- | ldo.c | 2 | ||||
| -rw-r--r-- | ldump.c | 2 | ||||
| -rw-r--r-- | lfunc.c | 2 | ||||
| -rw-r--r-- | lobject.h | 9 | ||||
| -rw-r--r-- | lparser.c | 4 | ||||
| -rw-r--r-- | lundump.c | 2 |
8 files changed, 20 insertions, 13 deletions
| @@ -1849,7 +1849,7 @@ void luaK_finish (FuncState *fs) { | |||
| 1849 | lua_assert(i == 0 || isOT(*(pc - 1)) == isIT(*pc)); | 1849 | lua_assert(i == 0 || isOT(*(pc - 1)) == isIT(*pc)); |
| 1850 | switch (GET_OPCODE(*pc)) { | 1850 | switch (GET_OPCODE(*pc)) { |
| 1851 | case OP_RETURN0: case OP_RETURN1: { | 1851 | case OP_RETURN0: case OP_RETURN1: { |
| 1852 | if (!(fs->needclose || p->is_vararg)) | 1852 | if (!(fs->needclose || (p->flag & PF_ISVARARG))) |
| 1853 | break; /* no extra work */ | 1853 | break; /* no extra work */ |
| 1854 | /* else use OP_RETURN to do the extra work */ | 1854 | /* else use OP_RETURN to do the extra work */ |
| 1855 | SET_OPCODE(*pc, OP_RETURN); | 1855 | SET_OPCODE(*pc, OP_RETURN); |
| @@ -1857,7 +1857,7 @@ void luaK_finish (FuncState *fs) { | |||
| 1857 | case OP_RETURN: case OP_TAILCALL: { | 1857 | case OP_RETURN: case OP_TAILCALL: { |
| 1858 | if (fs->needclose) | 1858 | if (fs->needclose) |
| 1859 | SETARG_k(*pc, 1); /* signal that it needs to close */ | 1859 | SETARG_k(*pc, 1); /* signal that it needs to close */ |
| 1860 | if (p->is_vararg) | 1860 | if (p->flag & PF_ISVARARG) |
| 1861 | SETARG_C(*pc, p->numparams + 1); /* signal that it is vararg */ | 1861 | SETARG_C(*pc, p->numparams + 1); /* signal that it is vararg */ |
| 1862 | break; | 1862 | break; |
| 1863 | } | 1863 | } |
| @@ -182,7 +182,7 @@ static const char *upvalname (const Proto *p, int uv) { | |||
| 182 | 182 | ||
| 183 | 183 | ||
| 184 | static const char *findvararg (CallInfo *ci, int n, StkId *pos) { | 184 | static const char *findvararg (CallInfo *ci, int n, StkId *pos) { |
| 185 | if (clLvalue(s2v(ci->func.p))->p->is_vararg) { | 185 | if (clLvalue(s2v(ci->func.p))->p->flag & PF_ISVARARG) { |
| 186 | int nextra = ci->u.l.nextraargs; | 186 | int nextra = ci->u.l.nextraargs; |
| 187 | if (n >= -nextra) { /* 'n' is negative */ | 187 | if (n >= -nextra) { /* 'n' is negative */ |
| 188 | *pos = ci->func.p - nextra - (n + 1); | 188 | *pos = ci->func.p - nextra - (n + 1); |
| @@ -301,7 +301,7 @@ static void collectvalidlines (lua_State *L, Closure *f) { | |||
| 301 | sethvalue2s(L, L->top.p, t); /* push it on stack */ | 301 | sethvalue2s(L, L->top.p, t); /* push it on stack */ |
| 302 | api_incr_top(L); | 302 | api_incr_top(L); |
| 303 | setbtvalue(&v); /* boolean 'true' to be the value of all indices */ | 303 | setbtvalue(&v); /* boolean 'true' to be the value of all indices */ |
| 304 | if (!p->is_vararg) /* regular function? */ | 304 | if (!(p->flag & PF_ISVARARG)) /* regular function? */ |
| 305 | i = 0; /* consider all instructions */ | 305 | i = 0; /* consider all instructions */ |
| 306 | else { /* vararg function */ | 306 | else { /* vararg function */ |
| 307 | lua_assert(GET_OPCODE(p->code[0]) == OP_VARARGPREP); | 307 | lua_assert(GET_OPCODE(p->code[0]) == OP_VARARGPREP); |
| @@ -344,7 +344,7 @@ static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, | |||
| 344 | ar->nparams = 0; | 344 | ar->nparams = 0; |
| 345 | } | 345 | } |
| 346 | else { | 346 | else { |
| 347 | ar->isvararg = f->l.p->is_vararg; | 347 | ar->isvararg = f->l.p->flag & PF_ISVARARG; |
| 348 | ar->nparams = f->l.p->numparams; | 348 | ar->nparams = f->l.p->numparams; |
| 349 | } | 349 | } |
| 350 | break; | 350 | break; |
| @@ -878,7 +878,7 @@ int luaG_tracecall (lua_State *L) { | |||
| 878 | Proto *p = ci_func(ci)->p; | 878 | Proto *p = ci_func(ci)->p; |
| 879 | ci->u.l.trap = 1; /* ensure hooks will be checked */ | 879 | ci->u.l.trap = 1; /* ensure hooks will be checked */ |
| 880 | if (ci->u.l.savedpc == p->code) { /* first instruction (not resuming)? */ | 880 | if (ci->u.l.savedpc == p->code) { /* first instruction (not resuming)? */ |
| 881 | if (p->is_vararg) | 881 | if (p->flag & PF_ISVARARG) |
| 882 | return 0; /* hooks will start at VARARGPREP instruction */ | 882 | return 0; /* hooks will start at VARARGPREP instruction */ |
| 883 | else if (!(ci->callstatus & CIST_HOOKYIELD)) /* not yieded? */ | 883 | else if (!(ci->callstatus & CIST_HOOKYIELD)) /* not yieded? */ |
| 884 | luaD_hookcall(L, ci); /* check 'call' hook */ | 884 | luaD_hookcall(L, ci); /* check 'call' hook */ |
| @@ -391,7 +391,7 @@ static void rethook (lua_State *L, CallInfo *ci, int nres) { | |||
| 391 | int ftransfer; | 391 | int ftransfer; |
| 392 | if (isLua(ci)) { | 392 | if (isLua(ci)) { |
| 393 | Proto *p = ci_func(ci)->p; | 393 | Proto *p = ci_func(ci)->p; |
| 394 | if (p->is_vararg) | 394 | if (p->flag & PF_ISVARARG) |
| 395 | delta = ci->u.l.nextraargs + p->numparams + 1; | 395 | delta = ci->u.l.nextraargs + p->numparams + 1; |
| 396 | } | 396 | } |
| 397 | ci->func.p += delta; /* if vararg, back to virtual 'func' */ | 397 | ci->func.p += delta; /* if vararg, back to virtual 'func' */ |
| @@ -224,7 +224,7 @@ static void dumpFunction (DumpState *D, const Proto *f) { | |||
| 224 | dumpInt(D, f->linedefined); | 224 | dumpInt(D, f->linedefined); |
| 225 | dumpInt(D, f->lastlinedefined); | 225 | dumpInt(D, f->lastlinedefined); |
| 226 | dumpByte(D, f->numparams); | 226 | dumpByte(D, f->numparams); |
| 227 | dumpByte(D, f->is_vararg); | 227 | dumpByte(D, f->flag); |
| 228 | dumpByte(D, f->maxstacksize); | 228 | dumpByte(D, f->maxstacksize); |
| 229 | dumpCode(D, f); | 229 | dumpCode(D, f); |
| 230 | dumpConstants(D, f); | 230 | dumpConstants(D, f); |
| @@ -253,7 +253,7 @@ Proto *luaF_newproto (lua_State *L) { | |||
| 253 | f->upvalues = NULL; | 253 | f->upvalues = NULL; |
| 254 | f->sizeupvalues = 0; | 254 | f->sizeupvalues = 0; |
| 255 | f->numparams = 0; | 255 | f->numparams = 0; |
| 256 | f->is_vararg = 0; | 256 | f->flag = 0; |
| 257 | f->maxstacksize = 0; | 257 | f->maxstacksize = 0; |
| 258 | f->locvars = NULL; | 258 | f->locvars = NULL; |
| 259 | f->sizelocvars = 0; | 259 | f->sizelocvars = 0; |
| @@ -544,13 +544,20 @@ typedef struct AbsLineInfo { | |||
| 544 | int line; | 544 | int line; |
| 545 | } AbsLineInfo; | 545 | } AbsLineInfo; |
| 546 | 546 | ||
| 547 | |||
| 548 | /* | ||
| 549 | ** Flags in Prototypes | ||
| 550 | */ | ||
| 551 | #define PF_ISVARARG 1 | ||
| 552 | |||
| 553 | |||
| 547 | /* | 554 | /* |
| 548 | ** Function Prototypes | 555 | ** Function Prototypes |
| 549 | */ | 556 | */ |
| 550 | typedef struct Proto { | 557 | typedef struct Proto { |
| 551 | CommonHeader; | 558 | CommonHeader; |
| 552 | lu_byte numparams; /* number of fixed (named) parameters */ | 559 | lu_byte numparams; /* number of fixed (named) parameters */ |
| 553 | lu_byte is_vararg; | 560 | lu_byte flag; |
| 554 | lu_byte maxstacksize; /* number of registers needed by this function */ | 561 | lu_byte maxstacksize; /* number of registers needed by this function */ |
| 555 | int sizeupvalues; /* size of 'upvalues' */ | 562 | int sizeupvalues; /* size of 'upvalues' */ |
| 556 | int sizek; /* size of 'k' */ | 563 | int sizek; /* size of 'k' */ |
| @@ -959,7 +959,7 @@ static void constructor (LexState *ls, expdesc *t) { | |||
| 959 | 959 | ||
| 960 | 960 | ||
| 961 | static void setvararg (FuncState *fs, int nparams) { | 961 | static void setvararg (FuncState *fs, int nparams) { |
| 962 | fs->f->is_vararg = 1; | 962 | fs->f->flag |= PF_ISVARARG; |
| 963 | luaK_codeABC(fs, OP_VARARGPREP, nparams, 0, 0); | 963 | luaK_codeABC(fs, OP_VARARGPREP, nparams, 0, 0); |
| 964 | } | 964 | } |
| 965 | 965 | ||
| @@ -1177,7 +1177,7 @@ static void simpleexp (LexState *ls, expdesc *v) { | |||
| 1177 | } | 1177 | } |
| 1178 | case TK_DOTS: { /* vararg */ | 1178 | case TK_DOTS: { /* vararg */ |
| 1179 | FuncState *fs = ls->fs; | 1179 | FuncState *fs = ls->fs; |
| 1180 | check_condition(ls, fs->f->is_vararg, | 1180 | check_condition(ls, fs->f->flag & PF_ISVARARG, |
| 1181 | "cannot use '...' outside a vararg function"); | 1181 | "cannot use '...' outside a vararg function"); |
| 1182 | init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 0, 1)); | 1182 | init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 0, 1)); |
| 1183 | break; | 1183 | break; |
| @@ -287,7 +287,7 @@ static void loadFunction (LoadState *S, Proto *f) { | |||
| 287 | f->linedefined = loadInt(S); | 287 | f->linedefined = loadInt(S); |
| 288 | f->lastlinedefined = loadInt(S); | 288 | f->lastlinedefined = loadInt(S); |
| 289 | f->numparams = loadByte(S); | 289 | f->numparams = loadByte(S); |
| 290 | f->is_vararg = loadByte(S); | 290 | f->flag = loadByte(S) & PF_ISVARARG; /* keep only the meaningful flags */ |
| 291 | f->maxstacksize = loadByte(S); | 291 | f->maxstacksize = loadByte(S); |
| 292 | loadCode(S, f); | 292 | loadCode(S, f); |
| 293 | loadConstants(S, f); | 293 | loadConstants(S, f); |
