suppress function substitution across loops

This commit is contained in:
alexlamsl 2017-11-07 23:13:28 +08:00
parent 012046b8b1
commit ed115afb03
2 changed files with 81 additions and 8 deletions

View File

@ -324,7 +324,6 @@ merge(Compressor.prototype, {
|| value.is_constant_expression(node.scope);
} else {
d.single_use = d.scope === node.scope
&& loop_ids[d.id] === in_loop
&& value.is_constant_expression();
}
} else {
@ -384,6 +383,7 @@ merge(Compressor.prototype, {
d.fixed = false;
} else {
d.fixed = node;
loop_ids[d.id] = in_loop;
mark(d, true);
if (ref_once(d)) {
d.single_use = d.scope === d.references[0].scope
@ -577,7 +577,11 @@ merge(Compressor.prototype, {
}
function ref_once(def) {
return unused && !def.scope.uses_eval && !def.scope.uses_with && def.references.length == 1;
return unused
&& !def.scope.uses_eval
&& !def.scope.uses_with
&& def.references.length == 1
&& loop_ids[def.id] === in_loop;
}
function is_immutable(value) {

View File

@ -1123,11 +1123,12 @@ toplevel_on_loops_1: {
while (x);
}
expect: {
function bar() {
console.log("bar:", --x);
}
var x = 3;
do
(function() {
console.log("bar:", --x);
})();
bar();
while (x);
}
expect_stdout: true
@ -1180,9 +1181,10 @@ toplevel_on_loops_2: {
while (x);
}
expect: {
for (;;) (function() {
function bar() {
console.log("bar:");
})();
}
for (;;) bar();
}
}
@ -3920,3 +3922,70 @@ issue_2450_3: {
}
expect_stdout: "true"
}
issue_2450_4: {
options = {
reduce_vars: true,
toplevel: true,
unused: true,
}
input: {
var a;
function f(b) {
console.log(a === b);
a = b;
}
function g() {}
for (var i = 3; --i >= 0;)
f(g);
}
expect: {
var a;
function f(b) {
console.log(a === b);
a = b;
}
function g() {}
for (var i = 3; --i >= 0;)
f(g);
}
expect_stdout: [
"false",
"true",
"true",
]
}
issue_2450_5: {
options = {
reduce_vars: true,
toplevel: true,
unused: true,
}
input: {
var a;
function f(b) {
console.log(a === b);
a = b;
}
function g() {}
[1, 2, 3].forEach(function() {
f(g);
});
}
expect: {
var a;
function g() {}
[1, 2, 3].forEach(function() {
(function(b) {
console.log(a === b);
a = b;
})(g);
});
}
expect_stdout: [
"false",
"true",
"true",
]
}