fix escape analysis on AST_New (#3043)

fixes #3042
This commit is contained in:
Alex Lam S.L
2018-03-31 15:03:46 +09:00
committed by GitHub
parent 6982a0554c
commit 07f64d4050
2 changed files with 73 additions and 1 deletions

View File

@@ -428,7 +428,7 @@ merge(Compressor.prototype, {
var parent = tw.parent(level);
if (value && value.is_constant()) return;
if (parent instanceof AST_Assign && parent.operator == "=" && node === parent.right
|| parent instanceof AST_Call && node !== parent.expression
|| parent instanceof AST_Call && (node !== parent.expression || parent instanceof AST_New)
|| parent instanceof AST_Exit && node === parent.value && node.scope !== d.scope
|| parent instanceof AST_VarDef && node === parent.value) {
if (depth > 1 && !(value && value.is_constant_expression(scope))) depth = 1;

View File

@@ -5582,3 +5582,75 @@ issue_2992: {
}
expect_stdout: "PASS"
}
issue_3042_1: {
options = {
reduce_funcs: true,
reduce_vars: true,
toplevel: true,
unused: true,
}
input: {
function f() {}
var a = [ 1, 2 ].map(function() {
return new f();
});
console.log(a[0].constructor === a[1].constructor);
}
expect: {
function f() {}
var a = [ 1, 2 ].map(function() {
return new f();
});
console.log(a[0].constructor === a[1].constructor);
}
expect_stdout: "true"
}
issue_3042_2: {
options = {
reduce_funcs: true,
reduce_vars: true,
toplevel: true,
unused: true,
}
input: {
function Foo() {
this.isFoo = function(o) {
return o instanceof Foo;
};
}
function FooCollection() {
this.foos = [1, 1].map(function() {
return new Foo();
});
}
var fooCollection = new FooCollection();
console.log(fooCollection.foos[0].isFoo(fooCollection.foos[0]));
console.log(fooCollection.foos[0].isFoo(fooCollection.foos[1]));
console.log(fooCollection.foos[1].isFoo(fooCollection.foos[0]));
console.log(fooCollection.foos[1].isFoo(fooCollection.foos[1]));
}
expect: {
function Foo() {
this.isFoo = function(o) {
return o instanceof Foo;
};
}
var fooCollection = new function() {
this.foos = [1, 1].map(function() {
return new Foo();
});
}();
console.log(fooCollection.foos[0].isFoo(fooCollection.foos[0]));
console.log(fooCollection.foos[0].isFoo(fooCollection.foos[1]));
console.log(fooCollection.foos[1].isFoo(fooCollection.foos[0]));
console.log(fooCollection.foos[1].isFoo(fooCollection.foos[1]));
}
expect_stdout: [
"true",
"true",
"true",
"true",
]
}