fix corner case in `evaluate` & `ie8` (#3751)
authorAlex Lam S.L <alexlamsl@gmail.com>
Fri, 20 Mar 2020 16:55:24 +0000 (00:55 +0800)
committerGitHub <noreply@github.com>
Fri, 20 Mar 2020 16:55:24 +0000 (00:55 +0800)
fixes #3750

lib/compress.js
lib/scope.js
lib/utils.js
test/compress/ie8.js

index 9622936..343994e 100644 (file)
@@ -3373,15 +3373,18 @@ merge(Compressor.prototype, {
                 var args = eval_args(this.args);
                 if (!args) return this;
                 if (!stat.value) return undefined;
-                fn.argnames.forEach(function(sym, i) {
+                if (!all(fn.argnames, function(sym, i) {
                     var value = args[i];
-                    sym.definition().references.forEach(function(node) {
+                    var def = sym.definition();
+                    if (def.orig[def.orig.length - 1] !== sym) return false;
+                    def.references.forEach(function(node) {
                         node._eval = function() {
                             return value;
                         };
                         cached.push(node);
                     });
-                });
+                    return true;
+                })) return this;
                 fn.evaluating = true;
                 var val = stat.value._eval(compressor, ignore_side_effects, cached, depth);
                 delete fn.evaluating;
index 896efac..35d97e1 100644 (file)
@@ -219,7 +219,12 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
             var redef;
             while (redef = new_def.redefined()) new_def = redef;
         } else {
-            new_def = self.globals.get(name) || scope.def_variable(node);
+            new_def = self.globals.get(name);
+        }
+        if (new_def) {
+            new_def.orig.push(node);
+        } else {
+            new_def = scope.def_variable(node);
         }
         old_def.orig.concat(old_def.references).forEach(function(node) {
             node.thedef = new_def;
index da82a14..9959305 100644 (file)
@@ -185,7 +185,7 @@ function makePredicate(words) {
 
 function all(array, predicate) {
     for (var i = array.length; --i >= 0;)
-        if (!predicate(array[i]))
+        if (!predicate(array[i], i))
             return false;
     return true;
 }
index 7ec8037..4dfa7c6 100644 (file)
@@ -2398,3 +2398,25 @@ issue_3703: {
     }
     expect_stdout: "PASS"
 }
+
+issue_3750: {
+    options = {
+        evaluate: true,
+        ie8: true,
+    }
+    input: {
+        (function(a) {
+            return function a() {
+                return a && console.log("PASS");
+            }();
+        })();
+    }
+    expect: {
+        (function(a) {
+            return function a() {
+                return a && console.log("PASS");
+            }();
+        })();
+    }
+    expect_stdout: "PASS"
+}