Pārlūkot izejas kodu

Local declaration in the REPL generates a warning

Roberto Ierusalimschy 10 mēneši atpakaļ
vecāks
revīzija
e4f418f07c
2 mainītis faili ar 25 papildinājumiem un 2 dzēšanām
  1. 16 2
      lua.c
  2. 9 0
      testes/main.lua

+ 16 - 2
lua.c

@@ -587,15 +587,28 @@ static int addreturn (lua_State *L) {
 }
 }
 
 
 
 
+static void checklocal (const char *line) {
+  static const size_t szloc = sizeof("local") - 1;
+  static const char space[] = " \t";
+  line += strspn(line, space);  /* skip spaces */
+  if (strncmp(line, "local", szloc) == 0 &&  /* "local"? */
+      strchr(space, *(line + szloc)) != NULL) {  /* followed by a space? */
+    lua_writestringerror("%s\n",
+      "warning: locals do not survive across lines in interactive mode");
+  }
+}
+
+
 /*
 /*
 ** Read multiple lines until a complete Lua statement or an error not
 ** Read multiple lines until a complete Lua statement or an error not
 ** for an incomplete statement. Start with first line already read in
 ** for an incomplete statement. Start with first line already read in
 ** the stack.
 ** the stack.
 */
 */
 static int multiline (lua_State *L) {
 static int multiline (lua_State *L) {
+  size_t len;
+  const char *line = lua_tolstring(L, 1, &len);  /* get first line */
+  checklocal(line);
   for (;;) {  /* repeat until gets a complete statement */
   for (;;) {  /* repeat until gets a complete statement */
-    size_t len;
-    const char *line = lua_tolstring(L, 1, &len);  /* get what it has */
     int status = luaL_loadbuffer(L, line, len, "=stdin");  /* try it */
     int status = luaL_loadbuffer(L, line, len, "=stdin");  /* try it */
     if (!incomplete(L, status) || !pushline(L, 0))
     if (!incomplete(L, status) || !pushline(L, 0))
       return status;  /* should not or cannot try to add continuation line */
       return status;  /* should not or cannot try to add continuation line */
@@ -603,6 +616,7 @@ static int multiline (lua_State *L) {
     lua_pushliteral(L, "\n");  /* add newline... */
     lua_pushliteral(L, "\n");  /* add newline... */
     lua_insert(L, -2);  /* ...between the two lines */
     lua_insert(L, -2);  /* ...between the two lines */
     lua_concat(L, 3);  /* join them */
     lua_concat(L, 3);  /* join them */
+    line = lua_tolstring(L, 1, &len);  /* get what is has */
   }
   }
 }
 }
 
 

+ 9 - 0
testes/main.lua

@@ -263,6 +263,15 @@ assert(string.find(getoutput(), "error calling 'print'"))
 RUN('echo "io.stderr:write(1000)\ncont" | lua -e "require\'debug\'.debug()" 2> %s', out)
 RUN('echo "io.stderr:write(1000)\ncont" | lua -e "require\'debug\'.debug()" 2> %s', out)
 checkout("lua_debug> 1000lua_debug> ")
 checkout("lua_debug> 1000lua_debug> ")
 
 
+do  -- test warning for locals
+  RUN('echo "  		local x" | lua -i > %s 2>&1', out)
+  assert(string.find(getoutput(), "warning: "))
+
+  RUN('echo "local1 = 10\nlocal1 + 3" | lua -i > %s 2>&1', out)
+  local t = getoutput()
+  assert(not string.find(t, "warning"))
+  assert(string.find(t, "13"))
+end
 
 
 print("testing warnings")
 print("testing warnings")