[Pkg-javascript-commits] [node-acorn-jsx] 208/484: Checking argument names clash in strict mode for arrow functions. Some more testFail message fixes.

Bastien Roucariès rouca at moszumanska.debian.org
Sat Aug 19 14:20:29 UTC 2017


This is an automated email from the git hooks/post-receive script.

rouca pushed a commit to branch master
in repository node-acorn-jsx.

commit 2db14fbb08ce12f57b7ed92c6c3d70e68d0c52ab
Author: Ingvar Stepanyan <me at rreverser.com>
Date:   Thu Jul 24 02:51:37 2014 +0300

    Checking argument names clash in strict mode for arrow functions.
    Some more testFail message fixes.
---
 acorn.js              | 79 ++++++++++++++++++++++++++++-----------------------
 test/tests-harmony.js | 28 +++++++++---------
 2 files changed, 57 insertions(+), 50 deletions(-)

diff --git a/acorn.js b/acorn.js
index 43500b6..556ab0e 100644
--- a/acorn.js
+++ b/acorn.js
@@ -1810,7 +1810,6 @@
       node.defaults = [];
       node.rest = null;
       node.generator = false;
-      node.expression = false;
     }
     expect(_parenL);
     for (;;) {
@@ -1828,36 +1827,7 @@
         }
       }
     }
-
-    // Start a new scope with regard to labels and the `inFunction`
-    // flag (restore them to their old value afterwards).
-    var oldInFunc = inFunction, oldLabels = labels;
-    inFunction = true; labels = [];
-    node.body = parseBlock(true);
-    inFunction = oldInFunc; labels = oldLabels;
-
-    // If this is a strict mode function, verify that argument names
-    // are not repeated, and it does not try to bind the words `eval`
-    // or `arguments`.
-    if (strict || node.body.body.length && isUseStrict(node.body.body[0])) {
-      // Negative indices are used to reuse loop body for node.rest and node.id
-      for (var i = -2, id; i < node.params.length; ++i) {
-        if (i >= 0) {
-          id = node.params[i];
-        } else if (i == -2) {
-          if (node.rest) id = node.rest;
-          else continue;
-        } else {
-          if (node.id) id = node.id;
-          else continue;
-        }
-        if (isStrictReservedWord(id.name) || isStrictBadIdWord(id.name))
-          raise(id.start, "Defining '" + id.name + "' in strict mode");
-        if (i >= 0) for (var j = 0; j < i; ++j) if (id.name === node.params[j].name)
-          raise(id.start, "Argument name clash in strict mode");
-      }
-    }
-
+    parseFunctionBody(node);
     return finishNode(node, isStatement ? "FunctionDeclaration" : "FunctionExpression");
   }
 
@@ -1885,19 +1855,56 @@
         }
     }
 
-    var isExpression = tokType !== _braceL;
-    var body = isExpression ? parseExpression(true) : parseBlock(true);
-
     node.id = null;
     node.params = params;
     node.defaults = hasDefaults ? defaults : [];
     node.rest = null;
-    node.body = body;
     node.generator = false;
-    node.expression = isExpression;
+    parseFunctionBody(node, true);
     return finishNode(node, "ArrowFunctionExpression");
   }
 
+  // Parse function body and check parameters.
+
+  function parseFunctionBody(node, allowExpression) {
+    var isExpression = allowExpression && tokType !== _braceL;
+    
+    if (isExpression) {
+      node.body = parseExpression(true);
+      node.expression = true;
+    } else {
+      // Start a new scope with regard to labels and the `inFunction`
+      // flag (restore them to their old value afterwards).
+      var oldInFunc = inFunction, oldLabels = labels;
+      inFunction = true; labels = [];
+      node.body = parseBlock(true);
+      node.expression = false;
+      inFunction = oldInFunc; labels = oldLabels;
+    }
+
+    // If this is a strict mode function, verify that argument names
+    // are not repeated, and it does not try to bind the words `eval`
+    // or `arguments`.
+    if (strict || !isExpression && node.body.body.length && isUseStrict(node.body.body[0])) {
+      // Negative indices are used to reuse loop body for node.rest and node.id
+      for (var i = -2, id; i < node.params.length; ++i) {
+        if (i >= 0) {
+          id = node.params[i];
+        } else if (i == -2) {
+          if (node.rest) id = node.rest;
+          else continue;
+        } else {
+          if (node.id) id = node.id;
+          else continue;
+        }
+        if (isStrictReservedWord(id.name) || isStrictBadIdWord(id.name))
+          raise(id.start, "Defining '" + id.name + "' in strict mode");
+        if (i >= 0) for (var j = 0; j < i; ++j) if (id.name === node.params[j].name)
+          raise(id.start, "Argument name clash in strict mode");
+      }
+    }
+  }
+
   // Parses a comma-separated list of expressions, and returns them as
   // an array. `close` is the token type that ends the list, and
   // `allowEmpty` can be turned on to allow subsequent commas with
