fix corner case in collapse_vars (#5397)

fixes #5396
This commit is contained in:
Alex Lam S.L
2022-03-31 13:02:56 +01:00
committed by GitHub
parent e3d328f741
commit fb5e08e4ec
2 changed files with 59 additions and 29 deletions

View File

@@ -3166,47 +3166,45 @@ Compressor.prototype.compress = function(node) {
return;
}
var end = hit_stack.length - 1;
if (hit_stack[end - 1].body === hit_stack[end]) end--;
var last = hit_stack[end];
if (last instanceof AST_VarDef || hit_stack[end - 1].body === last) 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) {
declare_only.set(node.name.name, (declare_only.get(node.name.name) || 0) + 1);
if (node instanceof AST_Definitions) {
declare_only.set(last.name.name, (declare_only.get(last.name.name) || 0) + 1);
if (value_def) value_def.replaced++;
node = node.clone();
node.value = null;
return value ? List.splice([ value, node ]) : node;
var defns = node.definitions;
var index = defns.indexOf(last);
var defn = last.clone();
defn.value = null;
if (!value) {
node = node.clone();
node.definitions = defns.slice();
node.definitions[index] = defn;
return node;
}
var body = [
make_node(AST_SimpleStatement, value, { body: value }),
node.clone(),
];
body[1].definitions = defns.slice(index);
body[1].definitions[0] = defn;
if (index > 0) {
node = node.clone();
node.definitions = defns.slice(0, index);
body.unshift(node);
}
return in_list ? List.splice(body) : make_node(AST_BlockStatement, node, { body: body });
}
if (!value) return in_list ? List.skip : null;
return is_statement(node) ? make_node(AST_SimpleStatement, value, { body: value }) : value;
}, function(node, in_list) {
if (node instanceof AST_Definitions) {
var body = [], defns = node.definitions;
for (var index = 0, pos = 0; index < defns.length; index++) {
var defn = defns[index];
if (defn instanceof AST_VarDef) continue;
flush();
pos = index + 1;
body.push(make_node(AST_SimpleStatement, defn, { body: defn }));
}
if (pos == 0) return;
flush();
if (body.length == 1) return body[0];
return in_list ? List.splice(body) : make_node(AST_BlockStatement, node, { body: body });
}
if (node instanceof AST_For) return patch_for_init(node, in_list);
return patch_sequence(node, this);
function flush() {
if (pos < index) {
var cropped = node.clone();
cropped.definitions = defns.slice(pos, index);
body.push(cropped);
}
}
return patch_sequence(node, tt);
});
abort = false;
hit = false;

View File

@@ -9947,3 +9947,35 @@ issue_5394: {
}
expect_stdout: "object"
}
issue_5396: {
options = {
collapse_vars: true,
merge_vars: true,
reduce_vars: true,
side_effects: true,
unused: true,
}
input: {
var a, b;
function f() {}
b = 0;
new function g(c) {
var d = a && g(e), e = ++d, i = [ 42 ];
for (var j in i)
console.log("PASS"),
i;
}();
}
expect: {
var a, b;
function f() {}
b = 0;
(function g(c) {
a && g();
for (var j in [ 42 ])
console.log("PASS");
})();
}
expect_stdout: "PASS"
}