We incorrectly allow escaped characters in keyword tokens
authorgskachkov@gmail.com <gskachkov@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 12 Jun 2017 18:23:59 +0000 (18:23 +0000)
committergskachkov@gmail.com <gskachkov@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 12 Jun 2017 18:23:59 +0000 (18:23 +0000)
https://bugs.webkit.org/show_bug.cgi?id=171310

Reviewed by Yusuke Suzuki.

JSTests:

* stress/destructuring-assignment-syntax.js:
* stress/error-messages-for-in-operator-should-not-crash.js:
(catch):
* stress/reserved-word-with-escape.js:
(testSyntaxError.String.raw.v):
(String.raw.SyntaxError.Cannot.use.the.keyword.string_appeared_here.as.a.name):
(testSyntaxError.String.raw.a):
* JSTests/ChakraCore/test/Basics/IdsWithEscapes.baseline-jsc:

Source/JavaScriptCore:

According spec it is not allow to use escaped characters in
keywords. https://tc39.github.io/ecma262/#sec-reserved-words
Current patch implements this requirements.

* parser/Lexer.cpp:
(JSC::Lexer<CharacterType>::parseIdentifierSlowCase):
* parser/Parser.cpp:
(JSC::Parser<LexerType>::printUnexpectedTokenText):
* parser/ParserTokens.h:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@218111 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JSTests/ChakraCore/test/Basics/IdsWithEscapes.baseline-jsc
JSTests/ChangeLog
JSTests/stress/destructuring-assignment-syntax.js
JSTests/stress/error-messages-for-in-operator-should-not-crash.js
JSTests/stress/reserved-word-with-escape.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/parser/Lexer.cpp
Source/JavaScriptCore/parser/Parser.cpp
Source/JavaScriptCore/parser/ParserTokens.h

index 0644e8a..18d60c5 100644 (file)
@@ -3,20 +3,20 @@
 20
 20
 ReferenceError: Can't find variable: hello2
-false
-false
-true
+SyntaxError: Unexpected escaped characters in keyword tocken: 'fals\u0065'
+SyntaxError: Unexpected escaped characters in keyword tocken: 'fals\u0065'
+SyntaxError: Unexpected escaped characters in keyword tocken: 'tru\u0065'
 SyntaxError: Unexpected keyword 'var'
-SyntaxError: Unexpected keyword 'v\u0061r'
+SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'
 SyntaxError: Unexpected keyword 'else'
-SyntaxError: Unexpected keyword 'els\u0065'
+SyntaxError: Unexpected escaped characters in keyword tocken: 'els\u0065'
 SyntaxError: Cannot use the keyword 'false' as a variable name.
 SyntaxError: Cannot use the keyword 'var' as a variable name.
-SyntaxError: Cannot use the keyword 'fals\u0065' as a variable name.
-SyntaxError: Cannot use the keyword 'v\u0061r' as a variable name.
+SyntaxError: Unexpected escaped characters in keyword tocken: 'fals\u0065'
+SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'
 10
 10
 10
 10
 SyntaxError: Cannot use the keyword 'else' as a function name.
-SyntaxError: Cannot use the keyword 'els\u0065' as a function name.
+SyntaxError: Unexpected escaped characters in keyword tocken: 'els\u0065'
index 7c2b3b9..ac28766 100644 (file)
@@ -1,3 +1,19 @@
+2017-06-12  Oleksandr Skachkov  <gskachkov@gmail.com>
+
+        We incorrectly allow escaped characters in keyword tokens
+        https://bugs.webkit.org/show_bug.cgi?id=171310
+
+        Reviewed by Yusuke Suzuki.
+
+        * stress/destructuring-assignment-syntax.js:
+        * stress/error-messages-for-in-operator-should-not-crash.js:
+        (catch):
+        * stress/reserved-word-with-escape.js:
+        (testSyntaxError.String.raw.v):
+        (String.raw.SyntaxError.Cannot.use.the.keyword.string_appeared_here.as.a.name):
+        (testSyntaxError.String.raw.a):
+        * JSTests/ChakraCore/test/Basics/IdsWithEscapes.baseline-jsc:
+
 2017-06-09  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         [DFG] Add ArrayIndexOf intrinsic
