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 | |
| parent | 7ff21273d66541ac19ad817f90e8bcea5790f355 (diff) | |
| download | lua-9681ff09db78f0250865e576fd72e6bcadb81d0f.tar.gz lua-9681ff09db78f0250865e576fd72e6bcadb81d0f.tar.bz2 lua-9681ff09db78f0250865e576fd72e6bcadb81d0f.zip | |
small optimization when returning a single local value
| -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 | ||
