From eb22974326bbdd96e6bb78bd7312fef7dbce6523 Mon Sep 17 00:00:00 2001 From: "hannes%helma.at" Date: Mon, 11 May 2009 10:02:15 +0000 Subject: [PATCH] Commit patch for bug 436731 - multiple destructuring forms in function param list git-svn-id: svn://10.0.0.236/trunk@257154 18797224-902f-48f8-a5cc-f745e15eee43 --- .../src/org/mozilla/javascript/Parser.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/mozilla/js/rhino/src/org/mozilla/javascript/Parser.java b/mozilla/js/rhino/src/org/mozilla/javascript/Parser.java index 35500bbfc2a..b11842ec8f9 100644 --- a/mozilla/js/rhino/src/org/mozilla/javascript/Parser.java +++ b/mozilla/js/rhino/src/org/mozilla/javascript/Parser.java @@ -626,7 +626,7 @@ public class Parser } // Would prefer not to call createDestructuringAssignment until codegen, // but the symbol definitions have to happen now, before body is parsed. - Node destructuring = null; + Map destructuring = null; do { int tt = peekToken(); if (tt == Token.LB || tt == Token.LC) { @@ -637,14 +637,11 @@ public class Parser // parameter name, and add a statement to the body to initialize // variables from the destructuring assignment if (destructuring == null) { - destructuring = new Node(Token.COMMA); + destructuring = new HashMap(); } String pname = currentScriptOrFn.getNextTempName(); defineSymbol(Token.LP, pname, false); - Node nameNode = createName(pname); - Node assign = createDestructuringAssignment(Token.VAR, - expr, nameNode); - destructuring.addChildToBack(assign); + destructuring.put(pname, expr); } else { if (mustMatchToken(Token.NAME, "msg.no.parm")) { fnNode.addParam(createNameNode()); @@ -656,7 +653,15 @@ public class Parser } while (matchToken(Token.COMMA)); if (destructuring != null) { - fnNode.putProp(Node.DESTRUCTURING_PARAMS, destructuring); + Node destructuringNode = new Node(Token.COMMA); + // Add assignment helper for each destructuring parameter + for (Map.Entry param: destructuring.entrySet()) { + Node assign = createDestructuringAssignment(Token.VAR, + param.getValue(), createName(param.getKey())); + destructuringNode.addChildToBack(assign); + + } + fnNode.putProp(Node.DESTRUCTURING_PARAMS, destructuringNode); } if (mustMatchToken(Token.RP, "msg.no.paren.after.parms")) {