From 7436977aa5d8c4685032600f6b23e9cada282cae Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Sat, 23 Mar 2019 14:21:54 +0800 Subject: [PATCH] fix infinite loop triggered by #3347 (#3354) fixes #3353 --- lib/compress.js | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index fe6e72d1..6c12d2bd 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -2246,7 +2246,11 @@ merge(Compressor.prototype, { }); def(AST_SymbolRef, function() { var fixed = this.fixed_value(); - return fixed && fixed.is_truthy(); + if (!fixed) return false; + this.is_truthy = return_false; + var result = fixed.is_truthy(); + delete this.is_truthy; + return result; }); })(function(node, func) { node.DEFMETHOD("is_truthy", func); @@ -2300,7 +2304,11 @@ merge(Compressor.prototype, { if (is_undeclared_ref(this) && this.is_declared(compressor)) return false; if (this.is_immutable()) return false; var fixed = this.fixed_value(); - return !fixed || fixed._dot_throw(compressor); + if (!fixed) return true; + this._dot_throw = return_true; + var result = fixed._dot_throw(compressor); + delete this._dot_throw; + return result; }); def(AST_UnaryPrefix, function() { return this.operator == "void"; @@ -2342,7 +2350,11 @@ merge(Compressor.prototype, { }); def(AST_SymbolRef, function(compressor) { var fixed = this.fixed_value(); - return fixed && fixed.is_boolean(compressor); + if (!fixed) return false; + this.is_boolean = return_false; + var result = fixed.is_boolean(compressor); + delete this.is_boolean; + return result; }); var unary = makePredicate("! delete"); def(AST_UnaryPrefix, function() { @@ -2427,7 +2439,11 @@ merge(Compressor.prototype, { }); def(AST_SymbolRef, function(compressor) { var fixed = this.fixed_value(); - return fixed && fixed.is_number(compressor); + if (!fixed) return false; + this.is_number = return_false; + var result = fixed.is_number(compressor); + delete this.is_number; + return result; }); var unary = makePredicate("+ - ~ ++ --"); def(AST_Unary, function() { @@ -2456,7 +2472,11 @@ merge(Compressor.prototype, { def(AST_String, return_true); def(AST_SymbolRef, function(compressor) { var fixed = this.fixed_value(); - return fixed && fixed.is_string(compressor); + if (!fixed) return false; + this.is_string = return_false; + var result = fixed.is_string(compressor); + delete this.is_string; + return result; }); def(AST_UnaryPrefix, function() { return this.operator == "typeof"; -- 2.34.1