diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-03-14 15:32:37 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-03-14 15:32:37 -0300 |
commit | 9681ff09db78f0250865e576fd72e6bcadb81d0f (patch) | |
tree | 7fe11cbad5e5f1513a1d22d11af9714fe663c52e /lparser.c | |
parent | 7ff21273d66541ac19ad817f90e8bcea5790f355 (diff) | |
download | lua-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.c | 16 |
1 files changed, 9 insertions, 7 deletions
@@ -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 | ||