preserve function identity in reduce_vars (#2451)

fixes #2450
This commit is contained in:
Alex Lam S.L
2017-11-08 03:28:46 +08:00
committed by GitHub
parent 38bfb73f06
commit 4c0b0177b6
2 changed files with 176 additions and 23 deletions

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();
}
}
@@ -3845,3 +3847,145 @@ recursive_inlining_5: {
"foo 0",
]
}
issue_2450_1: {
options = {
reduce_vars: true,
toplevel: true,
unused: true,
}
input: {
function f() {}
function g() {
return f;
}
console.log(g() === g());
}
expect: {
function f() {}
function g() {
return f;
}
console.log(g() === g());
}
expect_stdout: "true"
}
issue_2450_2: {
options = {
reduce_vars: true,
toplevel: true,
unused: true,
}
input: {
function g() {
function f() {}
return f;
}
console.log(g() === g());
}
expect: {
function g() {
return function() {};
}
console.log(g() === g());
}
expect_stdout: "false"
}
issue_2450_3: {
options = {
reduce_vars: true,
unused: true,
}
input: {
var x = (function() {
function test() {
return "foo";
}
return function b() {
return [1, test];
}
})();
console.log(x()[1] === x()[1]);
}
expect: {
var x = (function() {
function test() {
return "foo";
}
return function() {
return [1, test];
}
})();
console.log(x()[1] === x()[1]);
}
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",
]
}