fix corner case in `unsafe` (#4755)
authorAlex Lam S.L <alexlamsl@gmail.com>
Mon, 8 Mar 2021 20:40:21 +0000 (20:40 +0000)
committerGitHub <noreply@github.com>
Mon, 8 Mar 2021 20:40:21 +0000 (04:40 +0800)
lib/compress.js
test/compress/evaluate.js

index f63c186..a92ad97 100644 (file)
@@ -8581,17 +8581,17 @@ merge(Compressor.prototype, {
                 break;
               case "charAt":
                 if (self.args.length < 2) {
-                    var node = make_node(AST_Sub, self, {
-                        expression: exp.expression,
-                        property: self.args.length ? make_node(AST_Binary, self.args[0], {
-                            operator: "|",
-                            left: make_node(AST_Number, self, {
-                                value: 0
-                            }),
-                            right: self.args[0]
-                        }) : make_node(AST_Number, self, {
-                            value: 0
-                        })
+                    var node = make_node(AST_Binary, self, {
+                        operator: "||",
+                        left: make_node(AST_Sub, self, {
+                            expression: exp.expression,
+                            property: self.args.length ? make_node(AST_Binary, self.args[0], {
+                                operator: "|",
+                                left: make_node(AST_Number, self, { value: 0 }),
+                                right: self.args[0],
+                            }) : make_node(AST_Number, self, { value: 0 }),
+                        }).optimize(compressor),
+                        right: make_node(AST_String, self, { value: "" }),
                     });
                     node.is_string = return_true;
                     return node.optimize(compressor);
index 597c7c8..c92e82b 100644 (file)
@@ -847,6 +847,8 @@ unsafe_charAt_noop: {
         unsafe: true,
     }
     input: {
+        s = "foo";
+        x = 42;
         console.log(
             s.charAt(0),
             "string".charAt(x),
@@ -854,12 +856,15 @@ unsafe_charAt_noop: {
         );
     }
     expect: {
+        s = "foo";
+        x = 42;
         console.log(
-            s[0],
-            "string"[0 | x],
-            (typeof x)[0]
+            s[0] || "",
+            "string"[0 | x] || "",
+            (typeof x)[0] || ""
         );
     }
+    expect_stdout: "f  n"
 }
 
 issue_1649: {