aboutsummaryrefslogtreecommitdiff
path: root/lparser.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-06-11 11:56:42 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-06-11 11:56:42 -0300
commit0a1b1acdd36a3ed4e6f1cadf62eec8531a437cbf (patch)
treef7c4e2b02380381e65fb19956ab7921bba33be97 /lparser.c
parent79acf5ea6083fe4aebeb24740d25ddf35654944a (diff)
downloadlua-0a1b1acdd36a3ed4e6f1cadf62eec8531a437cbf.tar.gz
lua-0a1b1acdd36a3ed4e6f1cadf62eec8531a437cbf.tar.bz2
lua-0a1b1acdd36a3ed4e6f1cadf62eec8531a437cbf.zip
details about opcode parameters
Diffstat (limited to 'lparser.c')
-rw-r--r--lparser.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/lparser.c b/lparser.c
index 8dff5638..b077c324 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 1.146 2001/06/08 12:29:27 roberto Exp roberto $ 2** $Id: lparser.c,v 1.147 2001/06/08 19:00:57 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*/
@@ -415,7 +415,7 @@ static int explist1 (LexState *ls, expdesc *v) {
415static void funcargs (LexState *ls, expdesc *f) { 415static void funcargs (LexState *ls, expdesc *f) {
416 FuncState *fs = ls->fs; 416 FuncState *fs = ls->fs;
417 expdesc args; 417 expdesc args;
418 int base, top; 418 int base, nparams;
419 switch (ls->t.token) { 419 switch (ls->t.token) {
420 case l_c('('): { /* funcargs -> `(' [ explist1 ] `)' */ 420 case l_c('('): { /* funcargs -> `(' [ explist1 ] `)' */
421 int line = ls->linenumber; 421 int line = ls->linenumber;
@@ -446,13 +446,13 @@ static void funcargs (LexState *ls, expdesc *f) {
446 lua_assert(f->k == VNONRELOC); 446 lua_assert(f->k == VNONRELOC);
447 base = f->u.i.info; /* base register for call */ 447 base = f->u.i.info; /* base register for call */
448 if (args.k == VCALL) 448 if (args.k == VCALL)
449 top = NO_REG; /* open call */ 449 nparams = NO_REG; /* open call */
450 else { 450 else {
451 if (args.k != VVOID) 451 if (args.k != VVOID)
452 luaK_exp2nextreg(fs, &args); /* close last argument */ 452 luaK_exp2nextreg(fs, &args); /* close last argument */
453 top = fs->freereg; 453 nparams = fs->freereg - (base+1);
454 } 454 }
455 init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, top, base+1)); 455 init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams, 1));
456 fs->freereg = base+1; /* call remove function and arguments and leaves 456 fs->freereg = base+1; /* call remove function and arguments and leaves
457 (unless changed) one result */ 457 (unless changed) one result */
458} 458}
@@ -1091,31 +1091,31 @@ static void retstat (LexState *ls) {
1091 /* stat -> RETURN explist */ 1091 /* stat -> RETURN explist */
1092 FuncState *fs = ls->fs; 1092 FuncState *fs = ls->fs;
1093 expdesc e; 1093 expdesc e;
1094 int first, last1; /* registers with returned values */ 1094 int first, nret; /* registers with returned values */
1095 next(ls); /* skip RETURN */ 1095 next(ls); /* skip RETURN */
1096 if (block_follow(ls->t.token) || ls->t.token == l_c(';')) 1096 if (block_follow(ls->t.token) || ls->t.token == l_c(';'))
1097 first = last1 = 0; /* return no values */ 1097 first = nret = 0; /* return no values */
1098 else { 1098 else {
1099 int n = explist1(ls, &e); /* optional return values */ 1099 int n = explist1(ls, &e); /* optional return values */
1100 if (e.k == VCALL) { 1100 if (e.k == VCALL) {
1101 luaK_setcallreturns(fs, &e, LUA_MULTRET); 1101 luaK_setcallreturns(fs, &e, LUA_MULTRET);
1102 first = fs->nactloc; 1102 first = fs->nactloc;
1103 last1 = NO_REG; /* return all values */ 1103 nret = NO_REG; /* return all values */
1104 } 1104 }
1105 else { 1105 else {
1106 if (n == 1) { /* only one value? */ 1106 if (n == 1) { /* only one value? */
1107 luaK_exp2anyreg(fs, &e); 1107 luaK_exp2anyreg(fs, &e);
1108 first = e.u.i.info; 1108 first = e.u.i.info;
1109 last1 = first+1; /* return only this value */ 1109 nret = 1; /* return only this value */
1110 } 1110 }
1111 else { 1111 else {
1112 luaK_exp2nextreg(fs, &e); /* values must go to the `stack' */ 1112 luaK_exp2nextreg(fs, &e); /* values must go to the `stack' */
1113 first = fs->nactloc; 1113 first = fs->nactloc;
1114 last1 = fs->freereg; /* return all `active' values */ 1114 nret = fs->freereg - first; /* return all `active' values */
1115 } 1115 }
1116 } 1116 }
1117 } 1117 }
1118 luaK_codeABC(fs, OP_RETURN, first, last1, 0); 1118 luaK_codeABC(fs, OP_RETURN, first, nret, 0);
1119 fs->freereg = fs->nactloc; /* removes all temp values */ 1119 fs->freereg = fs->nactloc; /* removes all temp values */
1120} 1120}
1121 1121