\n\r is not the same as \r\n.
authormark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 7 Jul 2017 19:50:00 +0000 (19:50 +0000)
committermark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 7 Jul 2017 19:50:00 +0000 (19:50 +0000)
https://bugs.webkit.org/show_bug.cgi?id=173053

Reviewed by Keith Miller.

JSTests:

* stress/regress-173053.js: Added.
* stress/template-literal-line-terminators.js:

Source/JavaScriptCore:

* parser/Lexer.cpp:
(JSC::Lexer<T>::shiftLineTerminator):
(JSC::LineNumberAdder::add):

LayoutTests:

* js/parse-backslash-before-newline-expected.txt:
* js/script-tests/parse-backslash-before-newline.js:

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

JSTests/ChangeLog
JSTests/stress/regress-173053.js [new file with mode: 0644]
JSTests/stress/template-literal-line-terminators.js
LayoutTests/ChangeLog
LayoutTests/js/parse-backslash-before-newline-expected.txt
LayoutTests/js/script-tests/parse-backslash-before-newline.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/parser/Lexer.cpp

index 5699dbe..db2237e 100644 (file)
@@ -1,3 +1,13 @@
+2017-07-07  Mark Lam  <mark.lam@apple.com>
+
+        \n\r is not the same as \r\n.
+        https://bugs.webkit.org/show_bug.cgi?id=173053
+
+        Reviewed by Keith Miller.
+
+        * stress/regress-173053.js: Added.
+        * stress/template-literal-line-terminators.js:
+
 2017-07-06  Saam Barati  <sbarati@apple.com>
 
         We are missing places where we invalidate the for-in context
