fix variable substitution (#1816)

- let `collapse_vars` take care of value containing any symbols
- improve overhead accounting
This commit is contained in:
Alex Lam S.L
2017-04-16 17:25:39 +08:00
committed by alexlamsl
parent 04b8964505
commit 43ad4e9775
3 changed files with 87 additions and 9 deletions

View File

@@ -3595,7 +3595,9 @@ merge(Compressor.prototype, {
return make_node(AST_Infinity, self).optimize(compressor); return make_node(AST_Infinity, self).optimize(compressor);
} }
} }
if (compressor.option("evaluate") && compressor.option("reduce_vars")) { if (compressor.option("evaluate")
&& compressor.option("reduce_vars")
&& is_lhs(self, compressor.parent()) !== self) {
var d = self.definition(); var d = self.definition();
var fixed = self.fixed_value(); var fixed = self.fixed_value();
if (fixed) { if (fixed) {
@@ -3603,21 +3605,45 @@ merge(Compressor.prototype, {
var init = fixed.evaluate(compressor); var init = fixed.evaluate(compressor);
if (init !== fixed) { if (init !== fixed) {
init = make_node_from_constant(init, fixed); init = make_node_from_constant(init, fixed);
var value = best_of_expression(init.optimize(compressor), fixed).print_to_string().length; var value = init.optimize(compressor).print_to_string().length;
var fn;
if (has_symbol_ref(fixed)) {
fn = function() {
var result = init.optimize(compressor);
return result === init ? result.clone(true) : result;
};
} else {
value = Math.min(value, fixed.print_to_string().length);
fn = function() {
var result = best_of_expression(init.optimize(compressor), fixed);
return result === init || result === fixed ? result.clone(true) : result;
};
}
var name = d.name.length; var name = d.name.length;
var freq = d.references.length; var overhead = 0;
var overhead = d.global || !freq ? 0 : (name + 2 + value) / freq; if (compressor.option("unused") && (!d.global || compressor.option("toplevel"))) {
d.should_replace = value <= name + overhead ? init : false; overhead = (name + 2 + value) / d.references.length;
}
d.should_replace = value <= name + overhead ? fn : false;
} else { } else {
d.should_replace = false; d.should_replace = false;
} }
} }
if (d.should_replace) { if (d.should_replace) {
return best_of_expression(d.should_replace.optimize(compressor), fixed).clone(true); return d.should_replace();
} }
} }
} }
return self; return self;
function has_symbol_ref(value) {
var found;
value.walk(new TreeWalker(function(node) {
if (node instanceof AST_SymbolRef) found = true;
if (found) return true;
}));
return found;
}
}); });
function is_atomic(lhs, self) { function is_atomic(lhs, self) {

View File

@@ -35,11 +35,11 @@ f7: {
console.log(a, b); console.log(a, b);
} }
expect_exact: [ expect_exact: [
"var a = 100, b = 10;", "var b = 10;",
"", "",
"!function() {", "!function() {",
" for (;b = a, !1; ) ;", " for (;b = 100, !1; ) ;",
"}(), console.log(a, b);", "}(), console.log(100, b);",
] ]
expect_stdout: true expect_stdout: true
} }

View File

@@ -1995,3 +1995,55 @@ catch_var: {
} }
expect_stdout: "true" expect_stdout: "true"
} }
issue_1814_1: {
options = {
evaluate: true,
reduce_vars: true,
unused: true,
}
input: {
const a = 42;
!function() {
var b = a;
!function(a) {
console.log(a++, b);
}(0);
}();
}
expect: {
const a = 42;
!function() {
!function(a) {
console.log(a++, 42);
}(0);
}();
}
expect_stdout: "0 42"
}
issue_1814_2: {
options = {
evaluate: true,
reduce_vars: true,
unused: true,
}
input: {
const a = "32";
!function() {
var b = a + 1;
!function(a) {
console.log(a++, b);
}(0);
}();
}
expect: {
const a = "32";
!function() {
!function(a) {
console.log(a++, "321");
}(0);
}();
}
expect_stdout: "0 '321'"
}