Move OctalEscapeSequence to read_escape_char

This should simplify and improve implementation, make it easier to
implement template strings, and keep master a bit more in sync with
harmony.

Previous implementation wasn't broken, though the loop gave me the
impression it could read infinite numbers and annoyed me a bit. It was
also slightly unnecessary because the lookup involved only 3 characters.
This commit is contained in:
Anthony Van de Gejuchte
2016-06-23 16:53:48 +02:00
committed by Richard van Velzen
parent 9676167aac
commit 3a7d53f3cf
3 changed files with 30 additions and 23 deletions

View File

@@ -365,7 +365,6 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
case 98 : return "\b";
case 118 : return "\u000b"; // \v
case 102 : return "\f";
case 48 : return "\0";
case 120 : return String.fromCharCode(hex_bytes(2)); // \x
case 117 : return String.fromCharCode(hex_bytes(4)); // \u
case 10 : return ""; // newline
@@ -375,9 +374,27 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
return "";
}
}
if (ch >= "0" && ch <= "7")
return read_octal_escape_sequence(ch);
return ch;
};
function read_octal_escape_sequence(ch) {
// Read
var p = peek();
if (p >= "0" && p <= "7") {
ch += next(true);
if (ch[0] <= "3" && (p = peek()) >= "0" && p <= "7")
ch += next(true);
}
// Parse
if (ch === "0") return "\0";
if (ch.length > 0 && next_token.has_directive("use strict"))
parse_error("SyntaxError: Octal literals are not allowed in strict mode");
return String.fromCharCode(parseInt(ch, 8));
}
function hex_bytes(n) {
var num = 0;
for (; n > 0; --n) {
@@ -393,27 +410,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
var quote = next(), ret = "";
for (;;) {
var ch = next(true, true);
if (ch == "\\") {
var octal_len = 0, first = null;
ch = read_while(function(ch){
if (ch >= "0" && ch <= "7") {
if (!first) {
first = ch;
return ++octal_len;
}
else if (first <= "3" && octal_len <= 2) return ++octal_len;
else if (first >= "4" && octal_len <= 1) return ++octal_len;
}
return false;
});
if (octal_len > 0) {
if (ch !== "0" && next_token.has_directive("use strict"))
parse_error("Octal literals are not allowed in strict mode");
ch = String.fromCharCode(parseInt(ch, 8));
} else {
ch = read_escaped_char(true);
}
}
if (ch == "\\") ch = read_escaped_char(true);
else if ("\r\n\u2028\u2029".indexOf(ch) >= 0) parse_error("Unterminated string constant");
else if (ch == quote) break;
ret += ch;