fix corner case in `templates` (#4677)
authorAlex Lam S.L <alexlamsl@gmail.com>
Mon, 22 Feb 2021 15:59:28 +0000 (15:59 +0000)
committerGitHub <noreply@github.com>
Mon, 22 Feb 2021 15:59:28 +0000 (23:59 +0800)
fixes #4676

lib/compress.js
test/compress/templates.js

index c645101..c16639f 100644 (file)
@@ -10141,8 +10141,9 @@ merge(Compressor.prototype, {
     OPT(AST_Template, function(self, compressor) {
         if (!compressor.option("templates")) return self;
         if (!self.tag || is_raw_tag(compressor, self.tag)) {
-            var exprs = self.expressions;
-            var strs = self.strings;
+            var exprs = self.expressions.slice();
+            var strs = self.strings.slice();
+            var CHANGED = false;
             for (var i = exprs.length; --i >= 0;) {
                 var node = exprs[i];
                 var ev = node.evaluate(compressor);
@@ -10163,6 +10164,11 @@ merge(Compressor.prototype, {
                 }).evaluate(compressor)) continue;
                 exprs.splice(i, 1);
                 strs.splice(i, 2, combined);
+                CHANGED = true;
+            }
+            if (CHANGED) {
+                self.expressions = exprs;
+                self.strings = strs;
             }
         }
         return try_evaluate(compressor, self);
index 8ea4d39..d9e9597 100644 (file)
@@ -298,3 +298,33 @@ issue_4630: {
     expect_stdout: "/PASS/"
     node_version: ">=4"
 }
+
+issue_4676: {
+    options = {
+        evaluate: true,
+        reduce_vars: true,
+        templates: true,
+        toplevel: true,
+        unsafe:true,
+        unused: true,
+    }
+    input: {
+        function f(a) {
+            var b = `foo${a = "PASS"}`;
+            for (var c in f && b)
+                b.p;
+            return a;
+        }
+        console.log(f("FAIL"));
+    }
+    expect: {
+        console.log(function f(a) {
+            var b = "fooPASS";
+            for (var c in f, b)
+                b.p;
+            return "PASS";
+        }());
+    }
+    expect_stdout: "PASS"
+    node_version: ">=4"
+}