From: Mihai Bazon Date: Thu, 19 Sep 2013 15:20:45 +0000 (+0300) Subject: When `unsafe` is set, evaluate [...].join() if possible X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=78e98d2611f5698797785adbd12faf2ba46ec783;p=UglifyJS.git When `unsafe` is set, evaluate [...].join() if possible Close #298 --- diff --git a/lib/compress.js b/lib/compress.js index 8bd58bb1..35646cf1 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -746,6 +746,19 @@ merge(Compressor.prototype, { if (d && d.constant && d.init) return ev(d.init, compressor); throw def; }); + def(AST_Call, function(compressor){ + if (compressor.option("unsafe")) { + if (this.expression instanceof AST_Dot + && this.expression.expression instanceof AST_Array + && this.expression.property == "join") { + var x = this.expression.expression.elements.map(function(el){ + return ev(el, compressor); + }); + return x.join(ev(this.args[0])); + } + } + throw def; + }); })(function(node, func){ node.DEFMETHOD("_eval", func); }); @@ -1704,7 +1717,7 @@ merge(Compressor.prototype, { return make_node(AST_Undefined, self).transform(compressor); } } - return self; + return self.evaluate(compressor)[0]; }); OPT(AST_New, function(self, compressor){ diff --git a/test/compress/arrays.js b/test/compress/arrays.js index 0c3d8ba2..214928dd 100644 --- a/test/compress/arrays.js +++ b/test/compress/arrays.js @@ -12,3 +12,22 @@ holes_and_undefined: { z=[1,void 0,3]; } } + +constant_join: { + options = { + unsafe : true, + evaluate : true + }; + input: { + var a = [ "foo", "bar", "baz" ].join(""); + var b = [ "foo", 1, 2, 3, "bar" ].join(""); + var c = [ boo(), "foo", 1, 2, 3, "bar", bar() ].join(""); + var d = [ "foo", 1 + 2 + "bar", "baz" ].join("-"); + } + expect: { + var a = "foobarbaz"; + var b = "foo123bar"; + var c = [ boo(), "foo", 1, 2, 3, "bar", bar() ].join(""); // we could still shorten this one, but oh well. + var d = "foo-3bar-baz"; + } +}