fix corner case in `evaluate` (#3883)
authorAlex Lam S.L <alexlamsl@gmail.com>
Mon, 11 May 2020 19:24:44 +0000 (20:24 +0100)
committerGitHub <noreply@github.com>
Mon, 11 May 2020 19:24:44 +0000 (03:24 +0800)
fixes #3882

lib/compress.js
test/compress/evaluate.js

index 1e33dc1..cb5d9c7 100644 (file)
@@ -3268,9 +3268,14 @@ merge(Compressor.prototype, {
         });
         def(AST_Sequence, function(compressor, ignore_side_effects, cached, depth) {
             if (!ignore_side_effects) return this;
-            var node = this.tail_node();
-            var value = node._eval(compressor, ignore_side_effects, cached, depth);
-            return value === node ? this : value;
+            var tail = this.tail_node();
+            this.walk(new TreeWalker(function(node) {
+                if (node === tail) return true;
+                if (node instanceof AST_Assign) modified(node.left);
+                if (node instanceof AST_Unary && unary_arithmetic[node.operator]) modified(node.expression);
+            }));
+            var value = tail._eval(compressor, ignore_side_effects, cached, depth);
+            return value === tail ? this : value;
         });
         def(AST_Lambda, function(compressor) {
             if (compressor.option("unsafe")) {
index a4bee8c..60f059a 100644 (file)
@@ -2369,3 +2369,29 @@ issue_3878_2: {
     }
     expect_stdout: "NaN"
 }
+
+issue_3882: {
+    options = {
+        evaluate: true,
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        function f(a) {
+            return console.log(a++), a && this;
+        }
+        var b = f();
+        console.log(b);
+    }
+    expect: {
+        var b = function(a) {
+            return console.log(a++), a && this;
+        }();
+        console.log(b);
+    }
+    expect_stdout: [
+        "NaN",
+        "NaN",
+    ]
+}