workaround bug in ECMAScript specification (#4656)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 16 Feb 2021 15:39:06 +0000 (15:39 +0000)
committerGitHub <noreply@github.com>
Tue, 16 Feb 2021 15:39:06 +0000 (23:39 +0800)
closes #4655

lib/compress.js
test/compress/functions.js

index b4f9c3a..a2a28ab 100644 (file)
@@ -5017,20 +5017,22 @@ merge(Compressor.prototype, {
         return self;
     });
 
-    function trim_block(node, in_list) {
+    function trim_block(node, parent, in_list) {
         switch (node.body.length) {
           case 0:
             return in_list ? List.skip : make_node(AST_EmptyStatement, node);
           case 1:
             var stat = node.body[0];
-            if (!(stat instanceof AST_Const || stat instanceof AST_Let)) return stat;
+            if (stat instanceof AST_Const || stat instanceof AST_Let) return node;
+            if (parent instanceof AST_IterationStatement && stat instanceof AST_LambdaDefinition) return node;
+            return stat;
         }
         return node;
     }
 
     OPT(AST_BlockStatement, function(self, compressor) {
         self.body = tighten_body(self.body, compressor);
-        return trim_block(self);
+        return trim_block(self, compressor.parent());
     });
 
     function drop_rest_farg(fn, compressor) {
@@ -6123,7 +6125,7 @@ merge(Compressor.prototype, {
             }
         }, function(node, in_list) {
             if (node instanceof AST_BlockStatement) {
-                return trim_block(node, in_list);
+                return trim_block(node, tt.parent(), in_list);
             } else if (node instanceof AST_For) {
                 // Certain combination of unused name + side effect leads to invalid AST:
                 //    https://github.com/mishoo/UglifyJS/issues/44
@@ -7282,7 +7284,7 @@ merge(Compressor.prototype, {
                     break;
                 }
             }
-            self.body = trim_block(self.body);
+            self.body = trim_block(self.body, compressor.parent());
         }
         if (self.body instanceof AST_EmptyStatement) return make_node(AST_For, self, self).optimize(compressor);
         if (self.body instanceof AST_SimpleStatement) return make_node(AST_For, self, {
index 77dd256..7e2b45d 100644 (file)
@@ -5409,3 +5409,30 @@ issue_4612_4: {
     }
     expect_stdout: "undefined"
 }
+
+issue_4655: {
+    options = {
+        functions: true,
+        loops: true,
+        reduce_vars: true,
+        side_effects: true,
+        unused: true,
+    }
+    input: {
+        (function f() {
+            while (console.log("PASS")) {
+                var g = function() {};
+                for (var a in g)
+                    g();
+            }
+        })();
+    }
+    expect: {
+        (function() {
+            for (; console.log("PASS");) {
+                function g() {};
+            }
+        })();
+    }
+    expect_stdout: "PASS"
+}