diff --git a/JSTests/stress/regress-173053.js b/JSTests/stress/regress-173053.js
new file mode 100644 (file)
index 0000000..2dae670
--- /dev/null
@@ -0,0 +1,19 @@
+var exception;
+
+try {
+    eval("'\\\r\n'");
+} catch (e) {
+    exception = e;
+}
+
+if (exception)
+    throw "FAILED: \\r\\n should be handled as a line terminator";
+
+try {
+    eval("'\\\n\r'");
+} catch (e) {
+    exception = e;
+}
+
+if (exception != "SyntaxError: Unexpected EOF")
+    throw "FAILED: \\n\\r should NOT be handled as a line terminator.  Expected exception: 'SyntaxError: Unexpected EOF', actual: '" + exception + "'";
index 019a1f9..c4ee4a4 100644 (file)
@@ -1,7 +1,7 @@
 
 function test(actual, expected) {
     if (actual !== expected)
-        throw new Error("bad value: " + actual);
+        throw new Error("bad value: actual: " + actual + ", expected: " + expected);
 }
 
 function testEval(script, expected) {
@@ -36,20 +36,20 @@ testEvalLineNumber("`Hello\nWorld`", "Hello\nWorld", 2);
 testEvalLineNumber("`Hello\r\rWorld`", "Hello\n\nWorld", 3);
 testEvalLineNumber("`Hello\r\nWorld`", "Hello\nWorld", 2);
 testEvalLineNumber("`Hello\n\nWorld`", "Hello\n\nWorld", 3);
-testEvalLineNumber("`Hello\n\rWorld`", "Hello\n\nWorld", 2);
+testEvalLineNumber("`Hello\n\rWorld`", "Hello\n\nWorld", 3);
 
 testEvalLineNumber("`Hello\n\r\nWorld`", "Hello\n\nWorld", 3);
 testEvalLineNumber("`Hello\r\n\rWorld`", "Hello\n\nWorld", 3);
 testEvalLineNumber("`Hello\n\n\nWorld`", "Hello\n\n\nWorld", 4);
 
-testEvalLineNumber("`Hello\n\r\n\rWorld`", "Hello\n\n\nWorld", 3);
+testEvalLineNumber("`Hello\n\r\n\rWorld`", "Hello\n\n\nWorld", 4);
 testEvalLineNumber("`Hello\n\r\n\nWorld`", "Hello\n\n\nWorld", 4);
 testEvalLineNumber("`Hello\r\n\n\nWorld`", "Hello\n\n\nWorld", 4);
 
-testEvalLineNumber("`Hello\\\n\r\rWorld`", "Hello\n\nWorld", 3);
+testEvalLineNumber("`Hello\\\n\r\rWorld`", "Hello\n\nWorld", 4);
 testEvalLineNumber("`Hello\\\r\n\n\nWorld`", "Hello\n\nWorld", 4);
 testEvalLineNumber("`Hello\\\n\r\n\nWorld`", "Hello\n\nWorld", 4);
-testEvalLineNumber("`Hello\\\n\r\r\nWorld`", "Hello\n\nWorld", 3);
+testEvalLineNumber("`Hello\\\n\r\r\nWorld`", "Hello\n\nWorld", 4);
 
 testEvalLineNumber("`\u2028`", "\u2028", 2);
 testEvalLineNumber("`\u2029`", "\u2029", 2);
index 69c4fe8..90f32b7 100644 (file)
@@ -1,3 +1,13 @@
+2017-07-07  Mark Lam  <mark.lam@apple.com>
+
+        \n\r is not the same as \r\n.
+        https://bugs.webkit.org/show_bug.cgi?id=173053
+
+        Reviewed by Keith Miller.
+
+        * js/parse-backslash-before-newline-expected.txt:
+        * js/script-tests/parse-backslash-before-newline.js:
+
 2017-07-07  Matt Lewis  <jlewis3@apple.com>
 
         Unreviewed, rolling out r219256.
index 27de349..d576857 100644 (file)
@@ -1,5 +1,6 @@
 PASS "teststring with CR LF" is "teststring with CR LF"
-PASS "teststring with LF CR" is "teststring with LF CR"
+PASS "test
+string with LF CR" threw exception SyntaxError: Unexpected EOF.
 PASS "teststring with CR" is "teststring with CR"
 PASS "teststring with LF" is "teststring with LF"
 PASS successfullyParsed is true
index 9577f90..70bd78e 100644 (file)
@@ -1,8 +1,8 @@
 shouldBe('"test\\r
 string with CR LF"', '"teststring with CR LF"');
 
-shouldBe('"test\
-\rstring with LF CR"', '"teststring with LF CR"');
+shouldThrow(`"test\
+\rstring with LF CR"`, '"SyntaxError: Unexpected EOF"');
 
 shouldBe('"test\\rstring with CR"', '"teststring with CR"');
 
index a2e1d34..e9c31a5 100644 (file)
@@ -1,3 +1,14 @@
+2017-07-07  Mark Lam  <mark.lam@apple.com>
+
+        \n\r is not the same as \r\n.
+        https://bugs.webkit.org/show_bug.cgi?id=173053
+
+        Reviewed by Keith Miller.
+
+        * parser/Lexer.cpp:
+        (JSC::Lexer<T>::shiftLineTerminator):
+        (JSC::LineNumberAdder::add):
+
 2017-07-07  Commit Queue  <commit-queue@webkit.org>
 
         Unreviewed, rolling out r219238, r219239, and r219241.
index abfe7f9..4e01f0a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
- *  Copyright (C) 2006-2009, 2011-2013, 2016 Apple Inc. All Rights Reserved.
+ *  Copyright (C) 2006-2017 Apple Inc. All Rights Reserved.
  *  Copyright (C) 2007 Cameron Zwarich (cwzwarich@uwaterloo.ca)
  *  Copyright (C) 2010 Zoltan Herczeg (zherczeg@inf.u-szeged.hu)
  *  Copyright (C) 2012 Mathias Bynens (mathias@qiwi.be)
@@ -705,8 +705,7 @@ void Lexer<T>::shiftLineTerminator()
     T prev = m_current;
     shift();
 
-    // Allow both CRLF and LFCR.
-    if (prev + m_current == '\n' + '\r')
+    if (prev == '\r' && m_current == '\n')
         shift();
 
     ++m_lineNumber;
@@ -1411,7 +1410,7 @@ public:
     void add(CharacterType character)
     {
         ASSERT(Lexer<CharacterType>::isLineTerminator(character));
-        if ((character + m_previous) == ('\n' + '\r'))
+        if (m_previous == '\r' && character == '\n')
             m_previous = 0;
         else {
             ++m_lineNumber;