fix corner case in reduce_vars (#4585)

fixes #4584
This commit is contained in:
Alex Lam S.L
2021-01-23 19:37:52 +00:00
committed by GitHub
parent f87e7be12c
commit acc443b2cf
3 changed files with 45 additions and 9 deletions

View File

@@ -786,7 +786,10 @@ merge(Compressor.prototype, {
}
var d = sym.definition();
d.assignments++;
if (fixed && !is_modified(compressor, tw, node, node.right, 0) && safe_to_assign(tw, d)) {
if (fixed
&& !is_modified(compressor, tw, node, node.right, 0)
&& !sym.in_arg
&& safe_to_assign(tw, d)) {
push_ref(d, sym);
mark(tw, d);
if (d.single_use && left instanceof AST_Destructured) d.single_use = false;
@@ -809,7 +812,7 @@ merge(Compressor.prototype, {
}
var safe = safe_to_read(tw, d);
node.right.walk(tw);
if (safe && safe_to_assign(tw, d)) {
if (safe && !left.in_arg && safe_to_assign(tw, d)) {
push_ref(d, left);
mark(tw, d);
if (d.single_use) d.single_use = false;
@@ -1117,7 +1120,7 @@ merge(Compressor.prototype, {
var d = exp.definition();
d.assignments++;
var fixed = d.fixed;
if (safe_to_read(tw, d) && safe_to_assign(tw, d)) {
if (safe_to_read(tw, d) && !exp.in_arg && safe_to_assign(tw, d)) {
push_ref(d, exp);
mark(tw, d);
if (d.single_use) d.single_use = false;

View File

@@ -2487,3 +2487,30 @@ issue_4554: {
expect_stdout: "PASS"
node_version: ">=6"
}
issue_4584: {
options = {
evaluate: true,
reduce_vars: true,
}
input: {
try {
(function f({
[console.log(a = "FAIL")]: a,
}) {})(0);
} catch (e) {
console.log("PASS");
}
}
expect: {
try {
(function f({
[console.log(a = "FAIL")]: a,
}) {})(0);
} catch (e) {
console.log("PASS");
}
}
expect_stdout: "PASS"
node_version: ">=6"
}

View File

@@ -431,12 +431,18 @@ function createAssignmentPairs(recurmax, stmtDepth, canThrow, nameLenBefore, was
unique_vars.length = len;
return pairs;
function mapShuffled(array, fn) {
var result = [];
for (var i = array.length; --i >= 0;) {
result.splice(rng(result.length + 1), 0, fn(array[i], i));
}
return result;
function mapShuffled(values, fn) {
var ordered = [];
var shuffled = [];
values.forEach(function(value, index) {
value = fn(value, index);
if (/]:/.test(value) ? canThrow && rng(10) == 0 : rng(5)) {
shuffled.splice(rng(shuffled.length + 1), 0, value);
} else {
ordered.push(value);
}
});
return shuffled.concat(ordered);
}
function convertToRest(names) {