diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2017-06-27 08:35:31 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2017-06-27 08:35:31 -0300 |
commit | b42430fd3a6200eaaf4020be90c4d47f7e251b67 (patch) | |
tree | c47c23ac9d461b79554986769375019dc6dc469c /lparser.c | |
parent | 60a7492d249860d20098ac2f0b9d863606c38450 (diff) | |
download | lua-b42430fd3a6200eaaf4020be90c4d47f7e251b67.tar.gz lua-b42430fd3a6200eaaf4020be90c4d47f7e251b67.tar.bz2 lua-b42430fd3a6200eaaf4020be90c4d47f7e251b67.zip |
'lineinfo' in prototypes saved as differences instead of absolute
values, so that the array can use bytes instead of ints, reducing
its size. (A new array 'abslineinfo' is used when line differences
do not fit in a byte.)
Diffstat (limited to 'lparser.c')
-rw-r--r-- | lparser.c | 13 |
1 files changed, 9 insertions, 4 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lparser.c,v 2.158 2017/04/29 18:09:17 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 2.159 2017/05/13 12:57:20 roberto Exp roberto $ |
3 | ** Lua Parser | 3 | ** Lua Parser |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -527,22 +527,24 @@ static void codeclosure (LexState *ls, expdesc *v) { | |||
527 | 527 | ||
528 | 528 | ||
529 | static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { | 529 | static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { |
530 | Proto *f; | 530 | Proto *f = fs->f; |
531 | fs->prev = ls->fs; /* linked list of funcstates */ | 531 | fs->prev = ls->fs; /* linked list of funcstates */ |
532 | fs->ls = ls; | 532 | fs->ls = ls; |
533 | ls->fs = fs; | 533 | ls->fs = fs; |
534 | fs->pc = 0; | 534 | fs->pc = 0; |
535 | fs->previousline = f->linedefined; | ||
536 | fs->iwthabs = 0; | ||
535 | fs->lasttarget = 0; | 537 | fs->lasttarget = 0; |
536 | fs->jpc = NO_JUMP; | 538 | fs->jpc = NO_JUMP; |
537 | fs->freereg = 0; | 539 | fs->freereg = 0; |
538 | fs->nk = 0; | 540 | fs->nk = 0; |
541 | fs->nabslineinfo = 0; | ||
539 | fs->np = 0; | 542 | fs->np = 0; |
540 | fs->nups = 0; | 543 | fs->nups = 0; |
541 | fs->nlocvars = 0; | 544 | fs->nlocvars = 0; |
542 | fs->nactvar = 0; | 545 | fs->nactvar = 0; |
543 | fs->firstlocal = ls->dyd->actvar.n; | 546 | fs->firstlocal = ls->dyd->actvar.n; |
544 | fs->bl = NULL; | 547 | fs->bl = NULL; |
545 | f = fs->f; | ||
546 | f->source = ls->source; | 548 | f->source = ls->source; |
547 | f->maxstacksize = 2; /* registers 0/1 are always valid */ | 549 | f->maxstacksize = 2; /* registers 0/1 are always valid */ |
548 | enterblock(fs, bl, 0); | 550 | enterblock(fs, bl, 0); |
@@ -557,8 +559,11 @@ static void close_func (LexState *ls) { | |||
557 | leaveblock(fs); | 559 | leaveblock(fs); |
558 | luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction); | 560 | luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction); |
559 | f->sizecode = fs->pc; | 561 | f->sizecode = fs->pc; |
560 | luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int); | 562 | luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, ls_byte); |
561 | f->sizelineinfo = fs->pc; | 563 | f->sizelineinfo = fs->pc; |
564 | luaM_reallocvector(L, f->abslineinfo, f->sizeabslineinfo, | ||
565 | fs->nabslineinfo, AbsLineInfo); | ||
566 | f->sizeabslineinfo = fs->nabslineinfo; | ||
562 | luaM_reallocvector(L, f->k, f->sizek, fs->nk, TValue); | 567 | luaM_reallocvector(L, f->k, f->sizek, fs->nk, TValue); |
563 | f->sizek = fs->nk; | 568 | f->sizek = fs->nk; |
564 | luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *); | 569 | luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *); |