فهرست منبع

'singlevaraux' returns result only in 'var->k'

Roberto Ierusalimschy 9 سال پیش
والد
کامیت
b65252b39b
1فایلهای تغییر یافته به همراه10 افزوده شده و 10 حذف شده
  1. 10 10
      lparser.c

+ 10 - 10
lparser.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: lparser.c,v 2.151 2016/01/05 16:22:37 roberto Exp roberto $
+** $Id: lparser.c,v 2.152 2016/03/07 19:25:39 roberto Exp roberto $
 ** Lua Parser
 ** Lua Parser
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -267,27 +267,26 @@ static void markupval (FuncState *fs, int level) {
   Find variable with given name 'n'. If it is an upvalue, add this
   Find variable with given name 'n'. If it is an upvalue, add this
   upvalue into all intermediate functions.
   upvalue into all intermediate functions.
 */
 */
-static int singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) {
+static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) {
   if (fs == NULL)  /* no more levels? */
   if (fs == NULL)  /* no more levels? */
-    return VVOID;  /* default is global */
+    init_exp(var, VVOID, 0);  /* default is global */
   else {
   else {
     int v = searchvar(fs, n);  /* look up locals at current level */
     int v = searchvar(fs, n);  /* look up locals at current level */
     if (v >= 0) {  /* found? */
     if (v >= 0) {  /* found? */
       init_exp(var, VLOCAL, v);  /* variable is local */
       init_exp(var, VLOCAL, v);  /* variable is local */
       if (!base)
       if (!base)
         markupval(fs, v);  /* local will be used as an upval */
         markupval(fs, v);  /* local will be used as an upval */
-      return VLOCAL;
     }
     }
     else {  /* not found as local at current level; try upvalues */
     else {  /* not found as local at current level; try upvalues */
       int idx = searchupvalue(fs, n);  /* try existing upvalues */
       int idx = searchupvalue(fs, n);  /* try existing upvalues */
       if (idx < 0) {  /* not found? */
       if (idx < 0) {  /* not found? */
-        if (singlevaraux(fs->prev, n, var, 0) == VVOID) /* try upper levels */
-          return VVOID;  /* not found; is a global */
+        singlevaraux(fs->prev, n, var, 0);  /* try upper levels */
+        if (var->k == VVOID)  /* not found? */
+          return;  /* it is a global */
         /* else was LOCAL or UPVAL */
         /* else was LOCAL or UPVAL */
         idx  = newupvalue(fs, n, var);  /* will be a new upvalue */
         idx  = newupvalue(fs, n, var);  /* will be a new upvalue */
       }
       }
-      init_exp(var, VUPVAL, idx);
-      return VUPVAL;
+      init_exp(var, VUPVAL, idx);  /* new or old upvalue */
     }
     }
   }
   }
 }
 }
@@ -296,10 +295,11 @@ static int singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) {
 static void singlevar (LexState *ls, expdesc *var) {
 static void singlevar (LexState *ls, expdesc *var) {
   TString *varname = str_checkname(ls);
   TString *varname = str_checkname(ls);
   FuncState *fs = ls->fs;
   FuncState *fs = ls->fs;
-  if (singlevaraux(fs, varname, var, 1) == VVOID) {  /* global name? */
+  singlevaraux(fs, varname, var, 1);
+  if (var->k == VVOID) {  /* global name? */
     expdesc key;
     expdesc key;
     singlevaraux(fs, ls->envn, var, 1);  /* get environment variable */
     singlevaraux(fs, ls->envn, var, 1);  /* get environment variable */
-    lua_assert(var->k == VLOCAL || var->k == VUPVAL);
+    lua_assert(var->k != VVOID);  /* this one must exist */
     codestring(ls, &key, varname);  /* key is variable name */
     codestring(ls, &key, varname);  /* key is variable name */
     luaK_indexed(fs, var, &key);  /* env[varname] */
     luaK_indexed(fs, var, &key);  /* env[varname] */
   }
   }