only do the typeof x == "undefined" optimization if x is a symbol reference and it's declared in scope, or x is not a symbol reference.

This commit is contained in:
Mihai Bazon
2012-09-17 20:02:14 +03:00
parent ee669ba878
commit d91613b4a8

View File

@@ -1371,19 +1371,23 @@ function Compressor(options, false_by_default) {
// XXX: intentionally falling down to the next case
case "==":
case "!=":
if (compressor.option("unsafe")) {
if (this.left instanceof AST_UnaryPrefix
&& this.left.operator == "typeof"
&& this.right instanceof AST_String
&& this.right.value == "undefined") {
if (!(this.left.expression instanceof AST_SymbolRef)
|| !this.left.expression.undeclared()) {
this.left = this.left.expression;
this.right = make_node(AST_Undefined, this.right).optimize(compressor);
if (this.operator.length == 2) this.operator += "=";
}
}
else if (this.left instanceof AST_String
&& this.left.value == "undefined"
&& this.right instanceof AST_UnaryPrefix
&& this.right.operator == "typeof") {
if (!(this.right.expression instanceof AST_SymbolRef)
|| !this.right.expression.undeclared()) {
this.left = this.right.expression;
this.right = make_node(AST_Undefined, this.left).optimize(compressor);
if (this.operator.length == 2) this.operator += "=";