| 253 | |
| 254 | |
| 255 | static int singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { |
| 256 | if (fs == NULL) { /* no more levels? */ |
| 257 | init_exp(var, VGLOBAL, NO_REG); /* default is global variable */ |
| 258 | return VGLOBAL; |
| 259 | } |
| 260 | else { |
| 261 | int v = searchvar(fs, n); /* look up at current level */ |
| 262 | if (v >= 0) { |
| 263 | init_exp(var, VLOCAL, v); |
| 264 | if (!base) |
| 265 | markupval(fs, v); /* local will be used as an upval */ |
| 266 | return VLOCAL; |
| 267 | } |
| 268 | else { /* not found at current level; try upper one */ |
| 269 | if (singlevaraux(fs->prev, n, var, 0) == VGLOBAL) |
| 270 | return VGLOBAL; |
| 271 | var->u.s.info = indexupvalue(fs, n, var); /* else was LOCAL or UPVAL */ |
| 272 | var->k = VUPVAL; /* upvalue in this level */ |
| 273 | return VUPVAL; |
| 274 | } |
| 275 | } |
| 276 | } |
| 277 | |
| 278 | |
| 279 | static void singlevar (LexState *ls, expdesc *var) { |
no test coverage detected