ensure `ie8` works with mangled properties (#2238)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 15 Jul 2017 14:50:59 +0000 (22:50 +0800)
committerGitHub <noreply@github.com>
Sat, 15 Jul 2017 14:50:59 +0000 (22:50 +0800)
fixes #2234

lib/compress.js
lib/output.js
test/compress/properties.js
test/mocha/let.js

index 6dc7b72..7a16ba8 100644 (file)
@@ -4395,7 +4395,7 @@ merge(Compressor.prototype, {
         var prop = self.property;
         if (prop instanceof AST_String && compressor.option("properties")) {
             prop = prop.getValue();
-            if (RESERVED_WORDS(prop) ? !compressor.option("ie8") : is_identifier_string(prop)) {
+            if (is_identifier_string(prop)) {
                 return make_node(AST_Dot, self, {
                     expression : self.expression,
                     property   : prop
@@ -4432,19 +4432,10 @@ merge(Compressor.prototype, {
         if (def) {
             return def.optimize(compressor);
         }
-        var prop = self.property;
-        if (RESERVED_WORDS(prop) && compressor.option("ie8")) {
-            return make_node(AST_Sub, self, {
-                expression : self.expression,
-                property   : make_node(AST_String, self, {
-                    value: prop
-                })
-            }).optimize(compressor);
-        }
         if (compressor.option("unsafe") && self.expression instanceof AST_Object) {
             var values = self.expression.properties;
             for (var i = values.length; --i >= 0;) {
-                if (values[i].key === prop) {
+                if (values[i].key === self.property) {
                     var value = values[i].value;
                     if (value instanceof AST_Function ? !value.contains_this() : !value.has_side_effects(compressor)) {
                         var obj = self.expression.clone();
index 6ee96b3..edb8d18 100644 (file)
@@ -1146,15 +1146,23 @@ function OutputStream(options) {
     DEFPRINT(AST_Dot, function(self, output){
         var expr = self.expression;
         expr.print(output);
-        if (expr instanceof AST_Number && expr.getValue() >= 0) {
-            if (!/[xa-f.)]/i.test(output.last())) {
-                output.print(".");
+        var prop = self.property;
+        if (output.option("ie8") && RESERVED_WORDS(prop)) {
+            output.print("[");
+            output.add_mapping(self.end);
+            output.print_string(prop);
+            output.print("]");
+        } else {
+            if (expr instanceof AST_Number && expr.getValue() >= 0) {
+                if (!/[xa-f.)]/i.test(output.last())) {
+                    output.print(".");
+                }
             }
+            output.print(".");
+            // the name after dot would be mapped about here.
+            output.add_mapping(self.end);
+            output.print_name(prop);
         }
-        output.print(".");
-        // the name after dot would be mapped about here.
-        output.add_mapping(self.end);
-        output.print_name(self.property);
     });
     DEFPRINT(AST_Sub, function(self, output){
         self.expression.print(output);
index a5527de..dda2e74 100644 (file)
@@ -13,8 +13,10 @@ keep_properties: {
 dot_properties: {
     options = {
         properties: true,
+    }
+    beautify = {
         ie8: true,
-    };
+    }
     input: {
         a["foo"] = "bar";
         a["if"] = "if";
@@ -36,8 +38,10 @@ dot_properties: {
 dot_properties_es5: {
     options = {
         properties: true,
+    }
+    beautify = {
         ie8: false,
-    };
+    }
     input: {
         a["foo"] = "bar";
         a["if"] = "if";
index 2390998..8685746 100644 (file)
@@ -2,16 +2,17 @@ var Uglify = require('../../');
 var assert = require("assert");
 
 describe("let", function() {
-    it("Should not produce reserved keywords as variable name in mangle", function(done) {
-        this.timeout(10000);
-
+    this.timeout(30000);
+    it("Should not produce reserved keywords as variable name in mangle", function() {
         // Produce a lot of variables in a function and run it through mangle.
         var s = '"dddddeeeeelllllooooottttt"; function foo() {';
         for (var i = 0; i < 18000; i++) {
             s += "var v" + i + "=0;";
         }
         s += '}';
-        var result = Uglify.minify(s, {compress: false});
+        var result = Uglify.minify(s, {
+            compress: false
+        }).code;
 
         // Verify that select keywords and reserved keywords not produced
         [
@@ -19,7 +20,7 @@ describe("let", function() {
             "let",
             "var",
         ].forEach(function(name) {
-            assert.strictEqual(result.code.indexOf("var " + name + "="), -1);
+            assert.strictEqual(result.indexOf("var " + name + "="), -1);
         });
 
         // Verify that the variable names that appeared immediately before
@@ -30,9 +31,27 @@ describe("let", function() {
             "eet", "fet",
             "rar", "oar",
         ].forEach(function(name) {
-            assert.ok(result.code.indexOf("var " + name + "=") >= 0);
+            assert.notStrictEqual(result.indexOf("var " + name + "="), -1);
+        });
+    });
+    it("Should quote mangled properties that are reserved keywords", function() {
+        var s = '"rrrrrnnnnniiiiiaaaaa";';
+        for (var i = 0; i < 18000; i++) {
+            s += "v.b" + i + ";";
+        }
+        var result = Uglify.minify(s, {
+            compress: false,
+            ie8: true,
+            mangle: {
+                properties: true,
+            }
+        }).code;
+        [
+            "in",
+            "var",
+        ].forEach(function(name) {
+            assert.notStrictEqual(result.indexOf(name), -1);
+            assert.notStrictEqual(result.indexOf('v["' + name + '"]'), -1);
         });
-
-        done();
     });
 });