diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2005-08-22 15:54:32 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2005-08-22 15:54:32 -0300 |
| commit | 43ad0637ca376d22f8b64924b965d7316283ade7 (patch) | |
| tree | 75570899a27161d8021bd7ff34c8635de04a7f97 | |
| parent | 027e9e99ca99cb572398d18d1c61a1ea2e804b71 (diff) | |
| download | lua-43ad0637ca376d22f8b64924b965d7316283ade7.tar.gz lua-43ad0637ca376d22f8b64924b965d7316283ade7.tar.bz2 lua-43ad0637ca376d22f8b64924b965d7316283ade7.zip | |
small optimizations
| -rw-r--r-- | lparser.c | 34 |
1 files changed, 17 insertions, 17 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lparser.c,v 2.31 2005/07/11 14:01:37 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 2.32 2005/08/17 18:32:09 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 | */ |
| @@ -239,35 +239,35 @@ static void markupval (FuncState *fs, int level) { | |||
| 239 | } | 239 | } |
| 240 | 240 | ||
| 241 | 241 | ||
| 242 | static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { | 242 | static int singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { |
| 243 | if (fs == NULL) /* no more levels? */ | 243 | if (fs == NULL) { /* no more levels? */ |
| 244 | init_exp(var, VGLOBAL, NO_REG); /* default is global variable */ | 244 | init_exp(var, VGLOBAL, NO_REG); /* default is global variable */ |
| 245 | return VGLOBAL; | ||
| 246 | } | ||
| 245 | else { | 247 | else { |
| 246 | int v = searchvar(fs, n); /* look up at current level */ | 248 | int v = searchvar(fs, n); /* look up at current level */ |
| 247 | if (v >= 0) { | 249 | if (v >= 0) { |
| 248 | init_exp(var, VLOCAL, v); | 250 | init_exp(var, VLOCAL, v); |
| 249 | if (!base) | 251 | if (!base) |
| 250 | markupval(fs, v); /* local will be used as an upval */ | 252 | markupval(fs, v); /* local will be used as an upval */ |
| 253 | return VLOCAL; | ||
| 251 | } | 254 | } |
| 252 | else { /* not found at current level; try upper one */ | 255 | else { /* not found at current level; try upper one */ |
| 253 | singlevaraux(fs->prev, n, var, 0); | 256 | if (singlevaraux(fs->prev, n, var, 0) == VGLOBAL) |
| 254 | if (var->k == VGLOBAL) { | 257 | return VGLOBAL; |
| 255 | if (base) | 258 | var->info = indexupvalue(fs, n, var); /* else was LOCAL or UPVAL */ |
| 256 | var->info = luaK_stringK(fs, n); /* info points to global name */ | 259 | var->k = VUPVAL; /* upvalue in this level */ |
| 257 | } | 260 | return VUPVAL; |
| 258 | else { /* LOCAL or UPVAL */ | ||
| 259 | var->info = indexupvalue(fs, n, var); | ||
| 260 | var->k = VUPVAL; /* upvalue in this level */ | ||
| 261 | } | ||
| 262 | } | 261 | } |
| 263 | } | 262 | } |
| 264 | } | 263 | } |
| 265 | 264 | ||
| 266 | 265 | ||
| 267 | static TString *singlevar (LexState *ls, expdesc *var, int base) { | 266 | static void singlevar (LexState *ls, expdesc *var) { |
| 268 | TString *varname = str_checkname(ls); | 267 | TString *varname = str_checkname(ls); |
| 269 | singlevaraux(ls->fs, varname, var, base); | 268 | FuncState *fs = ls->fs; |
| 270 | return varname; | 269 | if (singlevaraux(fs, varname, var, 1) == VGLOBAL) |
| 270 | var->info = luaK_stringK(fs, varname); /* info points to global name */ | ||
| 271 | } | 271 | } |
| 272 | 272 | ||
| 273 | 273 | ||
| @@ -694,7 +694,7 @@ static void prefixexp (LexState *ls, expdesc *v) { | |||
| 694 | return; | 694 | return; |
| 695 | } | 695 | } |
| 696 | case TK_NAME: { | 696 | case TK_NAME: { |
| 697 | singlevar(ls, v, 1); | 697 | singlevar(ls, v); |
| 698 | return; | 698 | return; |
| 699 | } | 699 | } |
| 700 | default: { | 700 | default: { |
| @@ -1214,7 +1214,7 @@ static void localstat (LexState *ls) { | |||
| 1214 | static int funcname (LexState *ls, expdesc *v) { | 1214 | static int funcname (LexState *ls, expdesc *v) { |
| 1215 | /* funcname -> NAME {field} [`:' NAME] */ | 1215 | /* funcname -> NAME {field} [`:' NAME] */ |
| 1216 | int needself = 0; | 1216 | int needself = 0; |
| 1217 | singlevar(ls, v, 1); | 1217 | singlevar(ls, v); |
| 1218 | while (ls->t.token == '.') | 1218 | while (ls->t.token == '.') |
| 1219 | field(ls, v); | 1219 | field(ls, v); |
| 1220 | if (ls->t.token == ':') { | 1220 | if (ls->t.token == ':') { |
