aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2020-10-20 07:02:39 +0100
committerGitHub <noreply@github.com>2020-10-20 14:02:39 +0800
commitfd8c0212b8d81b4f1630155bb170214ce87d0e70 (patch)
treeead89cf9675afc8f8a465fb73a389e520274cfa8
parent256950c2c0b4dc0c133fcc8aaf85f15579eb190f (diff)
downloadtracifyjs-fd8c0212b8d81b4f1630155bb170214ce87d0e70.tar.gz
tracifyjs-fd8c0212b8d81b4f1630155bb170214ce87d0e70.zip
fix corner case in `ie8` (#4232)
fixes #4231
-rw-r--r--lib/compress.js5
-rw-r--r--lib/scope.js4
-rw-r--r--test/compress/const.js21
-rw-r--r--test/compress/let.js22
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"
+}