index 239ca35..5808fd2 100644 (file)
@@ -47,16 +47,16 @@ testSyntax("[{prop: 1}.prop] = []");
 testSyntaxError("[...c = 1] = []", "SyntaxError: Unexpected token '='. Expected a closing ']' following a rest element destructuring pattern.");
 testSyntaxError("[...c, d] = []", "SyntaxError: Unexpected token ','. Expected a closing ']' following a rest element destructuring pattern.");
 testSyntaxError("[this] = []", "SyntaxError: Invalid destructuring assignment target.");
-testSyntaxError("[th\\u{69}s] = []", "SyntaxError: Invalid destructuring assignment target.");
+testSyntaxError("[th\\u{69}s] = []", "SyntaxError: Unexpected escaped characters in keyword tocken: 'th\\u{69}s'");
 testSyntaxError("[function() {}] = []", "SyntaxError: Invalid destructuring assignment target.");
 testSyntaxError("['string'] = []", "SyntaxError: Invalid destructuring assignment target.");
 testSyntaxError("[123] = []", "SyntaxError: Invalid destructuring assignment target.");
 testSyntaxError("[true] = []", "SyntaxError: Invalid destructuring assignment target.");
-testSyntaxError("[tru\\u0065] = []", "SyntaxError: Invalid destructuring assignment target.");
+testSyntaxError("[tru\\u0065] = []", "SyntaxError: Unexpected escaped characters in keyword tocken: 'tru\\u0065'");
 testSyntaxError("[false] = []", "SyntaxError: Invalid destructuring assignment target.");
-testSyntaxError("[f\\u0061lse] = []", "SyntaxError: Invalid destructuring assignment target.");
+testSyntaxError("[f\\u0061lse] = []", "SyntaxError: Unexpected escaped characters in keyword tocken: 'f\\u0061lse'");
 testSyntaxError("[null] = []", "SyntaxError: Invalid destructuring assignment target.");
-testSyntaxError("[n\\u{75}ll] = []", "SyntaxError: Invalid destructuring assignment target.");
+testSyntaxError("[n\\u{75}ll] = []", "SyntaxError: Unexpected escaped characters in keyword tocken: 'n\\u{75}ll'");
 
 testSyntaxError("'use strict'; ({ eval } = {})", "SyntaxError: Cannot modify 'eval' in strict mode.");
 testSyntaxError("'use strict'; ({ eval = 0 } = {})", "SyntaxError: Cannot modify 'eval' in strict mode.");
index d699de0..b54580c 100644 (file)
@@ -1,11 +1,30 @@
-// This test should not crash.
-
 let error = null;
 try {
-    // FIXME: We should not parse this as an "in" operation.
-    let r = "prop" i\u006E 20;
+    eval('let r = "prop" i\\u{006E} 20');
 } catch(e) {
     error = e;
 }
-if (error.message !== "20 is not an Object.")
+
+if (!error || error.message !== "Unexpected escaped characters in keyword tocken: 'i\\u{006E}'")
     throw new Error("Bad");
+
+error = null;
+try {
+    eval('let r = "prop" i\\u006E 20');
+} catch(e) {
+    error = e;
+}
+
+if (!error || error.message !== "Unexpected escaped characters in keyword tocken: 'i\\u006E'")
+    throw new Error("Bad");
+
+// This test should not crash.
+error = null;
+try {
+    eval('let r = "prop" i\u006E 20');
+} catch(e) {
+    error = e;
+}
+
+if (!error || error.message !== "20 is not an Object. (evaluating \'\"prop\" in 20\')")
+    throw new Error("Bad");
\ No newline at end of file
index f52dc4e..0f688e0 100644 (file)
@@ -25,117 +25,128 @@ testSyntax("var cocoa");
 testSyntax("var c\u006fcoa");
 
 testSyntaxError(String.raw`var var`, String.raw`SyntaxError: Cannot use the keyword 'var' as a variable name.`);
