fix argument/atom collision by `properties` (#2514)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 25 Nov 2017 14:52:46 +0000 (22:52 +0800)
committerGitHub <noreply@github.com>
Sat, 25 Nov 2017 14:52:46 +0000 (22:52 +0800)
fixes #2513

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

index 744a1ea..22415f4 100644 (file)
@@ -4708,6 +4708,17 @@ merge(Compressor.prototype, {
         if (compressor.option("properties")) {
             var key = prop.evaluate(compressor);
             if (key !== prop) {
+                if (typeof key == "string") {
+                    if (key == "undefined") {
+                        key = undefined;
+                    } else {
+                        var value = parseFloat(key);
+                        if (value.toString() == key) {
+                            key = value;
+                        }
+                    }
+                }
+                prop = self.property = best_of_expression(prop, make_node_from_constant(key, prop).transform(compressor));
                 var property = "" + key;
                 if (is_identifier_string(property)
                     && property.length <= prop.print_to_string().length + 1) {
@@ -4716,14 +4727,6 @@ merge(Compressor.prototype, {
                         property: property
                     }).optimize(compressor);
                 }
-                if (!(prop instanceof AST_Number)) {
-                    var value = parseFloat(property);
-                    if (value.toString() == property) {
-                        prop = self.property = make_node(AST_Number, prop, {
-                            value: value
-                        });
-                    }
-                }
             }
         }
         if (is_lhs(self, compressor.parent())) return self;
index f2e5932..6d4c028 100644 (file)
@@ -1028,3 +1028,29 @@ new_this: {
         }(42);
     }
 }
+
+issue_2513: {
+    options = {
+        evaluate: true,
+        properties: true,
+    }
+    input: {
+        !function(Infinity, NaN, undefined) {
+            console.log("a"[1/0], "b"["Infinity"]);
+            console.log("c"[0/0], "d"["NaN"]);
+            console.log("e"[void 0], "f"["undefined"]);
+        }(0, 0, 0);
+    }
+    expect: {
+        !function(Infinity, NaN, undefined) {
+            console.log("a"[1/0], "b"[1/0]);
+            console.log("c".NaN, "d".NaN);
+            console.log("e"[void 0], "f"[void 0]);
+        }(0, 0, 0);
+    }
+    expect_stdout: [
+        "undefined undefined",
+        "undefined undefined",
+        "undefined undefined",
+    ]
+}