Bläddra i källkod

From Lua 5.2: Change \* to \z. Reject undefined escape sequences.

Mike Pall 14 år sedan
förälder
incheckning
b261d0ec04
1 ändrade filer med 14 tillägg och 16 borttagningar
  1. 14 16
      src/lj_lex.c

+ 14 - 16
src/lj_lex.c

@@ -238,9 +238,8 @@ static void read_string(LexState *ls, int delim, TValue *tv)
       lj_lex_error(ls, TK_string, LJ_ERR_XSTR);
       continue;
     case '\\': {
-      int c;
-      next(ls);  /* Skip the '\\'. */
-      switch (ls->current) {
+      int c = next(ls);  /* Skip the '\\'. */
+      switch (c) {
       case 'a': c = '\a'; break;
       case 'b': c = '\b'; break;
       case 'f': c = '\f'; break;
@@ -260,31 +259,30 @@ static void read_string(LexState *ls, int delim, TValue *tv)
 	  c += 9;
 	}
 	break;
-      case '*':  /* Skip whitespace. */
+      case 'z':  /* Skip whitespace. */
 	next(ls);
 	while (lj_char_isspace(ls->current))
 	  if (currIsNewline(ls)) inclinenumber(ls); else next(ls);
 	continue;
       case '\n': case '\r': save(ls, '\n'); inclinenumber(ls); continue;
+      case '\\': case '\"': case '\'': break;
       case END_OF_STREAM: continue;
       default:
-	if (!lj_char_isdigit(ls->current)) {
-	  save_and_next(ls);  /* Handles '\\', '\"' and "\'". */
-	} else {  /* Decimal escape '\ddd'. */
-	  c = (ls->current - '0');
+	if (!lj_char_isdigit(c))
+	  goto err_xesc;
+	c -= '0';  /* Decimal escape '\ddd'. */
+	if (lj_char_isdigit(next(ls))) {
+	  c = c*10 + (ls->current - '0');
 	  if (lj_char_isdigit(next(ls))) {
 	    c = c*10 + (ls->current - '0');
-	    if (lj_char_isdigit(next(ls))) {
-	      c = c*10 + (ls->current - '0');
-	      if (c > 255) {
-	      err_xesc:
-		lj_lex_error(ls, TK_string, LJ_ERR_XESC);
-	      }
-	      next(ls);
+	    if (c > 255) {
+	    err_xesc:
+	      lj_lex_error(ls, TK_string, LJ_ERR_XESC);
 	    }
+	    next(ls);
 	  }
-	  save(ls, c);
 	}
+	save(ls, c);
 	continue;
       }
       save(ls, c);