Skip to content

Commit

Permalink
fix corner case in collapse_vars (#3892)
Browse files Browse the repository at this point in the history
fixes #3891
  • Loading branch information
alexlamsl committed May 12, 2020
1 parent 8024f7f commit 76f40e2
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 12 deletions.
30 changes: 18 additions & 12 deletions lib/compress.js
Expand Up @@ -1200,7 +1200,7 @@ merge(Compressor.prototype, {
if (!hit) {
if (node !== hit_stack[hit_index]) return node;
hit_index++;
if (hit_index < hit_stack.length) return handle_custom_scan_order(node);
if (hit_index < hit_stack.length) return handle_custom_scan_order(node, scanner);
hit = true;
stop_after = (value_def ? find_stop_value : find_stop)(node, 0);
if (stop_after === node) abort = true;
Expand Down Expand Up @@ -1279,7 +1279,7 @@ merge(Compressor.prototype, {
can_replace = replace;
return node;
}
return handle_custom_scan_order(node);
return handle_custom_scan_order(node, scanner);
}, function(node) {
if (abort) return;
if (stop_after === node) abort = true;
Expand Down Expand Up @@ -1398,20 +1398,20 @@ merge(Compressor.prototype, {
}
}

function handle_custom_scan_order(node) {
function handle_custom_scan_order(node, tt) {
// Skip (non-executed) functions
if (node instanceof AST_Scope) return node;
// Scan case expressions first in a switch statement
if (node instanceof AST_Switch) {
node.expression = node.expression.transform(scanner);
node.expression = node.expression.transform(tt);
for (var i = 0; !abort && i < node.body.length; i++) {
var branch = node.body[i];
if (branch instanceof AST_Case) {
if (!hit) {
if (branch !== hit_stack[hit_index]) continue;
hit_index++;
}
branch.expression = branch.expression.transform(scanner);
branch.expression = branch.expression.transform(tt);
if (!replace_all) break;
scan_rhs = false;
}
Expand Down Expand Up @@ -1930,20 +1930,26 @@ merge(Compressor.prototype, {
});
return true;
}
var found = false;
return statements[stat_index].transform(new TreeTransformer(function(node, descend, in_list) {
if (found) return node;
if (node instanceof AST_Scope) return node;
if (node !== expr && node.body !== expr) return;
found = true;
var end = hit_stack.length - 1;
if (hit_stack[end - 1].body === hit_stack[end]) end--;
var tt = new TreeTransformer(function(node, descend, in_list) {
if (hit) return node;
if (node !== hit_stack[hit_index]) return node;
hit_index++;
if (hit_index <= end) return handle_custom_scan_order(node, tt);
hit = true;
if (node instanceof AST_VarDef) {
node.value = null;
declare_only[node.name.name] = (declare_only[node.name.name] || 0) + 1;
if (value_def) value_def.replaced++;
return node;
}
return in_list ? List.skip : null;
}, patch_sequence));
}, patch_sequence);
abort = false;
hit = false;
hit_index = 0;
return statements[stat_index].transform(tt);
}

function patch_sequence(node) {
Expand Down
36 changes: 36 additions & 0 deletions test/compress/collapse_vars.js
Expand Up @@ -7979,3 +7979,39 @@ issue_3884: {
}
expect_stdout: "101 32"
}

issue_3891: {
options = {
collapse_vars: true,
passes: 2,
reduce_vars: true,
side_effects: true,
unused: true,
}
input: {
function log(a) {
console.log(typeof a);
}
log(function f() {
try {
do {
var b = function() {}();
} while (f = 0, b.p);
} catch (e) {
var f;
b;
}
});
}
expect: {
function log(a) {
console.log(typeof a);
}
log(function() {
try {
do {} while ((void 0).p);
} catch (e) {}
});
}
expect_stdout: "function"
}

0 comments on commit 76f40e2

Please sign in to comment.