summaryrefslogtreecommitdiff
path: root/lparser.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-03-14 15:32:37 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-03-14 15:32:37 -0300
commit9681ff09db78f0250865e576fd72e6bcadb81d0f (patch)
tree7fe11cbad5e5f1513a1d22d11af9714fe663c52e /lparser.c
parent7ff21273d66541ac19ad817f90e8bcea5790f355 (diff)
downloadlua-9681ff09db78f0250865e576fd72e6bcadb81d0f.tar.gz
lua-9681ff09db78f0250865e576fd72e6bcadb81d0f.tar.bz2
lua-9681ff09db78f0250865e576fd72e6bcadb81d0f.zip
small optimization when returning a single local value
Diffstat (limited to 'lparser.c')
-rw-r--r--lparser.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/lparser.c b/lparser.c
index 13177507..78a6846f 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 1.168 2002/03/08 19:10:32 roberto Exp roberto $ 2** $Id: lparser.c,v 1.169 2002/03/14 18:01:52 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*/
@@ -341,7 +341,6 @@ static void leaveblock (FuncState *fs) {
341 lua_assert(bl->nactloc == fs->nactloc); 341 lua_assert(bl->nactloc == fs->nactloc);
342 lua_assert(bl->nactvar == fs->nactvar); 342 lua_assert(bl->nactvar == fs->nactvar);
343 fs->defaultglob = bl->defaultglob; 343 fs->defaultglob = bl->defaultglob;
344 fs->freereg = bl->nactloc; /* free registers used by locals */
345 luaK_patchtohere(fs, bl->breaklist); 344 luaK_patchtohere(fs, bl->breaklist);
346} 345}
347 346
@@ -1202,20 +1201,23 @@ static void retstat (LexState *ls) {
1202 if (block_follow(ls->t.token) || ls->t.token == ';') 1201 if (block_follow(ls->t.token) || ls->t.token == ';')
1203 first = nret = 0; /* return no values */ 1202 first = nret = 0; /* return no values */
1204 else { 1203 else {
1205 explist1(ls, &e); /* optional return values */ 1204 nret = explist1(ls, &e); /* optional return values */
1206 if (e.k == VCALL) { 1205 if (e.k == VCALL) {
1207 luaK_setcallreturns(fs, &e, LUA_MULTRET); 1206 luaK_setcallreturns(fs, &e, LUA_MULTRET);
1208 first = fs->nactloc; 1207 first = fs->nactloc;
1209 nret = LUA_MULTRET; /* return all values */ 1208 nret = LUA_MULTRET; /* return all values */
1210 } 1209 }
1211 else { 1210 else {
1212 luaK_exp2nextreg(fs, &e); /* values must go to the `stack' */ 1211 if (nret == 1) /* only one single value? */
1213 first = fs->nactloc; 1212 first = luaK_exp2anyreg(fs, &e);
1214 nret = fs->freereg - first; /* return all `active' values */ 1213 else {
1214 luaK_exp2nextreg(fs, &e); /* values must go to the `stack' */
1215 first = fs->nactloc; /* return all `active' values */
1216 lua_assert(nret == fs->freereg - first);
1217 }
1215 } 1218 }
1216 } 1219 }
1217 luaK_codeABC(fs, OP_RETURN, first, nret+1, 0); 1220 luaK_codeABC(fs, OP_RETURN, first, nret+1, 0);
1218 fs->freereg = fs->nactloc; /* removes all temp values */
1219} 1221}
1220 1222
1221 1223