aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/compress.js37
-rw-r--r--test/compress/collapse_vars.js7
-rw-r--r--test/compress/drop-unused.js18
-rw-r--r--test/compress/hoist_props.js20
-rw-r--r--test/compress/properties.js4
5 files changed, 65 insertions, 21 deletions
diff --git a/lib/compress.js b/lib/compress.js
index e5b7bf09..18cbd05e 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -2338,10 +2338,7 @@ merge(Compressor.prototype, {
exprs = body.expressions.slice();
}
if (!exprs) return;
- if (defn instanceof AST_Definitions) {
- var def = defn.definitions[defn.definitions.length - 1];
- if (trim_assigns(def.name, def.value, exprs)) return exprs;
- }
+ var trimmed = false;
for (var i = exprs.length - 1; --i >= 0;) {
var expr = exprs[i];
if (!(expr instanceof AST_Assign)) continue;
@@ -2349,8 +2346,38 @@ merge(Compressor.prototype, {
if (!(expr.left instanceof AST_SymbolRef)) continue;
var tail = exprs.slice(i + 1);
if (!trim_assigns(expr.left, expr.right, tail)) continue;
- return exprs.slice(0, i + 1).concat(tail);
+ trimmed = true;
+ exprs = exprs.slice(0, i + 1).concat(tail);
}
+ if (defn instanceof AST_Definitions) {
+ var def = defn.definitions[defn.definitions.length - 1];
+ if (trim_assigns(def.name, def.value, exprs)) trimmed = true;
+ if (join_var_assign(defn.definitions, exprs)) trimmed = true;
+ }
+ return trimmed && exprs;
+ }
+
+ function join_var_assign(definitions, exprs) {
+ var trimmed = false;
+ while (exprs.length) {
+ var expr = exprs[0];
+ if (!(expr instanceof AST_Assign)) break;
+ if (expr.operator != "=") break;
+ var lhs = expr.left;
+ if (!(lhs instanceof AST_SymbolRef)) break;
+ var def = lhs.definition();
+ if (def.scope !== scope) break;
+ var name = make_node(AST_SymbolVar, lhs, lhs);
+ definitions.push(make_node(AST_VarDef, expr, {
+ name: name,
+ value: expr.right
+ }));
+ def.orig.push(name);
+ def.replaced++;
+ exprs.shift();
+ trimmed = true;
+ }
+ return trimmed;
}
function trim_assigns(name, value, exprs) {
diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js
index 99e57b32..a9167262 100644
--- a/test/compress/collapse_vars.js
+++ b/test/compress/collapse_vars.js
@@ -804,7 +804,7 @@ collapse_vars_assignment: {
function log(x) { return console.log(x), x; }
function f0(c) {
var a = 3 / c;
- return a = a;
+ return a;
}
function f1(c) {
return 1 - 3 / c;
@@ -2012,6 +2012,7 @@ issue_1631_3: {
join_vars: true,
sequences: true,
side_effects: true,
+ unused: true,
}
input: {
function g() {
@@ -2031,8 +2032,8 @@ issue_1631_3: {
function f() {
return a = 2, 4;
}
- var a = 0, b = 1, t = f();
- return b = a + t;
+ var a = 0, t = f();
+ return a + t;
}
console.log(g());
}
diff --git a/test/compress/drop-unused.js b/test/compress/drop-unused.js
index 99ab7b40..949106c2 100644
--- a/test/compress/drop-unused.js
+++ b/test/compress/drop-unused.js
@@ -2444,3 +2444,21 @@ issue_3746: {
}
expect_stdout: "PASS"
}
+
+join_vars_assign: {
+ options = {
+ join_vars: true,
+ unused: true,
+ }
+ input: {
+ var y, x;
+ x = Object("PAS");
+ y = Object("S");
+ console.log(x + y);
+ }
+ expect: {
+ var x = Object("PAS"), y = Object("S");
+ console.log(x + y);
+ }
+ expect_stdout: "PASS"
+}
diff --git a/test/compress/hoist_props.js b/test/compress/hoist_props.js
index c647ccc1..563c7aab 100644
--- a/test/compress/hoist_props.js
+++ b/test/compress/hoist_props.js
@@ -767,18 +767,17 @@ issue_3071_1: {
var obj = {};
obj.one = 1;
obj.two = 2;
- console.log(obj.one);
+ console.log(obj.one, obj.two);
})();
}
expect: {
- console.log(1);
+ console.log(1, 2);
}
- expect_stdout: "1"
+ expect_stdout: "1 2"
}
issue_3071_2: {
options = {
- evaluate: true,
hoist_props: true,
inline: true,
join_vars: true,
@@ -793,19 +792,18 @@ issue_3071_2: {
obj = {};
obj.one = 1;
obj.two = 2;
- console.log(obj.one);
+ console.log(obj.one, obj.two);
var obj;
})();
}
expect: {
- console.log(1);
+ console.log(1, 2);
}
- expect_stdout: "1"
+ expect_stdout: "1 2"
}
issue_3071_2_toplevel: {
options = {
- evaluate: true,
hoist_props: true,
inline: true,
join_vars: true,
@@ -821,14 +819,14 @@ issue_3071_2_toplevel: {
obj = {};
obj.one = 1;
obj.two = 2;
- console.log(obj.one);
+ console.log(obj.one, obj.two);
var obj;
})();
}
expect: {
- console.log(1);
+ console.log(1, 2);
}
- expect_stdout: "1"
+ expect_stdout: "1 2"
}
issue_3071_3: {
diff --git a/test/compress/properties.js b/test/compress/properties.js
index 9270f438..b23c362c 100644
--- a/test/compress/properties.js
+++ b/test/compress/properties.js
@@ -1875,8 +1875,8 @@ join_expr: {
expect: {
var c = "FAIL";
(function() {
- var a = 0;
- switch (a = { b: 0 }, a.b) {
+ var a = 0, a = { b: 0 };
+ switch (a.b) {
case 0:
c = "PASS";
}