From 5037c186e3d09c572c3ca565feecad8940ce5ff5 Mon Sep 17 00:00:00 2001 From: alexlamsl Date: Tue, 18 Apr 2017 15:27:48 +0800 Subject: [PATCH] remove constant replacement - let `reduce_vars` take care of that --- lib/compress.js | 21 +++-------- test/compress/collapse_vars.js | 65 ++++++++++++++++++---------------- 2 files changed, 39 insertions(+), 47 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index bcf904dd..38c36dc2 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -676,14 +676,18 @@ merge(Compressor.prototype, { function collapse(stat) { 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; 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. if (var_name in var_names_seen) return 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. var def = var_decl.name.definition(); if (def.references.length !== 1 @@ -696,21 +700,6 @@ merge(Compressor.prototype, { // Don't replace ref if eval() or with statement in scope. 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. if (side_effects_encountered |= lvalues_encountered) return; diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js index c37d7235..9faec6fc 100644 --- a/test/compress/collapse_vars.js +++ b/test/compress/collapse_vars.js @@ -2,7 +2,7 @@ collapse_vars_side_effects_1: { options = { 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, - 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: { function f1() { @@ -151,7 +151,7 @@ collapse_vars_issue_721: { options = { 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, - 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: { define(["require", "exports", 'handlebars'], function (require, exports, hb) { @@ -217,7 +217,7 @@ collapse_vars_properties: { options = { 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, - 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: { function f1(obj) { @@ -244,7 +244,7 @@ collapse_vars_if: { options = { 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, - 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: { function f1() { @@ -282,7 +282,10 @@ collapse_vars_if: { return "x" != "Bar" + x / 4 ? g9 : g5; } function f3(x) { - return x ? 1 : 2; + if (x) { + return 1; + } + return 2; } } } @@ -291,7 +294,7 @@ collapse_vars_while: { options = { 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, - 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: { function f1(y) { @@ -390,9 +393,9 @@ collapse_vars_do_while: { } function f3(y) { function fn(n) { console.log(n); } - var a = 2; + var a = 2, x = 7; do { - fn(a = 7); + fn(a = x); break; } while (y); } @@ -465,8 +468,9 @@ collapse_vars_do_while_drop_assign: { } function f3(y) { function fn(n) { console.log(n); } + var x = 7; do { - fn(7); + fn(x); break; } while (y); } @@ -709,7 +713,7 @@ collapse_vars_misc1: { options = { 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, - 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: { function f0(o, a, h) { @@ -786,7 +790,7 @@ collapse_vars_repeated: { options = { 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, - 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: { function f1() { @@ -809,19 +813,17 @@ collapse_vars_repeated: { } expect: { function f1() { - return -3 + return -3; } function f2(x) { - return x + return x; } (function(x){ - var a = "GOOD" + x, e = "BAD", e = a; - console.log(e + "!"); - })("!"), + console.log("GOOD!!"); + })(), (function(x){ - var a = "GOOD" + x, e = "BAD" + x, e = a; - console.log(e + "!"); - })("!"); + console.log("GOOD!!"); + })(); } expect_stdout: true } @@ -830,7 +832,7 @@ collapse_vars_closures: { options = { 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, - 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: { function constant_vars_can_be_replaced_in_any_scope() { @@ -920,7 +922,7 @@ collapse_vars_try: { options = { 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, - 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: { function f1() { @@ -1118,7 +1120,7 @@ collapse_vars_constants: { options = { 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, - 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: { function f1(x) { @@ -1156,7 +1158,7 @@ collapse_vars_arguments: { 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, keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, - toplevel:true + toplevel:true, reduce_vars:true } input: { var outer = function() { @@ -1283,6 +1285,7 @@ collapse_vars_regexp: { join_vars: true, cascade: true, side_effects: true, + reduce_vars: true, } input: { function f1() { @@ -1316,8 +1319,8 @@ collapse_vars_regexp: { }; } (function(){ - var result, s = "acdabcdeabbb", rx = /ab*/g; - while (result = rx.exec(s)) + var result, rx = /ab*/g; + while (result = rx.exec("acdabcdeabbb")) console.log(result[0]); })(); } @@ -1341,7 +1344,10 @@ issue_1537: { issue_1562: { options = { collapse_vars: true, + evaluate: true, + reduce_vars: true, toplevel: true, + unused: true, } input: { var v = 1, B = 2; @@ -1360,14 +1366,11 @@ issue_1562: { var v = 1; for (v in objs) f(2); - var x = 3; - while(x + 2) bar(10); + while(5) bar(10); - var y = 4; - do bar(20); while(y + 2); + do bar(20); while(6); - var z = 5; - for (; f(z + 2) ;) bar(30); + for (; f(7) ;) bar(30); } }