From: Alex Lam S.L Date: Tue, 28 Feb 2017 20:12:10 +0000 (+0800) Subject: invert `reduce_vars` tracking flag (#1519) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=f5cbe19b753bf84f8b11f96e2c91a8ca49525dba;p=UglifyJS.git invert `reduce_vars` tracking flag (#1519) Modules like webpack and grunt-contrib-uglify still uses `ast.transform(compressor)` before `Compressor.compress(ast)` was introduced. Workaround this compatibility issue by deactivating `reduce_vars` in such case. Also fix use case with omitted `options` when calling `Compressor()`. fixes #1516 --- diff --git a/README.md b/README.md index 260a685d..79064d79 100644 --- a/README.md +++ b/README.md @@ -621,7 +621,7 @@ function uglify(ast, options, mangle) { // Compression uAST.figure_out_scope(); - uAST = uAST.transform(UglifyJS.Compressor(options)); + uAST = UglifyJS.Compressor(options).compress(uAST); // Mangling (optional) if (mangle) { @@ -865,7 +865,7 @@ toplevel.figure_out_scope() Like this: ```javascript var compressor = UglifyJS.Compressor(options); -var compressed_ast = toplevel.transform(compressor); +var compressed_ast = compressor.compress(toplevel); ``` The `options` can be missing. Available options are discussed above in diff --git a/lib/compress.js b/lib/compress.js index 0349e45f..b9ad8e9f 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -61,7 +61,7 @@ function Compressor(options, false_by_default) { booleans : !false_by_default, loops : !false_by_default, unused : !false_by_default, - toplevel : !!options["top_retain"], + toplevel : !!(options && options["top_retain"]), top_retain : null, hoist_funs : !false_by_default, keep_fargs : true, @@ -70,7 +70,7 @@ function Compressor(options, false_by_default) { if_return : !false_by_default, join_vars : !false_by_default, collapse_vars : !false_by_default, - reduce_vars : false, + reduce_vars : !false_by_default, cascade : !false_by_default, side_effects : !false_by_default, pure_getters : false, @@ -187,8 +187,8 @@ merge(Compressor.prototype, { if (node instanceof AST_SymbolRef) { var d = node.definition(); d.references.push(node); - if (!d.modified && (d.orig.length > 1 || isModified(node, 0))) { - d.modified = true; + if (d.fixed && (d.orig.length > 1 || isModified(node, 0))) { + d.fixed = false; } } if (node instanceof AST_Call && node.expression instanceof AST_Function) { @@ -205,7 +205,7 @@ merge(Compressor.prototype, { this.walk(tw); function reset_def(def) { - def.modified = false; + def.fixed = true; def.references = []; def.should_replace = undefined; if (unsafe && def.init) { @@ -1263,7 +1263,7 @@ merge(Compressor.prototype, { this._evaluating = true; try { var d = this.definition(); - if (compressor.option("reduce_vars") && !d.modified && d.init) { + if (compressor.option("reduce_vars") && d.fixed && d.init) { if (compressor.option("unsafe")) { if (d.init._evaluated === undefined) { d.init._evaluated = ev(d.init, compressor); @@ -3046,7 +3046,7 @@ merge(Compressor.prototype, { } if (compressor.option("evaluate") && compressor.option("reduce_vars")) { var d = self.definition(); - if (!d.modified && d.init) { + if (d.fixed && d.init) { if (d.should_replace === undefined) { var init = d.init.evaluate(compressor); if (init.length > 1) { diff --git a/test/mocha/minify.js b/test/mocha/minify.js index baac2a41..2cc800fe 100644 --- a/test/mocha/minify.js +++ b/test/mocha/minify.js @@ -182,4 +182,13 @@ describe("minify", function() { }); }); + describe("Compressor", function() { + it("should be backward compatible with ast.transform(compressor)", function() { + var ast = Uglify.parse("function f(a){for(var i=0;i