aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMihai Bazon <mihai@bazon.net>2012-10-30 14:50:47 +0200
committerMihai Bazon <mihai@bazon.net>2012-10-30 14:50:47 +0200
commitabe0ebbf026bcf1ac280f160de8621071681b2b9 (patch)
tree7a916efe1969ac1ed37a1e53a0f0e0cbe12ab815
parent0852f5595edbceb1b8626c7214fcc6c17bf271e9 (diff)
downloadtracifyjs-abe0ebbf026bcf1ac280f160de8621071681b2b9.tar.gz
tracifyjs-abe0ebbf026bcf1ac280f160de8621071681b2b9.zip
don't move expressions containing the binary `in` operator into the `for` initializer
(opera can't parse it) close #25
-rw-r--r--lib/compress.js23
-rw-r--r--test/compress/sequences.js32
2 files changed, 49 insertions, 6 deletions
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;);
+ }
+}