fix corner case in `properties` (#4832)
authorAlex Lam S.L <alexlamsl@gmail.com>
Thu, 1 Apr 2021 06:39:51 +0000 (07:39 +0100)
committerGitHub <noreply@github.com>
Thu, 1 Apr 2021 06:39:51 +0000 (14:39 +0800)
fixes #4831

lib/compress.js
test/compress/classes.js
test/compress/properties.js

index 5aeb910..0433dd6 100644 (file)
@@ -11460,7 +11460,10 @@ merge(Compressor.prototype, {
                 props = props.map(function(prop) {
                     return prop.value;
                 });
-                if (prop instanceof AST_ObjectMethod && prop.value instanceof AST_Function) {
+                if (prop instanceof AST_ObjectMethod
+                    && prop.value instanceof AST_Function
+                    && !(compressor.parent() instanceof AST_Call)) {
+                    if (prop.value.uses_arguments) break;
                     props[i] = make_node(AST_Arrow, prop.value, prop.value);
                 }
                 return make_node(AST_Sub, this, {
index b428e0e..8e7b1dc 100644 (file)
@@ -1345,7 +1345,7 @@ issue_4821_2: {
     node_version: ">=12"
 }
 
-issue_4829: {
+issue_4829_1: {
     options = {
         properties: true,
     }
@@ -1368,3 +1368,35 @@ issue_4829: {
     expect_stdout: "PASS"
     node_version: ">=4"
 }
+
+issue_4829_2: {
+    options = {
+        properties: true,
+    }
+    input: {
+        "use strict";
+        try {
+            class A extends {
+                f() {
+                    return arguments;
+                },
+            }.f {}
+        } catch (e) {
+            console.log("PASS");
+        }
+    }
+    expect: {
+        "use strict";
+        try {
+            class A extends {
+                f() {
+                    return arguments;
+                },
+            }.f {}
+        } catch (e) {
+            console.log("PASS");
+        }
+    }
+    expect_stdout: "PASS"
+    node_version: ">=4"
+}
index eb47624..2fc2cea 100644 (file)
@@ -1400,3 +1400,49 @@ object_super: {
     expect_stdout: "PASS"
     node_version: ">=4"
 }
+
+issue_4831_1: {
+    options = {
+        properties: true,
+    }
+    input: {
+        console.log({
+            f() {
+                return arguments;
+            },
+        }.f("PASS")[0]);
+    }
+    expect: {
+        console.log([
+            function() {
+                return arguments;
+            },
+        ][0]("PASS")[0]);
+    }
+    expect_stdout: "PASS"
+    node_version: ">=4"
+}
+
+issue_4831_2: {
+    options = {
+        properties: true,
+    }
+    input: {
+        var f = {
+            f() {
+                return arguments;
+            },
+        }.f;
+        console.log(f("PASS")[0]);
+    }
+    expect: {
+        var f = {
+            f() {
+                return arguments;
+            },
+        }.f;
+        console.log(f("PASS")[0]);
+    }
+    expect_stdout: "PASS"
+    node_version: ">=4"
+}