diff --git a/acorn.js b/acorn.js index c6341b605e..d4d7b87008 100644 --- a/acorn.js +++ b/acorn.js @@ -1245,15 +1245,15 @@ } else if (ch === 92) { // "\" containsEsc = true; word += input.slice(chunkStart, tokPos); + var escStart = tokPos; if (input.charCodeAt(++tokPos) != 117) // "u" raise(tokPos, "Expecting Unicode escape sequence \\uXXXX"); ++tokPos; - var esc = readHexChar(4); - var escStr = String.fromCharCode(esc); - if (!escStr) raise(tokPos - 1, "Invalid Unicode escape"); - if (!(first ? isIdentifierStart(esc) : isIdentifierChar(esc))) - raise(tokPos - 4, "Invalid Unicode escape"); - word += escStr; + var esc = readCodePoint(); + if (esc.length != 1 || + !(first ? isIdentifierStart : isIdentifierChar)(esc.charCodeAt(0))) + raise(escStart, "Invalid Unicode escape"); + word += esc; chunkStart = tokPos; } else { break; diff --git a/test/tests.js b/test/tests.js index dfbfda0438..92f23f2ac4 100644 --- a/test/tests.js +++ b/test/tests.js @@ -26869,10 +26869,10 @@ testFail("x\\", "Expecting Unicode escape sequence \\uXXXX (1:2)"); testFail("x\\u005c", - "Invalid Unicode escape (1:3)"); + "Invalid Unicode escape (1:1)"); testFail("x\\u002a", - "Invalid Unicode escape (1:3)"); + "Invalid Unicode escape (1:1)"); testFail("/", "Unterminated regular expression (1:1)"); @@ -27150,13 +27150,13 @@ testFail("\\\\", "Expecting Unicode escape sequence \\uXXXX (1:1)"); testFail("\\u005c", - "Invalid Unicode escape (1:2)"); + "Invalid Unicode escape (1:0)"); testFail("\\x", "Expecting Unicode escape sequence \\uXXXX (1:1)"); testFail("\\u0000", - "Invalid Unicode escape (1:2)"); + "Invalid Unicode escape (1:0)"); testFail("‌ = []", "Unexpected character '‌' (1:0)");