fix corner cases in `reduce_vars` & `rests` (#5166)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 3 Nov 2021 13:29:01 +0000 (21:29 +0800)
committerGitHub <noreply@github.com>
Wed, 3 Nov 2021 13:29:01 +0000 (21:29 +0800)
fixes #5165

lib/compress.js
test/compress/rests.js

index dbd75a6..a442f94 100644 (file)
@@ -759,11 +759,13 @@ merge(Compressor.prototype, {
                         node.walk(scanner);
                     });
                     if (node.rest) {
+                        var fixed_node;
                         if (save) fixed = compressor.option("rests") && function() {
                             var value = save();
-                            return value instanceof AST_Array ? make_node(AST_Array, node, {
-                                elements: value.elements.slice(node.elements.length),
-                            }) : node;
+                            if (!(value instanceof AST_Array)) return node;
+                            if (!fixed_node) fixed_node = make_node(AST_Array, node);
+                            fixed_node.elements = value.elements.slice(node.elements.length);
+                            return fixed_node;
                         };
                         node.rest.walk(scanner);
                     }
@@ -843,11 +845,12 @@ merge(Compressor.prototype, {
                     return arg || make_node(AST_Undefined, iife);
                 }, visit);
             });
-            var rest = fn.rest;
+            var rest = fn.rest, fixed_node;
             if (rest) scan_declaration(tw, compressor, rest, compressor.option("rests") && function() {
-                return fn.rest === rest ? make_node(AST_Array, fn, {
-                    elements: iife.args.slice(fn.argnames.length),
-                }) : rest;
+                if (fn.rest !== rest) return rest;
+                if (!fixed_node) fixed_node = make_node(AST_Array, fn);
+                fixed_node.elements = iife.args.slice(fn.argnames.length);
+                return fixed_node;
             }, visit);
             walk_lambda(fn, tw);
             var safe_ids = tw.safe_ids;
index 7b793c5..d88ad66 100644 (file)
@@ -1151,3 +1151,57 @@ issue_5128_2: {
     expect_stdout: "PASS"
     node_version: ">=6"
 }
+
+issue_5165_1: {
+    options = {
+        conditionals: true,
+        dead_code: true,
+        evaluate: true,
+        reduce_vars: true,
+        rests: true,
+        side_effects: true,
+        switches: true,
+        unsafe: true,
+    }
+    input: {
+        console.log(function([ ...a ]) {
+            switch (a) {
+              case a:
+                return "PASS";
+            }
+        }([]));
+    }
+    expect: {
+        console.log(function([ ...a ]) {
+            return "PASS";
+        }([]));
+    }
+    expect_stdout: "PASS"
+    node_version: ">=6"
+}
+
+issue_5165_2: {
+    options = {
+        conditionals: true,
+        dead_code: true,
+        evaluate: true,
+        reduce_vars: true,
+        rests: true,
+        side_effects: true,
+        switches: true,
+        unsafe: true,
+    }
+    input: {
+        console.log(function(...a) {
+            switch (a) {
+              case a:
+                return "PASS";
+            }
+        }());
+    }
+    expect: {
+        console.log("PASS");
+    }
+    expect_stdout: "PASS"
+    node_version: ">=6"
+}