diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2020-10-20 07:02:39 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-20 14:02:39 +0800 |
commit | fd8c0212b8d81b4f1630155bb170214ce87d0e70 (patch) | |
tree | ead89cf9675afc8f8a465fb73a389e520274cfa8 | |
parent | 256950c2c0b4dc0c133fcc8aaf85f15579eb190f (diff) | |
download | tracifyjs-fd8c0212b8d81b4f1630155bb170214ce87d0e70.tar.gz tracifyjs-fd8c0212b8d81b4f1630155bb170214ce87d0e70.zip |
fix corner case in `ie8` (#4232)
fixes #4231
-rw-r--r-- | lib/compress.js | 5 | ||||
-rw-r--r-- | lib/scope.js | 4 | ||||
-rw-r--r-- | test/compress/const.js | 21 | ||||
-rw-r--r-- | test/compress/let.js | 22 |
4 files changed, 46 insertions, 6 deletions
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" +} |