[Pkg-javascript-commits] [uglifyjs] 192/491: ensure `ie8` works with mangled properties (#2238)

Jonas Smedegaard dr at jones.dk
Wed Feb 14 19:51:34 UTC 2018


This is an automated email from the git hooks/post-receive script.

js pushed a commit to annotated tag debian/3.3.10-1
in repository uglifyjs.

commit 9e1da9235ea498760f45709848b76469f5b2a585
Author: Alex Lam S.L <alexlamsl at gmail.com>
Date:   Sat Jul 15 22:50:59 2017 +0800

    ensure `ie8` works with mangled properties (#2238)
    
    fixes #2234
---
 lib/compress.js             | 13 ++-----------
 lib/output.js               | 22 +++++++++++++++-------
 test/compress/properties.js |  8 ++++++--
 test/mocha/let.js           | 35 +++++++++++++++++++++++++++--------
 4 files changed, 50 insertions(+), 28 deletions(-)

diff --git a/lib/compress.js b/lib/compress.js
index 6dc7b72..7a16ba8 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -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();
diff --git a/lib/output.js b/lib/output.js
index 6ee96b3..edb8d18 100644
--- a/lib/output.js
+++ b/lib/output.js
@@ -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);
diff --git a/test/compress/properties.js b/test/compress/properties.js
index a5527de..dda2e74 100644
--- a/test/compress/properties.js
+++ b/test/compress/properties.js
@@ -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";
diff --git a/test/mocha/let.js b/test/mocha/let.js
index 2390998..8685746 100644
--- a/test/mocha/let.js
+++ b/test/mocha/let.js
@@ -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();
     });
 });

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/uglifyjs.git



More information about the Pkg-javascript-commits mailing list