From 7c1bb6392e908d860d4629881c99f6ab241ed9da Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Mon, 6 Nov 2023 15:15:00 -0800 Subject: [PATCH] Fix support for JS destructuring in acorn optimizer pass Fixes: #20631 --- test/optimizer/JSDCE-defaultArg-output.js | 6 ++++-- test/optimizer/JSDCE-defaultArg.js | 5 +++-- tools/acorn-optimizer.js | 16 ++++++++++++++++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/test/optimizer/JSDCE-defaultArg-output.js b/test/optimizer/JSDCE-defaultArg-output.js index c8e64b44e4e19..5216c9b3bbcb6 100644 --- a/test/optimizer/JSDCE-defaultArg-output.js +++ b/test/optimizer/JSDCE-defaultArg-output.js @@ -1,7 +1,9 @@ var usedAsDefaultArg = 42; -function g(a, b = usedAsDefaultArg) { - return a + b + 1; +var usedAsDefaultArg2 = [ 1, 2 ]; + +function g({notUsed: notUsed}, a, b = usedAsDefaultArg, [c, d] = usedAsDefaultArg2) { + return a + b + notUsed + 1; } Module["g"] = g; diff --git a/test/optimizer/JSDCE-defaultArg.js b/test/optimizer/JSDCE-defaultArg.js index 4ec7c74bab693..06a79b3f50a87 100644 --- a/test/optimizer/JSDCE-defaultArg.js +++ b/test/optimizer/JSDCE-defaultArg.js @@ -1,9 +1,10 @@ var usedAsDefaultArg = 42; +var usedAsDefaultArg2 = [1,2]; var notUsed = 43; // exported -function g(a, b = usedAsDefaultArg) { - return a+b+1; +function g({notUsed}, a, b = usedAsDefaultArg, [c, d] = usedAsDefaultArg2) { + return a+b+notUsed+1; } Module['g'] = g; diff --git a/tools/acorn-optimizer.js b/tools/acorn-optimizer.js index 2d97919f7959c..1858c627cd6df 100755 --- a/tools/acorn-optimizer.js +++ b/tools/acorn-optimizer.js @@ -379,6 +379,22 @@ function runJSDCE(ast, aggressive) { c(param.right); param = param.left; } + if (param.type === 'ArrayPattern') { + for (var elem of param.elements) { + const name = elem.name; + ensureData(scope, name).def = 1; + scope[name].param = 1; + } + return; + } + if (param.type === 'ObjectPattern') { + for (var prop of param.properties) { + const name = prop.key.name; + ensureData(scope, name).def = 1; + scope[name].param = 1; + } + return; + } assert(param.type === 'Identifier', param.type); const name = param.name; ensureData(scope, name).def = 1;