fix corner case in hoist_props (#3412)

fixes #3411
This commit is contained in:
Alex Lam S.L
2019-05-14 19:12:00 +08:00
committed by GitHub
parent d538a73250
commit f87caac9d8
2 changed files with 35 additions and 1 deletions

View File

@@ -519,7 +519,7 @@ merge(Compressor.prototype, {
if (parent instanceof AST_Call && node === parent.expression) return; if (parent instanceof AST_Call && node === parent.expression) return;
if (parent instanceof AST_Sequence && node !== parent.tail_node()) return; if (parent instanceof AST_Sequence && node !== parent.tail_node()) return;
if (parent instanceof AST_SimpleStatement) return; if (parent instanceof AST_SimpleStatement) return;
if (parent instanceof AST_Unary) return; if (parent instanceof AST_Unary && !unary_side_effects[parent.operator]) return;
d.direct_access = true; d.direct_access = true;
} }
@@ -4067,6 +4067,16 @@ merge(Compressor.prototype, {
})); }));
return make_sequence(node, assignments); return make_sequence(node, assignments);
} }
if (node instanceof AST_Unary
&& !unary_side_effects[node.operator]
&& node.expression instanceof AST_SymbolRef
&& node.expression.definition().id in defs_by_id) {
node = node.clone();
node.expression = make_node(AST_Object, node, {
properties: []
});
return node;
}
if (node instanceof AST_VarDef && can_hoist(node.name, node.value, 0)) { if (node instanceof AST_VarDef && can_hoist(node.name, node.value, 0)) {
descend(node, this); descend(node, this);
var defs = new Dictionary(); var defs = new Dictionary();

View File

@@ -862,3 +862,27 @@ issue_3071_3: {
} }
expect_stdout: "2" expect_stdout: "2"
} }
issue_3411: {
options = {
hoist_props: true,
reduce_vars: true,
}
input: {
var c = 1;
!function f() {
var o = {
p: --c && f()
};
+o || console.log("PASS");
}();
}
expect: {
var c = 1;
!function f() {
var o_p = --c && f();
+{} || console.log("PASS");
}();
}
expect_stdout: "PASS"
}