static void singlevar (LexState *ls, expdesc *var) { TString *varname = str_checkname(ls); FuncState *fs = ls->fs; if (singlevaraux(fs, varname, var) == VVOID) { /* global name? */ expdesc key; singlevaraux(fs, ls->envn, var); /* get environment variable */ lua_assert(var->k == VLOCAL || var->k == VUPVAL); codestring(ls, &key, varname); /* key is variable name */ luaK_indexed(fs, var, &key); /* env[varname] */ } }
static void singlevar(ktap_lexstate *ls, ktap_expdesc *var) { ktap_string *varname = str_checkname(ls); ktap_funcstate *fs = ls->fs; if (singlevaraux(fs, varname, var, 1) == VVOID) { /* global name? */ ktap_expdesc key; singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ ktap_assert(var->k == VLOCAL || var->k == VUPVAL); codestring(ls, &key, varname); /* key is variable name */ codegen_indexed(fs, var, &key); /* env[varname] */ } }
/* Find variable with given name 'n'. If it is an upvalue, add this upvalue into all intermediate functions. */ static int singlevaraux (FuncState *fs, TString *n, expdesc *var) { if (fs == NULL) /* no more levels? */ return VVOID; /* default is global */ else { LexState *ls = fs->ls; int v = searchvar(fs, n); /* look up locals at current level */ if (v >= 0) { /* found? */ init_exp(var, VLOCAL, v); /* variable is local */ return VLOCAL; } else { /* not found as local at current level; try upvalues */ if (ls->t.token != '(') { new_localvar(ls, n); init_exp(var, VLOCAL, fs->nlocvars - 1); /* variable is local */ return VLOCAL; } int idx = searchupvalue(fs, n); /* try existing upvalues */ if (idx < 0) { /* not found? */ if (singlevaraux(fs->prev, n, var) == VVOID) /* try upper levels */ return VVOID; /* not found; is a global */ /* else was LOCAL or UPVAL */ idx = newupvalue(fs, n, var); /* will be a new upvalue */ } init_exp(var, VUPVAL, idx); return VUPVAL; } } }
static void singlevar(LexState* ls, expdesc* var) { TString* varname = str_checkname(ls); FuncState* fs = ls->fs; if (singlevaraux(fs, varname, var, 1) == VGLOBAL) var->u.s.info = luaK_stringK(fs, varname); /* info points to global name */ }
static int singlevaraux(FuncState* fs, TString* n, expdesc* var, int base) { if (fs == NULL) /* no more levels? */ { init_exp(var, VGLOBAL, NO_REG); /* default is global variable */ return VGLOBAL; } else { int v = searchvar(fs, n); /* look up at current level */ if (v >= 0) { init_exp(var, VLOCAL, v); if (!base) markupval(fs, v); /* local will be used as an upval */ return VLOCAL; } else /* not found at current level; try upper one */ { if (singlevaraux(fs->prev, n, var, 0) == VGLOBAL) return VGLOBAL; var->u.s.info = indexupvalue(fs, n, var); /* else was LOCAL or UPVAL */ var->k = VUPVAL; /* upvalue in this level */ return VUPVAL; } } }
/* Find variable with given name 'n'. If it is an upvalue, add this upvalue into all intermediate functions. */ static int singlevaraux(FuncState *fs, TString *n, expdesc *var, int base) { if (fs == NULL) /* no more levels? */ return VVOID; /* default is global */ else { int v = searchvar(fs, n); /* look up locals at current level */ if (v >= 0) /* found? */ { init_exp(var, VLOCAL, v); /* variable is local */ if (!base) markupval(fs, v); /* local will be used as an upval */ return VLOCAL; } else /* not found as local at current level; try upvalues */ { int idx = searchupvalue(fs, n); /* try existing upvalues */ if (idx < 0) /* not found? */ { if (singlevaraux(fs->prev, n, var, 0) == VVOID) /* try upper levels */ return VVOID; /* not found; is a global */ /* else was LOCAL or UPVAL */ idx = newupvalue(fs, n, var); /* will be a new upvalue */ } init_exp(var, VUPVAL, idx); return VUPVAL; } } }
static void singlevar (LexState *ls, expdesc *var) { TString *varname = str_checkname(ls); FuncState *fs = ls->fs; if (singlevaraux(fs, varname, var, 1) == VGLOBAL) { var->u.s.info = luaK_stringK(fs, varname); /* info points to global name */ #ifdef LUA_UTILITIES_NET GetGlobal(varname, ls); #endif } }
static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { if (fs == NULL) /* no more levels? */ init_exp(var, VGLOBAL, NO_REG); /* default is global variable */ else { int v = searchvar(fs, n); /* look up at current level */ if (v >= 0) { init_exp(var, VLOCAL, v); if (!base) markupval(fs, v); /* local will be used as an upval */ } else { /* not found at current level; try upper one */ singlevaraux(fs->prev, n, var, 0); if (var->k == VGLOBAL) { if (base) var->info = luaK_stringK(fs, n); /* info points to global name */ } else { /* LOCAL or UPVAL */ var->info = indexupvalue(fs, n, var); var->k = VUPVAL; /* upvalue in this level */ } } } }
static TString *singlevar (LexState *ls, expdesc *var, int base) { TString *varname = str_checkname(ls); singlevaraux(ls->fs, varname, var, base); return varname; }