From 8646b15314d656408de7a734f32a0f49be9bd3b5 Mon Sep 17 00:00:00 2001 From: alexlamsl Date: Tue, 20 Sep 2016 22:23:27 +0800 Subject: [PATCH] optimize unmodified variables --- lib/compress.js | 3 +- lib/scope.js | 11 ++++--- test/compress/reduce_vars.js | 60 ++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 test/compress/reduce_vars.js diff --git a/lib/compress.js b/lib/compress.js index 8a08572f..bfb476cf 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -67,6 +67,7 @@ function Compressor(options, false_by_default) { if_return : !false_by_default, join_vars : !false_by_default, collapse_vars : false, + reduce_vars : false, cascade : !false_by_default, side_effects : !false_by_default, pure_getters : false, @@ -1107,7 +1108,7 @@ merge(Compressor.prototype, { this._evaluating = true; try { var d = this.definition(); - if (d && d.constant && d.init) { + if (d && (d.constant || compressor.option("reduce_vars") && !d.global && !d.modified) && d.init) { return ev(d.init, compressor); } } finally { diff --git a/lib/scope.js b/lib/scope.js index 606a5a2f..32059c07 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -197,7 +197,8 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){ } if (node instanceof AST_SymbolRef) { var name = node.name; - if (name == "eval" && tw.parent() instanceof AST_Call) { + var parent = tw.parent(); + if (name == "eval" && parent instanceof AST_Call) { for (var s = node.scope; s && !s.uses_eval; s = s.parent_scope) { s.uses_eval = true; } @@ -213,12 +214,14 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){ g.global = true; globals.set(name, g); } - node.thedef = g; + sym = g; if (func && name == "arguments") { func.uses_arguments = true; } - } else { - node.thedef = sym; + } + node.thedef = sym; + if (parent instanceof AST_Assign || parent instanceof AST_Unary && (parent.operator === '++' || parent.operator === '--')) { + sym.modified = true; } node.reference(); return true; diff --git a/test/compress/reduce_vars.js b/test/compress/reduce_vars.js new file mode 100644 index 00000000..144f4239 --- /dev/null +++ b/test/compress/reduce_vars.js @@ -0,0 +1,60 @@ +reduce_vars: { + options = { + conditionals : true, + evaluate : true, + global_defs : { + C : 0 + }, + reduce_vars : true, + unused : true + } + input: { + var A = 1; + (function f0() { + var a = 2; + console.log(a - 5); + console.log(A - 5); + })(); + (function f1() { + var a = 2; + console.log(a - 5); + eval("console.log(a);"); + })(); + (function f2(eval) { + var a = 2; + console.log(a - 5); + eval("console.log(a);"); + })(eval); + (function f3() { + var b = typeof C !== "undefined"; + var c = 4; + if (b) { + return 'yes'; + } else { + return 'no'; + } + })(); + console.log(A + 1); + } + expect: { + var A = 1; + (function() { + console.log(-3); + console.log(A - 5); + })(); + (function f1() { + var a = 2; + console.log(-3); + eval("console.log(a);"); + })(); + (function f2(eval) { + var a = 2; + console.log(-3); + eval("console.log(a);"); + })(eval); + (function() { + return "yes"; + })(); + console.log(A + 1); + } +}