From dc575919e2cc95dbbf9a9f92ba7b22e34d4e7f4a Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Sun, 18 Oct 2020 15:13:10 +0100 Subject: [PATCH] fix corner case in `side_effects` (#4226) fixes #4225 --- lib/compress.js | 27 +++++++++++++++++---------- test/compress/const.js | 17 +++++++++++++++++ 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 504bf39b..015ee306 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -5881,24 +5881,31 @@ merge(Compressor.prototype, { if (!property) return expression; return make_sequence(this, [ expression, property ]); }); - def(AST_SymbolRef, function(compressor) { - return this.is_declared(compressor) && all(this.definition().orig, function(sym) { + function drop_symbol(ref) { + return all(ref.definition().orig, function(sym) { return !(sym instanceof AST_SymbolConst); - }) ? null : this; + }); + } + def(AST_SymbolRef, function(compressor) { + return this.is_declared(compressor) && drop_symbol(this) ? null : this; }); def(AST_This, return_null); def(AST_Unary, function(compressor, first_in_statement) { + var exp = this.expression; if (unary_side_effects[this.operator]) { - this.write_only = !this.expression.has_side_effects(compressor); + this.write_only = !exp.has_side_effects(compressor); return this; } - if (this.operator == "typeof" && this.expression instanceof AST_SymbolRef) return null; - var expression = this.expression.drop_side_effect_free(compressor, first_in_statement); - if (first_in_statement && expression && is_iife_call(expression)) { - if (expression === this.expression && this.operator == "!") return this; - return expression.negate(compressor, first_in_statement); + if (this.operator == "typeof" && exp instanceof AST_SymbolRef) { + if (drop_symbol(exp)) return null; + if (exp.is_declared(compressor)) return exp; } - return expression; + var node = exp.drop_side_effect_free(compressor, first_in_statement); + if (first_in_statement && node && is_iife_call(node)) { + if (node === exp && this.operator == "!") return this; + return node.negate(compressor, first_in_statement); + } + return node; }); })(function(node, func) { node.DEFMETHOD("drop_side_effect_free", func); diff --git a/test/compress/const.js b/test/compress/const.js index ef5c9675..3e6662cd 100644 --- a/test/compress/const.js +++ b/test/compress/const.js @@ -1134,3 +1134,20 @@ issue_4222: { } expect_stdout: true } + +issue_4225: { + options = { + side_effects: true, + } + input: { + const a = void typeof b; + const b = 42; + console.log(a, b); + } + expect: { + const a = void b; + const b = 42; + console.log(a, b); + } + expect_stdout: true +} -- 2.34.1