From: Alex Lam S.L Date: Tue, 20 Oct 2020 06:02:39 +0000 (+0100) Subject: fix corner case in `ie8` (#4232) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=fd8c0212b8d81b4f1630155bb170214ce87d0e70;p=UglifyJS.git fix corner case in `ie8` (#4232) fixes #4231 --- diff --git a/lib/compress.js b/lib/compress.js index d4be93ee..b82fcca0 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -5906,10 +5906,7 @@ merge(Compressor.prototype, { this.write_only = !exp.has_side_effects(compressor); return this; } - if (this.operator == "typeof" && exp instanceof AST_SymbolRef) { - if (drop_symbol(exp)) return null; - if (exp.is_declared(compressor)) return exp; - } + if (this.operator == "typeof" && exp instanceof AST_SymbolRef && drop_symbol(exp)) return null; 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; diff --git a/lib/scope.js b/lib/scope.js index 208633d0..80034a54 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -277,6 +277,9 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) { function redefine(node, scope) { var name = node.name; var old_def = node.thedef; + if (!all(old_def.orig, function(sym) { + return !(sym instanceof AST_SymbolConst || sym instanceof AST_SymbolLet); + })) return; var new_def = scope.find_variable(name); if (new_def) { var redef = new_def.redefined(); @@ -294,7 +297,6 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) { node.redef = true; node.thedef = new_def; node.reference(options); - if (node instanceof AST_SymbolConst || node instanceof AST_SymbolLet) new_def.orig.push(node); }); if (old_def.lambda) new_def.lambda = true; if (new_def.undeclared) self.variables.set(name, new_def); diff --git a/test/compress/const.js b/test/compress/const.js index b20c4c59..694c9d16 100644 --- a/test/compress/const.js +++ b/test/compress/const.js @@ -438,7 +438,7 @@ catch_ie8_1: { } expect: { try {} catch (a) {} - console.log(function a() { + console.log(function() { }()); } expect_stdout: "undefined" @@ -1065,3 +1065,22 @@ issue_4229: { } expect_stdout: true } + +issue_4231: { + options = { + ie8: true, + side_effects: true, + } + input: { + typeof a == 0; + console.log(typeof function a() { + const a = 0; + }); + } + expect: { + console.log(typeof function a() { + const a = 0; + }); + } + expect_stdout: "function" +} diff --git a/test/compress/let.js b/test/compress/let.js index c40ae9e3..8374db9a 100644 --- a/test/compress/let.js +++ b/test/compress/let.js @@ -871,3 +871,25 @@ issue_4229: { expect_stdout: "PASS" node_version: ">=4" } + +issue_4231: { + options = { + ie8: true, + side_effects: true, + } + input: { + "use strict"; + typeof a == 0; + console.log(typeof function a() { + let a; + }); + } + expect: { + "use strict"; + console.log(typeof function a() { + let a; + }); + } + expect_stdout: "function" + node_version: ">=4" +}