diff --git a/test/tests-harmony.js b/test/tests-harmony.js
index 05d5097..95905f1 100644
--- a/test/tests-harmony.js
+++ b/test/tests-harmony.js
@@ -15817,33 +15817,33 @@ testFail("((a)) => 42", "Unexpected token (1:7)", {ecmaVersion: 6});
 
 testFail("(a, (b)) => 42", "Unexpected token (1:10)", {ecmaVersion: 6});
 
-testFail("\"use strict\"; (eval = 10) => 42", "Unexpected token (1:16)", {ecmaVersion: 6});
+testFail("\"use strict\"; (eval = 10) => 42", "Assigning to eval in strict mode (1:15)", {ecmaVersion: 6});
 
-testFail("\"use strict\"; eval => 42", "Unexpected token (1:25)", {ecmaVersion: 6});
+testFail("\"use strict\"; eval => 42", "Defining 'eval' in strict mode (1:14)", {ecmaVersion: 6});
 
-testFail("\"use strict\"; arguments => 42", "Unexpected token (1:30)", {ecmaVersion: 6});
+testFail("\"use strict\"; arguments => 42", "Defining 'arguments' in strict mode (1:14)", {ecmaVersion: 6});
 
-testFail("\"use strict\"; (eval, a) => 42", "Unexpected token (1:30)", {ecmaVersion: 6});
+testFail("\"use strict\"; (eval, a) => 42", "Defining 'eval' in strict mode (1:15)", {ecmaVersion: 6});
 
-testFail("\"use strict\"; (arguments, a) => 42", "Unexpected token (1:35)", {ecmaVersion: 6});
+testFail("\"use strict\"; (arguments, a) => 42", "Defining 'arguments' in strict mode (1:15)", {ecmaVersion: 6});
 
-testFail("\"use strict\"; (eval, a = 10) => 42", "Unexpected token (1:35)", {ecmaVersion: 6});
+testFail("\"use strict\"; (eval, a = 10) => 42", "Defining 'eval' in strict mode (1:15)", {ecmaVersion: 6});
 
 testFail("(a, a) => 42", "Unexpected token (1:7)", {ecmaVersion: 6});
 
-testFail("\"use strict\"; (a, a) => 42", "Unexpected token (1:21)", {ecmaVersion: 6});
+testFail("\"use strict\"; (a, a) => 42", "Argument name clash in strict mode (1:18)", {ecmaVersion: 6});
 
-testFail("\"use strict\"; (a) => 00", "Unexpected token (1:22)", {ecmaVersion: 6});
+testFail("\"use strict\"; (a) => 00", "Invalid number (1:21)", {ecmaVersion: 6});
 
 testFail("() <= 42", "Unexpected token (1:4)", {ecmaVersion: 6});
 
-testFail("(10) => 00", "Unexpected token (1:6)", {ecmaVersion: 6});
+testFail("(10) => 00", "Unexpected token (1:1)", {ecmaVersion: 6});
 
-testFail("(10, 20) => 00", "Unexpected token (1:10)", {ecmaVersion: 6});
+testFail("(10, 20) => 00", "Unexpected token (1:1)", {ecmaVersion: 6});
 
-testFail("yield v", "Unexpected token (1:7)", {ecmaVersion: 6});
+testFail("yield v", "Unexpected token (1:6)", {ecmaVersion: 6});
 
-testFail("yield 10", "Unexpected token (1:7)", {ecmaVersion: 6});
+testFail("yield 10", "Unexpected token (1:6)", {ecmaVersion: 6});
 
 test("yield* 10", {
   type: "Program",
@@ -16126,8 +16126,8 @@ testFail("module \"Universe\" { ;  ;  ", "Unexpected token (1:27)", {ecmaVersion
 
 testFail("switch (cond) { case 10: let a = 20; ", "Unexpected token (1:37)", {ecmaVersion: 6});
 
-testFail("\"use strict\"; (eval) => 42", "Unexpected token (1:27)", {ecmaVersion: 6});
+testFail("\"use strict\"; (eval) => 42", "Defining 'eval' in strict mode (1:15)", {ecmaVersion: 6});
 
-testFail("(eval) => { \"use strict\"; 42 }", "Unexpected token (1:31)", {ecmaVersion: 6});
+testFail("(eval) => { \"use strict\"; 42 }", "Defining 'eval' in strict mode (1:1)", {ecmaVersion: 6});
 
 testFail("({ get test() { } }) => 42", "Unexpected token (1:21)", {ecmaVersion: 6});

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/node-acorn-jsx.git



More information about the Pkg-javascript-commits mailing list