aboutsummaryrefslogtreecommitdiff
path: root/lparser.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-04-07 16:35:20 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-04-07 16:35:20 -0300
commit54dd5cc7fd42a8b073f64b7d16efdb1ed01e2dd5 (patch)
tree01c0e573c486173dcafc3ea0d0d45185f52aa19a /lparser.c
parent031978798cc404c2c6757c564675d43a7da129ee (diff)
downloadlua-54dd5cc7fd42a8b073f64b7d16efdb1ed01e2dd5.tar.gz
lua-54dd5cc7fd42a8b073f64b7d16efdb1ed01e2dd5.tar.bz2
lua-54dd5cc7fd42a8b073f64b7d16efdb1ed01e2dd5.zip
reorganization of lcode.c
Diffstat (limited to 'lparser.c')
-rw-r--r--lparser.c33
1 files changed, 15 insertions, 18 deletions
diff --git a/lparser.c b/lparser.c
index 85799240..f49d6135 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 1.77 2000/04/06 17:36:52 roberto Exp roberto $ 2** $Id: lparser.c,v 1.78 2000/04/07 13:13:11 roberto Exp roberto $
3** LL(1) Parser and code generator for Lua 3** LL(1) Parser and code generator for Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -91,7 +91,7 @@ static void setline (LexState *ls) {
91 FuncState *fs = ls->fs; 91 FuncState *fs = ls->fs;
92 if (ls->L->debug && ls->linenumber != fs->lastsetline) { 92 if (ls->L->debug && ls->linenumber != fs->lastsetline) {
93 checklimit(ls, ls->linenumber, MAXARG_U, "lines in a chunk"); 93 checklimit(ls, ls->linenumber, MAXARG_U, "lines in a chunk");
94 luaK_U(fs, OP_SETLINE, ls->linenumber, 0); 94 luaK_code1(fs, OP_SETLINE, ls->linenumber);
95 fs->lastsetline = ls->linenumber; 95 fs->lastsetline = ls->linenumber;
96 } 96 }
97} 97}
@@ -260,7 +260,7 @@ static void pushupvalue (LexState *ls, TString *n) {
260 luaX_syntaxerror(ls, "cannot access upvalue in main", n->str); 260 luaX_syntaxerror(ls, "cannot access upvalue in main", n->str);
261 if (aux_localname(ls->fs, n) >= 0) 261 if (aux_localname(ls->fs, n) >= 0)
262 luaX_syntaxerror(ls, "cannot access an upvalue in current scope", n->str); 262 luaX_syntaxerror(ls, "cannot access an upvalue in current scope", n->str);
263 luaK_U(fs, OP_PUSHUPVALUE, indexupvalue(ls, n), 1); 263 luaK_code1(fs, OP_PUSHUPVALUE, indexupvalue(ls, n));
264} 264}
265 265
266 266
@@ -339,8 +339,7 @@ static void func_onstack (LexState *ls, FuncState *func) {
339 luaM_growvector(ls->L, f->kproto, f->nkproto, 1, Proto *, 339 luaM_growvector(ls->L, f->kproto, f->nkproto, 1, Proto *,
340 constantEM, MAXARG_A); 340 constantEM, MAXARG_A);
341 f->kproto[f->nkproto++] = func->f; 341 f->kproto[f->nkproto++] = func->f;
342 luaK_deltastack(fs, 1); /* CLOSURE puts one extra element before popping */ 342 luaK_code2(fs, OP_CLOSURE, f->nkproto-1, func->nupvalues);
343 luaK_AB(fs, OP_CLOSURE, f->nkproto-1, func->nupvalues, -func->nupvalues);
344} 343}
345 344
346 345
@@ -373,7 +372,7 @@ static void close_func (LexState *ls) {
373 lua_State *L = ls->L; 372 lua_State *L = ls->L;
374 FuncState *fs = ls->fs; 373 FuncState *fs = ls->fs;
375 Proto *f = fs->f; 374 Proto *f = fs->f;
376 luaK_0(fs, OP_END, 0); 375 luaK_code0(fs, OP_END);
377 luaK_getlabel(fs); /* close eventual list of pending jumps */ 376 luaK_getlabel(fs); /* close eventual list of pending jumps */
378 luaM_reallocvector(L, f->code, fs->pc, Instruction); 377 luaM_reallocvector(L, f->code, fs->pc, Instruction);
379 luaM_reallocvector(L, f->kstr, f->nkstr, TString *); 378 luaM_reallocvector(L, f->kstr, f->nkstr, TString *);
@@ -469,7 +468,7 @@ static void funcargs (LexState *ls, int slf) {
469 break; 468 break;
470 } 469 }
471 fs->stacklevel = slevel; /* call will remove function and arguments */ 470 fs->stacklevel = slevel; /* call will remove function and arguments */
472 luaK_AB(fs, OP_CALL, slevel, MULT_RET, 0); 471 luaK_code2(fs, OP_CALL, slevel, MULT_RET);
473} 472}
474 473
475 474
@@ -496,7 +495,7 @@ static void var_or_func_tail (LexState *ls, expdesc *v) {
496 next(ls); 495 next(ls);
497 name = checkname(ls); 496 name = checkname(ls);
498 luaK_tostack(ls, v, 1); /* `v' must be on stack */ 497 luaK_tostack(ls, v, 1); /* `v' must be on stack */
499 luaK_U(ls->fs, OP_PUSHSELF, name, 1); 498 luaK_code1(ls->fs, OP_PUSHSELF, name);
500 funcargs(ls, 1); 499 funcargs(ls, 1);
501 v->k = VEXP; 500 v->k = VEXP;
502 v->u.l.t = v->u.l.f = NO_JUMP; 501 v->u.l.t = v->u.l.f = NO_JUMP;
@@ -569,12 +568,12 @@ static int recfields (LexState *ls) {
569 recfield(ls); 568 recfield(ls);
570 n++; 569 n++;
571 if (++mod_n == RFIELDS_PER_FLUSH) { 570 if (++mod_n == RFIELDS_PER_FLUSH) {
572 luaK_U(fs, OP_SETMAP, RFIELDS_PER_FLUSH-1, -2*RFIELDS_PER_FLUSH); 571 luaK_code1(fs, OP_SETMAP, RFIELDS_PER_FLUSH-1);
573 mod_n = 0; 572 mod_n = 0;
574 } 573 }
575 } 574 }
576 if (mod_n) 575 if (mod_n)
577 luaK_U(fs, OP_SETMAP, mod_n-1, -2*mod_n); 576 luaK_code1(fs, OP_SETMAP, mod_n-1);
578 return n; 577 return n;
579} 578}
580 579
@@ -593,13 +592,12 @@ static int listfields (LexState *ls) {
593 checklimit(ls, n, MAXARG_A*LFIELDS_PER_FLUSH, 592 checklimit(ls, n, MAXARG_A*LFIELDS_PER_FLUSH,
594 "items in a list initializer"); 593 "items in a list initializer");
595 if (++mod_n == LFIELDS_PER_FLUSH) { 594 if (++mod_n == LFIELDS_PER_FLUSH) {
596 luaK_AB(fs, OP_SETLIST, n/LFIELDS_PER_FLUSH - 1, LFIELDS_PER_FLUSH-1, 595 luaK_code2(fs, OP_SETLIST, n/LFIELDS_PER_FLUSH - 1, LFIELDS_PER_FLUSH-1);
597 -LFIELDS_PER_FLUSH);
598 mod_n = 0; 596 mod_n = 0;
599 } 597 }
600 } 598 }
601 if (mod_n > 0) 599 if (mod_n > 0)
602 luaK_AB(fs, OP_SETLIST, n/LFIELDS_PER_FLUSH, mod_n-1, -mod_n); 600 luaK_code2(fs, OP_SETLIST, n/LFIELDS_PER_FLUSH, mod_n-1);
603 return n; 601 return n;
604} 602}
605 603
@@ -649,7 +647,7 @@ static void constructor (LexState *ls) {
649 /* constructor -> '{' constructor_part [';' constructor_part] '}' */ 647 /* constructor -> '{' constructor_part [';' constructor_part] '}' */
650 FuncState *fs = ls->fs; 648 FuncState *fs = ls->fs;
651 int line = ls->linenumber; 649 int line = ls->linenumber;
652 int pc = luaK_U(fs, OP_CREATETABLE, 0, 1); 650 int pc = luaK_code1(fs, OP_CREATETABLE, 0);
653 int nelems; 651 int nelems;
654 Constdesc cd; 652 Constdesc cd;
655 check(ls, '{'); 653 check(ls, '{');
@@ -835,7 +833,7 @@ static int assignment (LexState *ls, expdesc *v, int nvars) {
835 if (v->k != VINDEXED) 833 if (v->k != VINDEXED)
836 luaK_storevar(ls, v); 834 luaK_storevar(ls, v);
837 else { /* there may be garbage between table-index and value */ 835 else { /* there may be garbage between table-index and value */
838 luaK_AB(ls->fs, OP_SETTABLE, left+nvars+2, 1, -1); 836 luaK_code2(ls->fs, OP_SETTABLE, left+nvars+2, 1);
839 left += 2; 837 left += 2;
840 } 838 }
841 return left; 839 return left;
@@ -1099,10 +1097,9 @@ static void ret (LexState *ls) {
1099 FuncState *fs = ls->fs; 1097 FuncState *fs = ls->fs;
1100 switch (ls->token) { 1098 switch (ls->token) {
1101 case TK_RETURN: { 1099 case TK_RETURN: {
1102 int nexps; /* number of expressions returned */
1103 setline_and_next(ls); /* skip RETURN */ 1100 setline_and_next(ls); /* skip RETURN */
1104 nexps = explist(ls); 1101 explist(ls);
1105 luaK_retcode(fs, ls->fs->nlocalvar, nexps); 1102 luaK_code1(fs, OP_RETURN, ls->fs->nlocalvar);
1106 fs->stacklevel = fs->nlocalvar; /* removes all temp values */ 1103 fs->stacklevel = fs->nlocalvar; /* removes all temp values */
1107 optional(ls, ';'); 1104 optional(ls, ';');
1108 break; 1105 break;