-testSyntaxError(String.raw`var v\u0061r`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a variable name.`);
-testSyntaxError(String.raw`var v\u{0061}r`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a variable name.`);
+testSyntaxError(String.raw`var v\u0061r`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`var v\u{0061}r`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`var var = 2000000;`, String.raw`SyntaxError: Cannot use the keyword 'var' as a variable name.`);
-testSyntaxError(String.raw`var v\u0061r = 2000000;`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a variable name.`);
-testSyntaxError(String.raw`var v\u{0061}r = 2000000`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a variable name.`);
+testSyntaxError(String.raw`var v\u0061r = 2000000;`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`var v\u{0061}r = 2000000`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`var {var} = obj)`, String.raw`SyntaxError: Cannot use abbreviated destructuring syntax for keyword 'var'.`);
-testSyntaxError(String.raw`var {v\u0061r} = obj`, String.raw`SyntaxError: Cannot use abbreviated destructuring syntax for keyword 'var'.`);
-testSyntaxError(String.raw`var {v\u{0061}r} = obj`, String.raw`SyntaxError: Cannot use abbreviated destructuring syntax for keyword 'var'.`);
+testSyntaxError(String.raw`var {v\u0061r} = obj`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`var {v\u{0061}r} = obj`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`var {var:var} = obj)`, String.raw`SyntaxError: Cannot use the keyword 'var' as a variable name.`);
-testSyntaxError(String.raw`var {var:v\u0061r} = obj`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a variable name.`);
-testSyntaxError(String.raw`var {var:v\u{0061}r} = obj`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a variable name.`);
+testSyntaxError(String.raw`var {var:v\u0061r} = obj`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`var {var:v\u{0061}r} = obj`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`var [var] = obj`, String.raw`SyntaxError: Cannot use the keyword 'var' as a variable name.`);
-testSyntaxError(String.raw`var [v\u0061r] = obj`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a variable name.`);
-testSyntaxError(String.raw`var [v\u{0061}r] = obj`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a variable name.`);
+testSyntaxError(String.raw`var [v\u0061r] = obj`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`var [v\u{0061}r] = obj`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`[var] = obj`, String.raw`SyntaxError: Unexpected keyword 'var'`);
-testSyntaxError(String.raw`[v\u0061r] = obj`, String.raw`SyntaxError: Unexpected keyword 'v\u0061r'`);
-testSyntaxError(String.raw`[v\u{0061}r] = obj`, String.raw`SyntaxError: Unexpected keyword 'v\u{0061}r'`);
+testSyntaxError(String.raw`[v\u0061r] = obj`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`[v\u{0061}r] = obj`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`function var() { }`, String.raw`SyntaxError: Cannot use the keyword 'var' as a function name.`);
-testSyntaxError(String.raw`function v\u0061r() { }`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a function name.`);
-testSyntaxError(String.raw`function v\u{0061}r() { }`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a function name.`);
+testSyntaxError(String.raw`function v\u0061r() { }`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`function v\u{0061}r() { }`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`function a(var) { }`, String.raw`SyntaxError: Cannot use the keyword 'var' as a parameter name.`);
-testSyntaxError(String.raw`function a(v\u0061r) { }`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a parameter name.`);
-testSyntaxError(String.raw`function a(v\u{0061}r) { }`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a parameter name.`);
+testSyntaxError(String.raw`function a(v\u0061r) { }`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`function a(v\u{0061}r) { }`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`function a({var}) { }`, String.raw`SyntaxError: Cannot use abbreviated destructuring syntax for keyword 'var'.`);
-testSyntaxError(String.raw`function a({v\u0061r}) { }`, String.raw`SyntaxError: Cannot use abbreviated destructuring syntax for keyword 'var'.`);
-testSyntaxError(String.raw`function a({v\u{0061}r}) { }`, String.raw`SyntaxError: Cannot use abbreviated destructuring syntax for keyword 'var'.`);
+testSyntaxError(String.raw`function a({v\u0061r}) { }`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`function a({v\u{0061}r}) { }`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`function a({var:var}) { }`, String.raw`SyntaxError: Cannot use the keyword 'var' as a parameter name.`);
-testSyntaxError(String.raw`function a({var:v\u0061r}) { }`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a parameter name.`);
-testSyntaxError(String.raw`function a({var:v\u{0061}r}) { }`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a parameter name.`);
+testSyntaxError(String.raw`function a({var:v\u0061r}) { }`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`function a({var:v\u{0061}r}) { }`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`function a([var]) { }`, String.raw`SyntaxError: Cannot use the keyword 'var' as a parameter name.`);
-testSyntaxError(String.raw`function a([v\u0061r]) { }`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a parameter name.`);
-testSyntaxError(String.raw`function a([v\u{0061}r]) { }`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a parameter name.`);
+testSyntaxError(String.raw`function a([v\u0061r]) { }`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`function a([v\u{0061}r]) { }`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`(function var() { })`, String.raw`SyntaxError: Cannot use the keyword 'var' as a function name.`);
-testSyntaxError(String.raw`(function v\u0061r() { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a function name.`);
-testSyntaxError(String.raw`(function v\u{0061}r() { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a function name.`);
+testSyntaxError(String.raw`(function v\u0061r() { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`(function v\u{0061}r() { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`(function a(var) { })`, String.raw`SyntaxError: Cannot use the keyword 'var' as a parameter name.`);
-testSyntaxError(String.raw`(function a(v\u0061r) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a parameter name.`);
-testSyntaxError(String.raw`(function a(v\u{0061}r) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a parameter name.`);
+testSyntaxError(String.raw`(function a(v\u0061r) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`(function a(v\u{0061}r) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`(function a({var}) { })`, String.raw`SyntaxError: Cannot use abbreviated destructuring syntax for keyword 'var'.`);
-testSyntaxError(String.raw`(function a({v\u0061r}) { })`, String.raw`SyntaxError: Cannot use abbreviated destructuring syntax for keyword 'var'.`);
-testSyntaxError(String.raw`(function a({v\u{0061}r}) { })`, String.raw`SyntaxError: Cannot use abbreviated destructuring syntax for keyword 'var'.`);
+testSyntaxError(String.raw`(function a({v\u0061r}) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`(function a({v\u{0061}r}) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`(function a({var:var}) { })`, String.raw`SyntaxError: Cannot use the keyword 'var' as a parameter name.`);
-testSyntaxError(String.raw`(function a({var:v\u0061r}) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a parameter name.`);
-testSyntaxError(String.raw`(function a({var:v\u{0061}r}) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a parameter name.`);
+testSyntaxError(String.raw`(function a({var:v\u0061r}) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`(function a({var:v\u{0061}r}) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`(function a([var]) { })`, String.raw`SyntaxError: Cannot use the keyword 'var' as a parameter name.`);
-testSyntaxError(String.raw`(function a([v\u0061r]) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a parameter name.`);
-testSyntaxError(String.raw`(function a([v\u{0061}r]) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a parameter name.`);
+testSyntaxError(String.raw`(function a([v\u0061r]) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`(function a([v\u{0061}r]) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`(function a([{var}]) { })`, String.raw`SyntaxError: Cannot use abbreviated destructuring syntax for keyword 'var'.`);
-testSyntaxError(String.raw`(function a([{v\u0061r}]) { })`, String.raw`SyntaxError: Cannot use abbreviated destructuring syntax for keyword 'var'.`);
-testSyntaxError(String.raw`(function a([{v\u{0061}r}]) { })`, String.raw`SyntaxError: Cannot use abbreviated destructuring syntax for keyword 'var'.`);
+testSyntaxError(String.raw`(function a([{v\u0061r}]) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`(function a([{v\u{0061}r}]) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`(function a([{var:var}]) { })`, String.raw`SyntaxError: Cannot use the keyword 'var' as a parameter name.`);
-testSyntaxError(String.raw`(function a([{var:v\u0061r}]) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a parameter name.`);
-testSyntaxError(String.raw`(function a([{var:v\u{0061}r}]) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a parameter name.`);
+testSyntaxError(String.raw`(function a([{var:v\u0061r}]) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`(function a([{var:v\u{0061}r}]) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`(function a([[var]]) { })`, String.raw`SyntaxError: Cannot use the keyword 'var' as a parameter name.`);
-testSyntaxError(String.raw`(function a([[v\u0061r]]) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a parameter name.`);
-testSyntaxError(String.raw`(function a([[v\u{0061}r]]) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a parameter name.`);
+testSyntaxError(String.raw`(function a([[v\u0061r]]) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`(function a([[v\u{0061}r]]) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`(function a({ hello: {var}}) { })`, String.raw`SyntaxError: Cannot use abbreviated destructuring syntax for keyword 'var'.`);
-testSyntaxError(String.raw`(function a({ hello: {v\u0061r}}) { })`, String.raw`SyntaxError: Cannot use abbreviated destructuring syntax for keyword 'var'.`);
-testSyntaxError(String.raw`(function a({ hello: {v\u{0061}r}}) { })`, String.raw`SyntaxError: Cannot use abbreviated destructuring syntax for keyword 'var'.`);
+testSyntaxError(String.raw`(function a({ hello: {v\u0061r}}) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`(function a({ hello: {v\u{0061}r}}) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`(function a({ hello: {var:var}}) { })`, String.raw`SyntaxError: Cannot use the keyword 'var' as a parameter name.`);
-testSyntaxError(String.raw`(function a({ hello: {var:v\u0061r}}) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a parameter name.`);
-testSyntaxError(String.raw`(function a({ hello: {var:v\u{0061}r}}) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a parameter name.`);
+testSyntaxError(String.raw`(function a({ hello: {var:v\u0061r}}) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`(function a({ hello: {var:v\u{0061}r}}) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`(function a({ hello: [var]}) { })`, String.raw`SyntaxError: Cannot use the keyword 'var' as a parameter name.`);
-testSyntaxError(String.raw`(function a({ hello: [v\u0061r]}) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a parameter name.`);
-testSyntaxError(String.raw`(function a({ hello: [v\u{0061}r]}) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a parameter name.`);
+testSyntaxError(String.raw`(function a({ hello: [v\u0061r]}) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`(function a({ hello: [v\u{0061}r]}) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`(function a({ 0: {var} }) { })`, String.raw`SyntaxError: Cannot use abbreviated destructuring syntax for keyword 'var'.`);
-testSyntaxError(String.raw`(function a({ 0: {v\u0061r}}) { })`, String.raw`SyntaxError: Cannot use abbreviated destructuring syntax for keyword 'var'.`);
-testSyntaxError(String.raw`(function a({ 0: {v\u{0061}r}}) { })`, String.raw`SyntaxError: Cannot use abbreviated destructuring syntax for keyword 'var'.`);
+testSyntaxError(String.raw`(function a({ 0: {v\u0061r}}) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`(function a({ 0: {v\u{0061}r}}) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`(function a({ 0: {var:var}}) { })`, String.raw`SyntaxError: Cannot use the keyword 'var' as a parameter name.`);
-testSyntaxError(String.raw`(function a({ 0: {var:v\u0061r}}) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a parameter name.`);
-testSyntaxError(String.raw`(function a({ 0: {var:v\u{0061}r}}) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a parameter name.`);
+testSyntaxError(String.raw`(function a({ 0: {var:v\u0061r}}) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`(function a({ 0: {var:v\u{0061}r}}) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`(function a({ 0: {value:var}}) { })`, String.raw`SyntaxError: Cannot use the keyword 'var' as a parameter name.`);
-testSyntaxError(String.raw`(function a({ 0: {value:v\u0061r}}) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a parameter name.`);
-testSyntaxError(String.raw`(function a({ 0: {value:v\u{0061}r}}) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a parameter name.`);
+testSyntaxError(String.raw`(function a({ 0: {value:v\u0061r}}) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`(function a({ 0: {value:v\u{0061}r}}) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`(function a({ 0: [var]}) { })`, String.raw`SyntaxError: Cannot use the keyword 'var' as a parameter name.`);
-testSyntaxError(String.raw`(function a({ 0: [v\u0061r]}) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a parameter name.`);
-testSyntaxError(String.raw`(function a({ 0: [v\u{0061}r]}) { })`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a parameter name.`);
+testSyntaxError(String.raw`(function a({ 0: [v\u0061r]}) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`(function a({ 0: [v\u{0061}r]}) { })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`try { } catch(var) { }`, String.raw`SyntaxError: Cannot use the keyword 'var' as a catch parameter name.`);
-testSyntaxError(String.raw`try { } catch(v\u0061r) { }`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a catch parameter name.`);
-testSyntaxError(String.raw`try { } catch(v\u{0061}r) { }`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a catch parameter name.`);
+testSyntaxError(String.raw`try { } catch(v\u0061r) { }`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`try { } catch(v\u{0061}r) { }`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
 testSyntaxError(String.raw`class var { }`, String.raw`SyntaxError: Cannot use the keyword 'var' as a class name.`);
-testSyntaxError(String.raw`class v\u0061r { }`, String.raw`SyntaxError: Cannot use the keyword 'v\u0061r' as a class name.`);
-testSyntaxError(String.raw`class v\u{0061}r { }`, String.raw`SyntaxError: Cannot use the keyword 'v\u{0061}r' as a class name.`);
+testSyntaxError(String.raw`class v\u0061r { }`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`class v\u{0061}r { }`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
 
-// Allowed in non-keyword aware context.
-testSyntax(String.raw`({ v\u0061r: 'Cocoa' })`);
-testSyntax(String.raw`({ v\u{0061}r: 'Cocoa' })`);
+testSyntaxError(String.raw`({ v\u0061r: 'Cocoa' })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u0061r'`);
+testSyntaxError(String.raw`({ v\u{0061}r: 'Cocoa' })`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'v\u{0061}r'`);
+
+testSyntaxError(String.raw`{for(o i\u006E {}){}}`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'i\u006E'`);
+testSyntaxError(String.raw`{for(o i\u{006E} {}){}}`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'i\u{006E}'`);
+
+
+testSyntaxError(String.raw`implements`, String.raw`ReferenceError: Can't find variable: implements`);
+testSyntaxError(String.raw`impleme\u006Ets`, String.raw`ReferenceError: Can't find variable: implements`);
+testSyntaxError(String.raw`impleme\u{006E}ts`, String.raw`ReferenceError: Can't find variable: implements`);
+
+testSyntaxError(String.raw`'use strict'; implements`, String.raw`SyntaxError: Unexpected use of reserved word 'implements' in strict mode`);
+testSyntaxError(String.raw`'use strict'; impleme\u006Ets`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'impleme\u006Ets'`);
+testSyntaxError(String.raw`'use strict'; impleme\u{006E}ts`, String.raw`SyntaxError: Unexpected escaped characters in keyword tocken: 'impleme\u{006E}ts'`);
index 4fb382b..1589433 100644 (file)
@@ -1,3 +1,21 @@
+2017-06-12  Oleksandr Skachkov  <gskachkov@gmail.com>
+
+        We incorrectly allow escaped characters in keyword tokens
+        https://bugs.webkit.org/show_bug.cgi?id=171310
+
+        Reviewed by Yusuke Suzuki.
+
+        According spec it is not allow to use escaped characters in 
+        keywords. https://tc39.github.io/ecma262/#sec-reserved-words
+        Current patch implements this requirements.
+
+
+        * parser/Lexer.cpp:
+        (JSC::Lexer<CharacterType>::parseIdentifierSlowCase):
+        * parser/Parser.cpp:
+        (JSC::Parser<LexerType>::printUnexpectedTokenText):
+        * parser/ParserTokens.h:
+
 2017-06-12  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         Unreviewed, add branch64(Cond, BaseIndex, RegisterID) for ARM64
index 7c5df41..ceb8f44 100644 (file)
@@ -1129,7 +1129,8 @@ template<typename CharacterType> template<bool shouldCreateIdentifier> JSTokenTy
         if (!entry)
             return IDENT;
         JSTokenType token = static_cast<JSTokenType>(entry->lexerValue());
-        return (token != RESERVED_IF_STRICT) || strictMode ? token : IDENT;
+        if ((token != RESERVED_IF_STRICT) || strictMode)
+            return bufferRequired ? UNEXPECTED_ESCAPE_ERRORTOK : token;
     }
 
     return IDENT;
index 645525b..90cfc81 100644 (file)
@@ -4797,6 +4797,9 @@ template <typename LexerType> void Parser<LexerType>::printUnexpectedTokenText(W
     case INVALID_IDENTIFIER_ESCAPE_ERRORTOK:
         out.print("Invalid escape in identifier: '", getToken(), "'");
         return;
+    case UNEXPECTED_ESCAPE_ERRORTOK:
+        out.print("Unexpected escaped characters in keyword tocken: '", getToken(), "'");
+        return;
     case INVALID_IDENTIFIER_UNICODE_ESCAPE_ERRORTOK:
         out.print("Invalid unicode escape in identifier: '", getToken(), "'");
         return;
index a0554ff..173d88f 100644 (file)
@@ -188,6 +188,7 @@ enum JSTokenType {
     UNTERMINATED_TEMPLATE_LITERAL_ERRORTOK = 13 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
     UNTERMINATED_REGEXP_LITERAL_ERRORTOK = 14 | ErrorTokenFlag | UnterminatedErrorTokenFlag,
     INVALID_TEMPLATE_LITERAL_ERRORTOK = 15 | ErrorTokenFlag,
+    UNEXPECTED_ESCAPE_ERRORTOK = 16 | ErrorTokenFlag,
 };
 
 struct JSTextPosition {