Prechádzať zdrojové kódy

Fix Issue #3039: Arrow function should terminate the expression unless followed by a comma

Curtis Man 8 rokov pred
rodič
commit
4180e437e5

+ 6 - 0
lib/Parser/Parse.cpp

@@ -8500,6 +8500,12 @@ ParseNodePtr Parser::ParseExpr(int oplMin,
                 pnode->sxFnc.cbMin = iecpMin;
                 pnode->ichMin = ichMin;
             }
+
+            // ArrowFunction/AsyncArrowFunction is part of AssignmentExpression, which should terminate the expression unless followed by a comma
+            if (m_token.tk != tkComma)
+            {
+                break;
+            }
         }
         else
         {

+ 4 - 0
test/es6/lambda-expr.baseline

@@ -0,0 +1,4 @@
+Expected ';'
+2
+3
+Expected ';'

+ 35 - 0
test/es6/lambda-expr.js

@@ -0,0 +1,35 @@
+//-------------------------------------------------------------------------------------------------------
+// Copyright (C) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
+//-------------------------------------------------------------------------------------------------------
+
+try
+{
+    // Illegal case, arrow function terminates the expression
+    eval("x=>{}/print(1)/+print(2)")
+}
+catch (e)
+{
+    print(e.message);
+}
+
+// Legal case, the line feed breaks the statement
+x=>{}
+/print(1)/+print(2)
+
+// Legal case, comma separate ExpressionStatement
+x=>{return 2;},y=>{return 3;}
+
+// Legal case, comma separate Expression (with paren)
+var a = (x=>{return 2;},y=>{return 3;})
+print(a())
+
+
+try
+{
+    eval("var a = x=>{return 2;},y=>{return 3;}");
+}
+catch (e)
+{
+    print(e.message);
+}

+ 6 - 0
test/es6/rlexe.xml

@@ -12,6 +12,12 @@
       <compile-flags>-off:deferparse -args summary -endargs</compile-flags>
     </default>
   </test>
+  <test>
+    <default>
+      <files>lambda-expr.js</files>
+      <baseline>lambda-expr.baseline</baseline>
+    </default>
+  </test>
   <test>
     <default>
       <files>lambda1.js</files>