aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2019-03-13 04:28:21 +0800
committerGitHub <noreply@github.com>2019-03-13 04:28:21 +0800
commit008c23613769a34e48129a5671f6ea22a989d171 (patch)
tree4fc3f5a48ba11a69c5275b68b185fae2ae6aab98
parentb1c06640665fb4f8bcfe26c8f37e5d14520e5e4c (diff)
downloadtracifyjs-008c23613769a34e48129a5671f6ea22a989d171.tar.gz
tracifyjs-008c23613769a34e48129a5671f6ea22a989d171.zip
fix corner case in `conditionals` (#3329)
fixes #3245 fixes #3257 fixes #3260 fixes #3269 fixes #3271 fixes #3278 fixes #3309 fixes #3319 fixes #3321
-rw-r--r--lib/compress.js21
-rw-r--r--test/compress/conditionals.js31
2 files changed, 49 insertions, 3 deletions
diff --git a/lib/compress.js b/lib/compress.js
index 33f472ea..61c3a268 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -6051,12 +6051,14 @@ merge(Compressor.prototype, {
if (seq_tail instanceof AST_Assign) {
var is_eq = seq_tail.operator == "=";
var alt_tail = is_eq ? alternative.tail_node() : alternative;
- if ((is_eq || consequent instanceof AST_Assign)
+ if ((is_eq || consequent === seq_tail)
&& alt_tail instanceof AST_Assign
&& seq_tail.operator == alt_tail.operator
&& seq_tail.left.equivalent_to(alt_tail.left)
- && (!condition.has_side_effects(compressor)
- || is_eq && !seq_tail.left.has_side_effects(compressor))) {
+ && (is_eq && !seq_tail.left.has_side_effects(compressor)
+ || !condition.has_side_effects(compressor)
+ && can_shift_lhs_of_tail(consequent)
+ && can_shift_lhs_of_tail(alternative))) {
return make_node(AST_Assign, self, {
operator: seq_tail.operator,
left: seq_tail.left,
@@ -6221,6 +6223,19 @@ merge(Compressor.prototype, {
}
}
+ function can_shift_lhs_of_tail(node) {
+ if (node === node.tail_node()) return true;
+ var exprs = node.expressions;
+ for (var i = exprs.length - 1; --i >= 0;) {
+ var expr = exprs[i];
+ if (!(expr instanceof AST_Assign) && expr.has_side_effects(compressor)
+ || expr.operator != "="
+ || expr.left.has_side_effects(compressor)
+ || expr.right.has_side_effects(compressor)) return false;
+ }
+ return true;
+ }
+
function pop_lhs(node) {
if (!(node instanceof AST_Sequence)) return node.right;
var exprs = node.expressions.slice();
diff --git a/test/compress/conditionals.js b/test/compress/conditionals.js
index 1c1291fe..d6d47c41 100644
--- a/test/compress/conditionals.js
+++ b/test/compress/conditionals.js
@@ -1384,3 +1384,34 @@ cond_seq_assign_3: {
}
expect_stdout: "2"
}
+
+issue_3271: {
+ options = {
+ conditionals: true,
+ }
+ input: {
+ function f(a) {
+ var i = 0, b = [];
+ if (a) {
+ b[i++] = 4,
+ b[i++] = 1;
+ } else {
+ b[i++] = 3,
+ b[i++] = 2,
+ b[i++] = 1;
+ }
+ return b;
+ }
+ console.log(f(0).pop(), f(1).pop());
+ }
+ expect: {
+ function f(a) {
+ var i = 0, b = [];
+ a ? b[i++] = 4 : (b[i++] = 3, b[i++] = 2),
+ b[i++] = 1;
+ return b;
+ }
+ console.log(f(0).pop(), f(1).pop());
+ }
+ expect_stdout: "1 1"
+}