aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMihai Bazon <mihai.bazon@gmail.com>2015-04-13 17:29:48 +0300
committerMihai Bazon <mihai.bazon@gmail.com>2015-04-13 17:29:48 +0300
commit18c63ff3d806439bfb4df613156563ec050e12e9 (patch)
treef32e310e8bdba11ce51c762f5154767a89dc9b88
parente04ef562435547e286019fdee46dd0b89b9822df (diff)
downloadtracifyjs-18c63ff3d806439bfb4df613156563ec050e12e9.tar.gz
tracifyjs-18c63ff3d806439bfb4df613156563ec050e12e9.zip
Fix compression of conditionals
Don't move the condition on the right side of an assignment when the left side may have side effects. Fix #677
-rw-r--r--lib/compress.js1
-rw-r--r--test/compress/conditionals.js14
2 files changed, 13 insertions, 2 deletions
diff --git a/lib/compress.js b/lib/compress.js
index 41e4f17f..fa89c322 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -2343,6 +2343,7 @@ merge(Compressor.prototype, {
&& alternative instanceof AST_Assign
&& consequent.operator == alternative.operator
&& consequent.left.equivalent_to(alternative.left)
+ && !consequent.left.has_side_effects(compressor)
) {
/*
* Stuff like this:
diff --git a/test/compress/conditionals.js b/test/compress/conditionals.js
index e5a39229..299097be 100644
--- a/test/compress/conditionals.js
+++ b/test/compress/conditionals.js
@@ -86,7 +86,9 @@ ifs_4: {
x(foo)[10].bar.baz = something_else();
}
expect: {
- x(foo)[10].bar.baz = (foo && bar) ? something() : something_else();
+ foo && bar
+ ? x(foo)[10].bar.baz = something()
+ : x(foo)[10].bar.baz = something_else();
}
}
@@ -133,6 +135,7 @@ ifs_6: {
comparisons: true
};
input: {
+ var x;
if (!foo && !bar && !baz && !boo) {
x = 10;
} else {
@@ -140,6 +143,7 @@ ifs_6: {
}
}
expect: {
+ var x;
x = foo || bar || baz || boo ? 20 : 10;
}
}
@@ -165,6 +169,7 @@ cond_2: {
conditionals: true
};
input: {
+ var x;
if (some_condition()) {
x = new FooBar(1);
} else {
@@ -172,6 +177,7 @@ cond_2: {
}
}
expect: {
+ var x;
x = new FooBar(some_condition() ? 1 : 2);
}
}
@@ -303,6 +309,7 @@ cond_7_1: {
evaluate : true
};
input: {
+ var x;
// access to global should be assumed to have side effects
if (y) {
x = 1+1;
@@ -311,6 +318,7 @@ cond_7_1: {
}
}
expect: {
+ var x;
x = (y, 2);
}
}
@@ -321,6 +329,7 @@ cond_8: {
evaluate : true
};
input: {
+ var a;
// compress these
a = condition ? true : false;
@@ -355,6 +364,7 @@ cond_8: {
}
expect: {
+ var a;
a = !!condition;
a = !condition;
a = !!condition();
@@ -367,4 +377,4 @@ cond_8: {
a = condition ? 0 : true;
a = condition ? 1 : 0;
}
-} \ No newline at end of file
+}