From: Mihai Bazon Date: Wed, 6 Nov 2013 08:47:36 +0000 (+0200) Subject: Better fix for #343 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=eab99a1c;p=UglifyJS.git Better fix for #343 We can in fact lift sequences, but only if the operation is assignment and the left-hand side has no side effects nor property access -- that should guarantee that whatever we place before it cannot affect the sense of the assignment. Dropped contrived test case (too hard to support it now), added a more meaningful one. --- diff --git a/lib/compress.js b/lib/compress.js index 59caa15c..f44277cd 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1865,6 +1865,14 @@ merge(Compressor.prototype, { return self.evaluate(compressor)[0]; }); + function has_side_effects_or_prop_access(node, compressor) { + var save_pure_getters = compressor.option("pure_getters"); + compressor.options.pure_getters = false; + var ret = node.has_side_effects(compressor); + compressor.options.pure_getters = save_pure_getters; + return ret; + } + AST_Binary.DEFMETHOD("lift_sequences", function(compressor){ if (compressor.option("sequences")) { if (this.left instanceof AST_Seq) { @@ -1875,6 +1883,16 @@ merge(Compressor.prototype, { seq = AST_Seq.from_array(x).transform(compressor); return seq; } + if (this.right instanceof AST_Seq + && this instanceof AST_Assign + && !has_side_effects_or_prop_access(this.left, compressor)) { + var seq = this.right; + var x = seq.to_array(); + this.right = x.pop(); + x.push(this); + seq = AST_Seq.from_array(x).transform(compressor); + return seq; + } } return this; }); diff --git a/test/compress/sequences.js b/test/compress/sequences.js index 6f63ace4..46695714 100644 --- a/test/compress/sequences.js +++ b/test/compress/sequences.js @@ -101,10 +101,12 @@ lift_sequences_1: { lift_sequences_2: { options = { sequences: true, evaluate: true }; input: { - q = 1 + (foo(), bar(), 5) + 7 * (5 / (3 - (a(), (QW=ER), c(), 2))) - (x(), y(), 5); + foo.x = (foo = {}, 10); + bar = (bar = {}, 10); } expect: { - foo(), bar(), a(), QW = ER, c(), x(), y(), q = 36 + foo.x = (foo = {}, 10), + bar = {}, bar = 10; } }