fix corner case in `passes` & `reduce_vars` (#4316)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 22 Nov 2020 23:05:20 +0000 (23:05 +0000)
committerGitHub <noreply@github.com>
Sun, 22 Nov 2020 23:05:20 +0000 (07:05 +0800)
fixes #4315

lib/compress.js
test/compress/destructured.js

index 1161f3b..0e585e1 100644 (file)
@@ -597,9 +597,10 @@ merge(Compressor.prototype, {
         function scan_declaration(tw, lhs, fixed, visit) {
             var scanner = new TreeWalker(function(node) {
                 if (node instanceof AST_DestructuredArray) {
+                    reset_flags(node);
                     var save = fixed;
                     node.elements.forEach(function(node, index) {
-                        if (node instanceof AST_Hole) return;
+                        if (node instanceof AST_Hole) return reset_flags(node);
                         fixed = function() {
                             return make_node(AST_Sub, node, {
                                 expression: save(),
@@ -614,8 +615,10 @@ merge(Compressor.prototype, {
                     return true;
                 }
                 if (node instanceof AST_DestructuredObject) {
+                    reset_flags(node);
                     var save = fixed;
                     node.properties.forEach(function(node) {
+                        reset_flags(node);
                         if (node.key instanceof AST_Node) {
                             push(tw);
                             node.key.walk(tw);
@@ -1112,6 +1115,13 @@ merge(Compressor.prototype, {
         node.DEFMETHOD("reduce_vars", func);
     });
 
+    function reset_flags(node) {
+        node._squeezed = false;
+        node._optimized = false;
+        delete node.fixed;
+        if (node instanceof AST_Scope) delete node._var_names;
+    }
+
     AST_Toplevel.DEFMETHOD("reset_opt_flags", function(compressor) {
         var tw = new TreeWalker(compressor.option("reduce_vars") ? function(node, descend) {
             reset_flags(node);
@@ -1129,13 +1139,6 @@ merge(Compressor.prototype, {
         // - backup & restore via `save_ids` when visiting out-of-order sections
         tw.safe_ids = Object.create(null);
         this.walk(tw);
-
-        function reset_flags(node) {
-            node._squeezed = false;
-            node._optimized = false;
-            delete node.fixed;
-            if (node instanceof AST_Scope) delete node._var_names;
-        }
     });
 
     AST_Symbol.DEFMETHOD("fixed_value", function() {
index e654847..6eea10d 100644 (file)
@@ -1647,3 +1647,40 @@ issue_4312: {
     expect_stdout: "PASS"
     node_version: ">=6"
 }
+
+issue_4315: {
+    options = {
+        conditionals: true,
+        dead_code: true,
+        evaluate: true,
+        inline: true,
+        passes: 2,
+        reduce_funcs: true,
+        reduce_vars: true,
+        side_effects: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        function f() {
+            console;
+        }
+        var a = function() {
+            if ([ 0[f && f] ] = [])
+                return this;
+        }(), b;
+        do {
+            console.log("PASS");
+        } while (0 && (b = 0), b && a);
+    }
+    expect: {
+        [ 0[function() {
+            console
+        }] ] = [];
+        do {
+            console.log("PASS");
+        } while (void 0);
+    }
+    expect_stdout: "PASS"
+    node_version: ">=6"
+}