remove constant replacement

- let `reduce_vars` take care of that
This commit is contained in:
alexlamsl 2017-04-18 15:27:48 +08:00
parent 761792e2e5
commit 5037c186e3
2 changed files with 39 additions and 47 deletions

View File

@ -676,14 +676,18 @@ merge(Compressor.prototype, {
function collapse(stat) { function collapse(stat) {
var var_decl = var_defs[var_defs_index]; var var_decl = var_defs[var_defs_index];
// `drop_unused()` shuffles variables without values to the top,
// so we can terminate upon first sighting as an optimization.
if (var_decl.value == null) return true; if (var_decl.value == null) return true;
var var_name = var_decl.name.name; var var_name = var_decl.name.name;
if (!var_name || !var_name.length) return true;
// Bail if we've seen a var definition of same name before. // Bail if we've seen a var definition of same name before.
if (var_name in var_names_seen) return true; if (var_name in var_names_seen) return true;
var_names_seen[var_name] = true; var_names_seen[var_name] = true;
// Only interested in non-constant values.
if (var_decl.value.is_constant()) return;
// Only interested in cases with just one reference to the variable. // Only interested in cases with just one reference to the variable.
var def = var_decl.name.definition(); var def = var_decl.name.definition();
if (def.references.length !== 1 if (def.references.length !== 1
@ -696,21 +700,6 @@ merge(Compressor.prototype, {
// Don't replace ref if eval() or with statement in scope. // Don't replace ref if eval() or with statement in scope.
if (ref.scope.uses_eval || ref.scope.uses_with) return true; if (ref.scope.uses_eval || ref.scope.uses_with) return true;
// Constant single use vars can be replaced in any scope.
if (var_decl.value.is_constant()) {
var ctt = new TreeTransformer(function(node) {
var parent = ctt.parent();
if (parent instanceof AST_IterationStatement
&& (parent.condition === node || parent.init === node)) {
return node;
}
if (node === ref)
return replace_var(var_decl, node, parent, true);
});
stat.transform(ctt);
return;
}
// Restrict var replacement to constants if side effects encountered. // Restrict var replacement to constants if side effects encountered.
if (side_effects_encountered |= lvalues_encountered) return; if (side_effects_encountered |= lvalues_encountered) return;

View File

@ -2,7 +2,7 @@ collapse_vars_side_effects_1: {
options = { options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true, collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true, comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, reduce_vars:true
} }
input: { input: {
function f1() { function f1() {
@ -151,7 +151,7 @@ collapse_vars_issue_721: {
options = { options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true, collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true, comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, reduce_vars:true
} }
input: { input: {
define(["require", "exports", 'handlebars'], function (require, exports, hb) { define(["require", "exports", 'handlebars'], function (require, exports, hb) {
@ -217,7 +217,7 @@ collapse_vars_properties: {
options = { options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true, collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true, comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, reduce_vars:true
} }
input: { input: {
function f1(obj) { function f1(obj) {
@ -244,7 +244,7 @@ collapse_vars_if: {
options = { options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true, collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true, comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, reduce_vars:true
} }
input: { input: {
function f1() { function f1() {
@ -282,7 +282,10 @@ collapse_vars_if: {
return "x" != "Bar" + x / 4 ? g9 : g5; return "x" != "Bar" + x / 4 ? g9 : g5;
} }
function f3(x) { function f3(x) {
return x ? 1 : 2; if (x) {
return 1;
}
return 2;
} }
} }
} }
@ -291,7 +294,7 @@ collapse_vars_while: {
options = { options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true, collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:false, unused:true, hoist_funs:true, comparisons:true, evaluate:true, booleans:true, loops:false, unused:true, hoist_funs:true,
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, reduce_vars:true
} }
input: { input: {
function f1(y) { function f1(y) {
@ -390,9 +393,9 @@ collapse_vars_do_while: {
} }
function f3(y) { function f3(y) {
function fn(n) { console.log(n); } function fn(n) { console.log(n); }
var a = 2; var a = 2, x = 7;
do { do {
fn(a = 7); fn(a = x);
break; break;
} while (y); } while (y);
} }
@ -465,8 +468,9 @@ collapse_vars_do_while_drop_assign: {
} }
function f3(y) { function f3(y) {
function fn(n) { console.log(n); } function fn(n) { console.log(n); }
var x = 7;
do { do {
fn(7); fn(x);
break; break;
} while (y); } while (y);
} }
@ -709,7 +713,7 @@ collapse_vars_misc1: {
options = { options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true, collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true, comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, reduce_vars:true
} }
input: { input: {
function f0(o, a, h) { function f0(o, a, h) {
@ -786,7 +790,7 @@ collapse_vars_repeated: {
options = { options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true, collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true, comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, reduce_vars:true
} }
input: { input: {
function f1() { function f1() {
@ -809,19 +813,17 @@ collapse_vars_repeated: {
} }
expect: { expect: {
function f1() { function f1() {
return -3 return -3;
} }
function f2(x) { function f2(x) {
return x return x;
} }
(function(x){ (function(x){
var a = "GOOD" + x, e = "BAD", e = a; console.log("GOOD!!");
console.log(e + "!"); })(),
})("!"),
(function(x){ (function(x){
var a = "GOOD" + x, e = "BAD" + x, e = a; console.log("GOOD!!");
console.log(e + "!"); })();
})("!");
} }
expect_stdout: true expect_stdout: true
} }
@ -830,7 +832,7 @@ collapse_vars_closures: {
options = { options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true, collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true, comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, reduce_vars:true
} }
input: { input: {
function constant_vars_can_be_replaced_in_any_scope() { function constant_vars_can_be_replaced_in_any_scope() {
@ -920,7 +922,7 @@ collapse_vars_try: {
options = { options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true, collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true, comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, reduce_vars:true
} }
input: { input: {
function f1() { function f1() {
@ -1118,7 +1120,7 @@ collapse_vars_constants: {
options = { options = {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true, collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true, comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, reduce_vars:true
} }
input: { input: {
function f1(x) { function f1(x) {
@ -1156,7 +1158,7 @@ collapse_vars_arguments: {
collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true, collapse_vars:true, sequences:true, properties:true, dead_code:true, conditionals:true,
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true, comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true,
toplevel:true toplevel:true, reduce_vars:true
} }
input: { input: {
var outer = function() { var outer = function() {
@ -1283,6 +1285,7 @@ collapse_vars_regexp: {
join_vars: true, join_vars: true,
cascade: true, cascade: true,
side_effects: true, side_effects: true,
reduce_vars: true,
} }
input: { input: {
function f1() { function f1() {
@ -1316,8 +1319,8 @@ collapse_vars_regexp: {
}; };
} }
(function(){ (function(){
var result, s = "acdabcdeabbb", rx = /ab*/g; var result, rx = /ab*/g;
while (result = rx.exec(s)) while (result = rx.exec("acdabcdeabbb"))
console.log(result[0]); console.log(result[0]);
})(); })();
} }
@ -1341,7 +1344,10 @@ issue_1537: {
issue_1562: { issue_1562: {
options = { options = {
collapse_vars: true, collapse_vars: true,
evaluate: true,
reduce_vars: true,
toplevel: true, toplevel: true,
unused: true,
} }
input: { input: {
var v = 1, B = 2; var v = 1, B = 2;
@ -1360,14 +1366,11 @@ issue_1562: {
var v = 1; var v = 1;
for (v in objs) f(2); for (v in objs) f(2);
var x = 3; while(5) bar(10);
while(x + 2) bar(10);
var y = 4; do bar(20); while(6);
do bar(20); while(y + 2);
var z = 5; for (; f(7) ;) bar(30);
for (; f(z + 2) ;) bar(30);
} }
} }