From: Mihai Bazon Date: Tue, 30 Oct 2012 12:50:47 +0000 (+0200) Subject: don't move expressions containing the binary `in` operator into the `for` initializer X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=abe0ebbf026bcf1ac280f160de8621071681b2b9;p=UglifyJS.git don't move expressions containing the binary `in` operator into the `for` initializer (opera can't parse it) close #25 --- diff --git a/lib/compress.js b/lib/compress.js index 2ea91d0c..ee255d78 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -427,12 +427,23 @@ merge(Compressor.prototype, { var ret = [], prev = null; statements.forEach(function(stat){ if (prev) { - if (stat instanceof AST_For && stat.init && !(stat.init instanceof AST_Definitions)) { - stat.init = cons_seq(stat.init); - } - else if (stat instanceof AST_For && !stat.init) { - stat.init = prev.body; - ret.pop(); + if (stat instanceof AST_For) { + var opera = {}; + try { + prev.body.walk(new TreeWalker(function(node){ + if (node instanceof AST_Binary && node.operator == "in") + throw opera; + })); + if (stat.init && !(stat.init instanceof AST_Definitions)) { + stat.init = cons_seq(stat.init); + } + else if (!stat.init) { + stat.init = prev.body; + ret.pop(); + } + } catch(ex) { + if (ex !== opera) throw ex; + } } else if (stat instanceof AST_If) { stat.condition = cons_seq(stat.condition); diff --git a/test/compress/sequences.js b/test/compress/sequences.js index d48eced2..6f63ace4 100644 --- a/test/compress/sequences.js +++ b/test/compress/sequences.js @@ -127,3 +127,35 @@ lift_sequences_4: { x = baz; } } + +for_sequences: { + options = { sequences: true }; + input: { + // 1 + foo(); + bar(); + for (; false;); + // 2 + foo(); + bar(); + for (x = 5; false;); + // 3 + x = (foo in bar); + for (; false;); + // 4 + x = (foo in bar); + for (y = 5; false;); + } + expect: { + // 1 + for (foo(), bar(); false;); + // 2 + for (foo(), bar(), x = 5; false;); + // 3 + x = (foo in bar); + for (; false;); + // 4 + x = (foo in bar); + for (y = 5; false;); + } +}