diff --git a/test/optimizer/JSDCE-objectPattern-output.js b/test/optimizer/JSDCE-objectPattern-output.js index fb6ecf8ad91e5..42e4892c4ce80 100644 --- a/test/optimizer/JSDCE-objectPattern-output.js +++ b/test/optimizer/JSDCE-objectPattern-output.js @@ -5,6 +5,7 @@ let z = 50; globalThis.f = function(r) { let {a: a, b: b} = r; let {z: c} = r; + let [i, {foo: p, bar: q}] = r; return g(a, b, c, d, z); }; diff --git a/test/optimizer/JSDCE-objectPattern.js b/test/optimizer/JSDCE-objectPattern.js index 61ff3763818ba..3b7899f4cc419 100644 --- a/test/optimizer/JSDCE-objectPattern.js +++ b/test/optimizer/JSDCE-objectPattern.js @@ -13,6 +13,7 @@ let z = 50; globalThis.f = function(r) { let { a, b } = r; let { z: c } = r; + let [i, {foo : p, bar : q}] = r; return g(a, b, c, d, z); }; diff --git a/tools/acorn-optimizer.js b/tools/acorn-optimizer.js index c326fcdbb74c0..b9503da204df6 100755 --- a/tools/acorn-optimizer.js +++ b/tools/acorn-optimizer.js @@ -424,25 +424,22 @@ function runJSDCE(ast, aggressive) { recursiveWalk(ast, { VariableDeclarator(node, c) { - const id = node.id; - if (id.type === 'ObjectPattern') { - id.properties.forEach((node) => { - const value = node.value; - assert(value.type === 'Identifier'); - const name = value.name; - ensureData(scopes[scopes.length - 1], name).def = 1; - }); - } else if (id.type === 'ArrayPattern') { - id.elements.forEach((node) => { - assertAt(node.type === 'Identifier', node.start, "expected Indentifier but found " + node.type); - const name = node.name; + function traverse(id) { + if (id.type === 'ObjectPattern') { + for (const prop of id.properties) { + traverse(prop.value); + } + } else if (id.type === 'ArrayPattern') { + for (const elem of id.elements) { + traverse(elem) + } + } else { + assertAt(id.type === 'Identifier', id.start); + const name = id.name; ensureData(scopes[scopes.length - 1], name).def = 1; - }); - } else { - assertAt(id.type === 'Identifier', id.start); - const name = id.name; - ensureData(scopes[scopes.length - 1], name).def = 1; + } } + traverse(node.id); if (node.init) c(node.init); }, ObjectExpression(node, c) {