diff --git a/README.md b/README.md index 00b48fe3..bc8a90bf 100644 --- a/README.md +++ b/README.md @@ -706,6 +706,11 @@ If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.u Specify `"strict"` to treat `foo.bar` as side-effect-free only when `foo` is certain to not throw, i.e. not `null` or `undefined`. +- `reduce_funcs` (default: `true`) -- Allows single-use functions + to be inlined as function expressions when permissible. + Enabled by default. Option depends on `reduce_vars` being enabled. + For speed critical code this option should be disabled. + - `reduce_vars` (default: `true`) -- Improve optimization on variables assigned with and used as constant values. diff --git a/lib/compress.js b/lib/compress.js index 432755b1..7d1bd889 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -78,6 +78,7 @@ function Compressor(options, false_by_default) { properties : !false_by_default, pure_getters : !false_by_default && "strict", pure_funcs : null, + reduce_funcs : !false_by_default, reduce_vars : !false_by_default, sequences : !false_by_default, side_effects : !false_by_default, @@ -320,20 +321,14 @@ merge(Compressor.prototype, { if (node instanceof AST_SymbolRef) { var d = node.definition(); d.references.push(node); + var value; if (d.fixed === undefined || !safe_to_read(d) || d.single_use == "m") { d.fixed = false; } else if (d.fixed) { - var value = node.fixed_value(); + value = node.fixed_value(); if (value && ref_once(d) && !compressor.exposed(d)) { - if (value instanceof AST_Lambda) { - d.single_use = d.scope === node.scope - && !(d.orig[0] instanceof AST_SymbolFunarg) - || value.is_constant_expression(node.scope); - } else { - d.single_use = d.scope === node.scope - && loop_ids[d.id] === in_loop - && value.is_constant_expression(); - } + d.single_use = value instanceof AST_Lambda + || d.scope === node.scope && value.is_constant_expression(); } else { d.single_use = false; } @@ -343,10 +338,9 @@ merge(Compressor.prototype, { } else { d.fixed = false; } - } else { - mark_escaped(d, node, value, 0); } } + mark_escaped(d, node, value, 0); } if (node instanceof AST_SymbolCatch) { node.definition().fixed = false; @@ -397,11 +391,9 @@ merge(Compressor.prototype, { d.fixed = false; } else { d.fixed = node; + loop_ids[d.id] = in_loop; mark(d, true); - if (ref_once(d)) { - d.single_use = d.scope === d.references[0].scope - || node.is_constant_expression(d.references[0].scope); - } + d.single_use = ref_once(d); } var save_ids = safe_ids; safe_ids = Object.create(null); @@ -593,7 +585,11 @@ merge(Compressor.prototype, { } function ref_once(def) { - return unused && !def.scope.uses_eval && !def.scope.uses_with && def.references.length == 1; + return unused + && !def.scope.uses_eval + && !def.scope.uses_with + && def.references.length == 1 + && loop_ids[def.id] === in_loop; } function is_immutable(value) { @@ -630,8 +626,11 @@ merge(Compressor.prototype, { && parent.expression === node && (!(value instanceof AST_Function) || value.contains_this(parent))) { return true; - } else if (parent instanceof AST_Array || parent instanceof AST_Object) { + } else if (parent instanceof AST_Array) { return is_modified(parent, parent, level + 1); + } else if (parent instanceof AST_ObjectKeyVal && node === parent.value) { + var obj = tw.parent(level + 1); + return is_modified(obj, obj, level + 2); } else if (parent instanceof AST_PropAccess && parent.expression === node) { return !immutable && is_modified(parent, read_property(value, parent.property), level + 1); } @@ -639,19 +638,19 @@ merge(Compressor.prototype, { function mark_escaped(d, node, value, level) { var parent = tw.parent(level); - if (value instanceof AST_Constant - || value instanceof AST_Function - || value instanceof AST_ClassExpression) { - return; - } + if (value instanceof AST_Constant || value instanceof AST_ClassExpression) return; + if (level > 0 && value instanceof AST_Function) return; if (parent instanceof AST_Assign && parent.operator == "=" && node === parent.right || parent instanceof AST_Call && node !== parent.expression || parent instanceof AST_Return && node === parent.value && node.scope !== d.scope || parent instanceof AST_VarDef && node === parent.value) { d.escaped = true; return; - } else if (parent instanceof AST_Array || parent instanceof AST_Object) { + } else if (parent instanceof AST_Array) { mark_escaped(d, parent, parent, level + 1); + } else if (parent instanceof AST_ObjectKeyVal && node === parent.value) { + var obj = tw.parent(level + 1); + mark_escaped(d, obj, obj, level + 2); } else if (parent instanceof AST_PropAccess && node === parent.expression) { value = read_property(value, parent.property); mark_escaped(d, parent, value, level + 1); @@ -1136,7 +1135,7 @@ merge(Compressor.prototype, { var found = false; return statements[stat_index].transform(new TreeTransformer(function(node, descend, in_list) { if (found) return node; - if (node === expr) { + if (node === expr || node.body === expr) { found = true; if (node instanceof AST_VarDef) { drop_decl(node.name.definition()); @@ -1150,7 +1149,6 @@ merge(Compressor.prototype, { case 0: return null; case 1: return node.expressions[0]; } - if (node instanceof AST_SimpleStatement && !node.body) return null; })); } @@ -2324,7 +2322,10 @@ merge(Compressor.prototype, { && !self.variables.has(def.name)) { if (scope) { var scope_def = scope.find_variable(node); - if (def.undeclared ? !scope_def : scope_def === def) return true; + if (def.undeclared ? !scope_def : scope_def === def) { + result = "f"; + return true; + } } result = false; } @@ -4472,6 +4473,17 @@ merge(Compressor.prototype, { return self; }); + function recursive_ref(compressor, def) { + var node; + for (var i = 0; node = compressor.parent(i); i++) { + if (node instanceof AST_Lambda) { + var name = node.name; + if (name && name.definition() === def) break; + } + } + return node; + } + OPT(AST_SymbolRef, function(self, compressor){ var def = self.resolve_defines(compressor); if (def) { @@ -4497,20 +4509,24 @@ merge(Compressor.prototype, { if (fixed instanceof AST_Defun) { d.fixed = fixed = make_node(AST_Function, fixed, fixed); } - if (fixed && d.single_use) { - var recurse; - if (fixed instanceof AST_Function) { - for (var i = 0; recurse = compressor.parent(i); i++) { - if (recurse instanceof AST_Lambda) { - var name = recurse.name; - if (name && name.definition() === d) break; - } + if (d.single_use && fixed instanceof AST_Function) { + if (!compressor.option("reduce_funcs") && d.scope !== self.scope) { + d.single_use = false; + } else if (d.escaped && d.scope !== self.scope || recursive_ref(compressor, d)) { + d.single_use = false; + } else if (d.scope !== self.scope || d.orig[0] instanceof AST_SymbolFunarg) { + d.single_use = fixed.is_constant_expression(self.scope); + if (d.single_use == "f") { + var scope = self.scope; + do { + if (scope.name) scope.name.definition().single_use = false; + } while (scope = scope.parent_scope); } } - if (!recurse) { - var value = fixed.optimize(compressor); - return value === fixed ? fixed.clone(true) : value; - } + } + if (d.single_use && fixed) { + var value = fixed.optimize(compressor); + return value === fixed ? fixed.clone(true) : value; } if (fixed && d.should_replace === undefined) { var init; diff --git a/package.json b/package.json index ff4d7845..91078a2a 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "homepage": "https://github.com/mishoo/UglifyJS2/tree/harmony", "author": "Mihai Bazon (http://lisperator.net/)", "license": "BSD-2-Clause", - "version": "3.1.8", + "version": "3.1.9", "engines": { "node": ">=0.8.0" }, diff --git a/test/compress/arrays.js b/test/compress/arrays.js index 5bf99e42..d84a9a8e 100644 --- a/test/compress/arrays.js +++ b/test/compress/arrays.js @@ -204,6 +204,7 @@ constant_join_3: { for_loop: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unsafe: true, unused: true, @@ -260,6 +261,7 @@ for_loop: { index: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unsafe: true, @@ -278,6 +280,7 @@ index: { length: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unsafe: true, @@ -296,6 +299,7 @@ length: { index_length: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unsafe: true, diff --git a/test/compress/arrow.js b/test/compress/arrow.js index b9d884f5..07a2b753 100644 --- a/test/compress/arrow.js +++ b/test/compress/arrow.js @@ -288,6 +288,7 @@ issue_2105_1: { ecma: 6, inline: true, passes: 3, + reduce_funcs: true, reduce_vars: true, side_effects: true, unsafe_methods: true, @@ -330,6 +331,7 @@ issue_2105_2: { collapse_vars: true, inline: true, passes: 2, + reduce_funcs: true, reduce_vars: true, side_effects: true, unused: true, @@ -401,6 +403,7 @@ issue_2136_3: { evaluate: true, inline: true, passes: 3, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -428,6 +431,7 @@ call_args: { ecma: 6, evaluate: true, inline: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -452,6 +456,7 @@ call_args_drop_param: { evaluate: true, inline: true, keep_fargs: false, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -499,6 +504,7 @@ issue_2084: { evaluate: true, inline: true, passes: 2, + reduce_funcs: true, reduce_vars: true, sequences: true, side_effects: true, diff --git a/test/compress/async.js b/test/compress/async.js index 1874e8c9..f000ba8d 100644 --- a/test/compress/async.js +++ b/test/compress/async.js @@ -141,6 +141,7 @@ async_inline: { evaluate: true, inline: true, negate_iife: true, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js index ee6a7366..7c76c032 100644 --- a/test/compress/collapse_vars.js +++ b/test/compress/collapse_vars.js @@ -2,7 +2,8 @@ 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, reduce_vars:true + keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, + reduce_funcs: true, reduce_vars:true } input: { function f1() { @@ -150,7 +151,8 @@ 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, reduce_vars:true + keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, + reduce_funcs: true, reduce_vars:true } input: { define(["require", "exports", 'handlebars'], function (require, exports, hb) { @@ -216,7 +218,8 @@ 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, reduce_vars:true + keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, + reduce_funcs: true, reduce_vars:true } input: { function f1(obj) { @@ -243,7 +246,8 @@ 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, reduce_vars:true + keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, + reduce_funcs: true, reduce_vars:true } input: { function f1() { @@ -293,7 +297,8 @@ 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, reduce_vars:true + keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, + reduce_funcs: true, reduce_vars:true } input: { function f1(y) { @@ -712,7 +717,8 @@ 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, reduce_vars:true + keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, + reduce_funcs: true, reduce_vars:true } input: { function f0(o, a, h) { @@ -789,7 +795,8 @@ 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, reduce_vars:true + keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, + reduce_funcs: true, reduce_vars:true } input: { function f1() { @@ -831,7 +838,8 @@ 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, reduce_vars:true + keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, + reduce_funcs: true, reduce_vars:true } input: { function constant_vars_can_be_replaced_in_any_scope() { @@ -921,7 +929,8 @@ 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, reduce_vars:true + keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, + reduce_funcs: true, reduce_vars:true } input: { function f1() { @@ -1118,7 +1127,8 @@ 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, reduce_vars:true + keep_fargs:true, if_return:true, join_vars:true, cascade:true, side_effects:true, + reduce_funcs: true, reduce_vars:true } input: { function f1(x) { @@ -1156,7 +1166,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, reduce_vars:true + toplevel:true, reduce_funcs: true, reduce_vars:true } input: { var outer = function() { @@ -1280,6 +1290,7 @@ collapse_vars_regexp: { hoist_funs: true, keep_fargs: true, loops: false, + reduce_funcs: true, reduce_vars: true, side_effects: true, unused: true, @@ -1454,6 +1465,7 @@ issue_1562: { options = { collapse_vars: true, evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -1710,6 +1722,7 @@ var_side_effects_3: { reduce_vars_assign: { options = { collapse_vars: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -1732,6 +1745,7 @@ reduce_vars_assign: { iife_1: { options = { collapse_vars: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -1752,6 +1766,7 @@ iife_1: { iife_2: { options = { collapse_vars: true, + reduce_funcs: false, reduce_vars: false, toplevel: true, unused: false, @@ -2204,6 +2219,7 @@ unused_orig: { options = { collapse_vars: true, passes: 2, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -2242,6 +2258,7 @@ issue_315: { collapse_vars: true, evaluate: true, keep_fargs: false, + reduce_funcs: true, reduce_vars: true, sequences: true, unused: true, @@ -2578,6 +2595,7 @@ issue_2250_1: { collapse_vars: true, conditionals: true, passes: 2, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -2618,6 +2636,7 @@ issue_2250_2: { options = { collapse_vars: true, passes: 2, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -2647,6 +2666,7 @@ issue_2250_2: { issue_2298: { options = { collapse_vars: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -3012,6 +3032,7 @@ issue_2364_5: { evaluate: true, pure_getters: true, properties: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -3314,6 +3335,8 @@ issue_2437: { conditionals: true, inline: true, join_vars: true, + passes: 2, + reduce_funcs: true, reduce_vars: true, side_effects: true, sequences: true, diff --git a/test/compress/comparing.js b/test/compress/comparing.js index 11804cbb..e374b585 100644 --- a/test/compress/comparing.js +++ b/test/compress/comparing.js @@ -96,6 +96,7 @@ self_comparison_1: { self_comparison_2: { options = { comparisons: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, } diff --git a/test/compress/const.js b/test/compress/const.js index a88d5946..f2f332e1 100644 --- a/test/compress/const.js +++ b/test/compress/const.js @@ -12,6 +12,7 @@ issue_1191: { join_vars : true, sequences : false, collapse_vars : false, + reduce_funcs : true, reduce_vars : true, } input: { @@ -44,6 +45,7 @@ issue_1194: { join_vars : true, sequences : false, collapse_vars : false, + reduce_funcs : true, reduce_vars : true, } input: { @@ -72,6 +74,7 @@ issue_1396: { join_vars : true, sequences : false, collapse_vars : false, + reduce_funcs : true, reduce_vars : true, } input: { @@ -143,6 +146,7 @@ regexp_literal_not_const: { join_vars : true, sequences : false, collapse_vars : false, + reduce_funcs : true, reduce_vars : true, } input: { diff --git a/test/compress/dead-code.js b/test/compress/dead-code.js index 660fc530..9b6bdc23 100644 --- a/test/compress/dead-code.js +++ b/test/compress/dead-code.js @@ -202,6 +202,7 @@ dead_code_const_declaration: { booleans : true, conditionals : true, evaluate : true, + reduce_funcs : true, reduce_vars : true, }; input: { @@ -229,6 +230,7 @@ dead_code_const_annotation: { booleans : true, conditionals : true, evaluate : true, + reduce_funcs : true, reduce_vars : true, toplevel : true, }; @@ -281,6 +283,7 @@ dead_code_const_annotation_complex_scope: { booleans : true, conditionals : true, evaluate : true, + reduce_funcs : true, reduce_vars : true, toplevel : true, }; @@ -439,6 +442,7 @@ global_timeout_and_interval_symbols: { issue_2233_2: { options = { pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, side_effects: true, unsafe: true, @@ -470,6 +474,7 @@ issue_2233_2: { issue_2233_3: { options = { pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, diff --git a/test/compress/destructuring.js b/test/compress/destructuring.js index cfda28db..cdab6648 100644 --- a/test/compress/destructuring.js +++ b/test/compress/destructuring.js @@ -262,6 +262,7 @@ destructuring_dont_evaluate_with_undefined_as_default_assignment: { reduce_vars: { options = { + reduce_funcs: true, reduce_vars: true, } input: { diff --git a/test/compress/drop-unused.js b/test/compress/drop-unused.js index e6cc94fe..577e2b35 100644 --- a/test/compress/drop-unused.js +++ b/test/compress/drop-unused.js @@ -733,6 +733,7 @@ drop_value: { const_assign: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -785,6 +786,7 @@ issue_1539: { vardef_value: { options = { keep_fnames: false, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -846,6 +848,7 @@ assign_chain: { issue_1583: { options = { keep_fargs: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1200,6 +1203,7 @@ var_catch_toplevel: { options = { conditionals: true, negate_iife: true, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -1298,7 +1302,8 @@ issue_2105_1: { options = { collapse_vars: true, inline: true, - passes: 2, + passes: 3, + reduce_funcs: true, reduce_vars: true, side_effects: true, unused: true, @@ -1338,9 +1343,10 @@ issue_2105_2: { options = { collapse_vars: true, inline: true, - passes: 2, + passes: 3, properties: true, pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, side_effects: true, unsafe: true, @@ -1422,6 +1428,7 @@ issue_2136_3: { evaluate: true, inline: true, passes: 3, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, diff --git a/test/compress/evaluate.js b/test/compress/evaluate.js index 64c5c965..7ba84d5d 100644 --- a/test/compress/evaluate.js +++ b/test/compress/evaluate.js @@ -345,6 +345,7 @@ unsafe_constant: { unsafe_object: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unsafe: true, @@ -373,6 +374,7 @@ unsafe_object: { unsafe_object_nested: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unsafe: true, @@ -401,6 +403,7 @@ unsafe_object_nested: { unsafe_object_complex: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unsafe: true, @@ -429,6 +432,7 @@ unsafe_object_complex: { unsafe_object_repeated: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unsafe: true, @@ -457,6 +461,7 @@ unsafe_object_repeated: { unsafe_object_accessor: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unsafe: true, } @@ -757,6 +762,7 @@ call_args: { options = { evaluate: true, inline: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -779,6 +785,7 @@ call_args_drop_param: { evaluate: true, inline: true, keep_fargs: false, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1109,6 +1116,7 @@ Infinity_NaN_undefined_LHS: { issue_1964_1: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unsafe_regexp: false, unused: true, @@ -1138,6 +1146,7 @@ issue_1964_1: { issue_1964_2: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unsafe_regexp: true, unused: true, @@ -1294,6 +1303,7 @@ issue_2231_2: { self_comparison_1: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unsafe: true, @@ -1314,6 +1324,7 @@ self_comparison_2: { evaluate: true, hoist_props: true, passes: 2, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, diff --git a/test/compress/export.js b/test/compress/export.js index 1032b73e..aad0238d 100644 --- a/test/compress/export.js +++ b/test/compress/export.js @@ -124,6 +124,7 @@ async_func: { issue_2134_1: { options = { keep_fargs: false, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -141,6 +142,7 @@ issue_2134_1: { issue_2134_2: { options = { keep_fargs: false, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, diff --git a/test/compress/functions.js b/test/compress/functions.js index f9b4ccee..1093d1f1 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -19,6 +19,7 @@ iifes_returning_constants_keep_fargs_true: { booleans : true, if_return : true, join_vars : true, + reduce_funcs : true, reduce_vars : true, cascade : true, inline : true, @@ -55,6 +56,7 @@ iifes_returning_constants_keep_fargs_false: { booleans : true, if_return : true, join_vars : true, + reduce_funcs : true, reduce_vars : true, cascade : true, inline : true, @@ -101,6 +103,7 @@ issue_1841_1: { options = { keep_fargs: false, pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -127,6 +130,7 @@ issue_1841_2: { options = { keep_fargs: false, pure_getters: false, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -154,6 +158,7 @@ function_returning_constant_literal: { inline: true, passes: 2, properties: true, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -305,6 +310,7 @@ issue_2084: { evaluate: true, inline: true, passes: 2, + reduce_funcs: true, reduce_vars: true, sequences: true, side_effects: true, @@ -340,6 +346,7 @@ issue_2084: { issue_2097: { options = { negate_iife: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -513,8 +520,9 @@ issue_2428: { options = { collapse_vars: true, inline: true, - passes: 2, + passes: 3, pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, diff --git a/test/compress/harmony.js b/test/compress/harmony.js index f2e68b17..17f70199 100644 --- a/test/compress/harmony.js +++ b/test/compress/harmony.js @@ -736,6 +736,7 @@ object_spread_unsafe: { evaluate: true, join_vars: true, passes: 3, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -903,6 +904,7 @@ issue_2349b: { inline: true, passes: 3, properties: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, side_effects: true, diff --git a/test/compress/hoist_props.js b/test/compress/hoist_props.js index 6d612816..d8208788 100644 --- a/test/compress/hoist_props.js +++ b/test/compress/hoist_props.js @@ -3,6 +3,7 @@ issue_2377_1: { evaluate: true, inline: true, hoist_props: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -35,6 +36,7 @@ issue_2377_2: { inline: true, hoist_props: true, passes: 2, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -66,6 +68,7 @@ issue_2377_3: { inline: true, hoist_props: true, passes: 3, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -92,6 +95,7 @@ issue_2377_3: { direct_access_1: { options = { hoist_props: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -120,6 +124,7 @@ direct_access_1: { direct_access_2: { options = { hoist_props: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -143,6 +148,7 @@ direct_access_2: { direct_access_3: { options = { hoist_props: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -163,6 +169,7 @@ direct_access_3: { single_use: { options = { hoist_props: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -187,6 +194,7 @@ single_use: { name_collision_1: { options = { hoist_props: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, } @@ -224,6 +232,7 @@ name_collision_1: { name_collision_2: { options = { hoist_props: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, } @@ -257,6 +266,7 @@ name_collision_2: { name_collision_3: { options = { hoist_props: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, } @@ -293,6 +303,7 @@ contains_this_1: { hoist_props: true, inline: true, passes: 2, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -318,6 +329,7 @@ contains_this_2: { hoist_props: true, inline: true, passes: 2, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -345,6 +357,7 @@ contains_this_3: { hoist_props: true, inline: true, passes: 2, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -378,6 +391,7 @@ hoist_class: { inline: true, keep_fnames: true, passes: 2, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -420,6 +434,7 @@ hoist_class_with_new: { inline: true, keep_fnames: true, passes: 2, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -461,6 +476,7 @@ hoist_function_with_call: { inline: true, keep_fnames: true, passes: 2, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -490,6 +506,7 @@ new_this: { hoist_props: true, inline: true, passes: 2, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -515,6 +532,7 @@ new_this: { issue_2462: { options = { hoist_props: true, + reduce_funcs: true, reduce_vars: true, } input: { diff --git a/test/compress/issue-1041.js b/test/compress/issue-1041.js index cdbc22cc..33244ce7 100644 --- a/test/compress/issue-1041.js +++ b/test/compress/issue-1041.js @@ -14,6 +14,7 @@ const_declaration: { const_pragma: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, }; @@ -29,6 +30,7 @@ const_pragma: { not_const: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, }; diff --git a/test/compress/issue-1609.js b/test/compress/issue-1609.js index dffa54a5..d8e82263 100644 --- a/test/compress/issue-1609.js +++ b/test/compress/issue-1609.js @@ -2,6 +2,7 @@ chained_evaluation_1: { options = { collapse_vars: true, evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -28,6 +29,7 @@ chained_evaluation_2: { options = { collapse_vars: true, evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } diff --git a/test/compress/issue-1656.js b/test/compress/issue-1656.js index c4c8f863..3971ceaa 100644 --- a/test/compress/issue-1656.js +++ b/test/compress/issue-1656.js @@ -15,6 +15,7 @@ f7: { negate_iife: true, passes: 3, properties: true, + reduce_funcs: true, reduce_vars: true, sequences: true, side_effects: true, diff --git a/test/compress/issue-1673.js b/test/compress/issue-1673.js index 081b0e5f..88e1fa8d 100644 --- a/test/compress/issue-1673.js +++ b/test/compress/issue-1673.js @@ -1,5 +1,6 @@ side_effects_catch: { options = { + reduce_funcs: true, reduce_vars: true, side_effects: true, unused: true, @@ -34,6 +35,7 @@ side_effects_catch: { side_effects_else: { options = { + reduce_funcs: true, reduce_vars: true, side_effects: true, unused: true, @@ -62,6 +64,7 @@ side_effects_else: { side_effects_finally: { options = { + reduce_funcs: true, reduce_vars: true, side_effects: true, unused: true, @@ -98,6 +101,7 @@ side_effects_finally: { side_effects_label: { options = { + reduce_funcs: true, reduce_vars: true, side_effects: true, unused: true, @@ -130,6 +134,7 @@ side_effects_label: { side_effects_switch: { options = { + reduce_funcs: true, reduce_vars: true, side_effects: true, unused: true, diff --git a/test/compress/issue-1787.js b/test/compress/issue-1787.js index 2b5372be..fcef6148 100644 --- a/test/compress/issue-1787.js +++ b/test/compress/issue-1787.js @@ -2,6 +2,7 @@ unary_prefix: { options = { evaluate: true, inline: true, + reduce_funcs: true, reduce_vars: true, unused: true, } diff --git a/test/compress/issue-1833.js b/test/compress/issue-1833.js index e46dd046..4ffa9d5c 100644 --- a/test/compress/issue-1833.js +++ b/test/compress/issue-1833.js @@ -1,6 +1,7 @@ iife_for: { options = { negate_iife: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -26,6 +27,7 @@ iife_for: { iife_for_in: { options = { negate_iife: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -51,6 +53,7 @@ iife_for_in: { iife_do: { options = { negate_iife: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -80,6 +83,7 @@ iife_do: { iife_while: { options = { negate_iife: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, diff --git a/test/compress/issue-281.js b/test/compress/issue-281.js index 65871a84..6a93136f 100644 --- a/test/compress/issue-281.js +++ b/test/compress/issue-281.js @@ -3,6 +3,7 @@ collapse_vars_constants: { collapse_vars: true, evaluate: true, inline: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -240,6 +241,7 @@ negate_iife_issue_1073: { evaluate: true, inline: true, negate_iife: true, + reduce_funcs: true, reduce_vars: true, sequences: true, unused: true, @@ -267,6 +269,7 @@ issue_1288_side_effects: { evaluate: true, inline: true, negate_iife: true, + reduce_funcs: true, reduce_vars: true, side_effects: true, unused: true, @@ -299,6 +302,7 @@ inner_var_for_in_1: { options = { evaluate: true, inline: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -330,6 +334,7 @@ issue_1595_3: { evaluate: true, inline: true, passes: 2, + reduce_funcs: true, reduce_vars: true, unused: true, } diff --git a/test/compress/properties.js b/test/compress/properties.js index 410352f9..e252d495 100644 --- a/test/compress/properties.js +++ b/test/compress/properties.js @@ -940,6 +940,7 @@ methods_keep_quoted_from_dead_code: { dead_code: true, ecma: 6, evaluate: true, + reduce_funcs: true, reduce_vars: true, side_effects: true, unsafe_methods: true, @@ -1085,6 +1086,7 @@ lhs_prop_2: { evaluate: true, inline: true, properties: true, + reduce_funcs: true, reduce_vars: true, side_effects: true, unused: true, @@ -1131,6 +1133,7 @@ prop_side_effects_1: { evaluate: true, inline: true, properties: true, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -1167,6 +1170,7 @@ prop_side_effects_2: { inline: true, passes: 2, properties: true, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, diff --git a/test/compress/pure_getters.js b/test/compress/pure_getters.js index cef66309..33b7fea6 100644 --- a/test/compress/pure_getters.js +++ b/test/compress/pure_getters.js @@ -1,6 +1,7 @@ strict: { options = { pure_getters: "strict", + reduce_funcs: false, reduce_vars: false, side_effects: true, toplevel: true, @@ -30,6 +31,7 @@ strict: { strict_reduce_vars: { options = { pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -58,6 +60,7 @@ strict_reduce_vars: { unsafe: { options = { pure_getters: true, + reduce_funcs: false, reduce_vars: false, side_effects: true, toplevel: true, @@ -84,6 +87,7 @@ unsafe: { unsafe_reduce_vars: { options = { pure_getters: true, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -185,6 +189,7 @@ issue_2110_1: { pure_getters: "strict", sequences: true, side_effects: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -215,6 +220,7 @@ issue_2110_2: { options = { collapse_vars: true, pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -247,6 +253,7 @@ set_immutable_1: { collapse_vars: true, evaluate: true, pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -270,6 +277,7 @@ set_immutable_2: { cascade: true, conditionals: true, pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, sequences: true, side_effects: true, @@ -293,6 +301,7 @@ set_immutable_3: { collapse_vars: true, evaluate: true, pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -318,6 +327,7 @@ set_immutable_4: { cascade: true, conditionals: true, pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, sequences: true, side_effects: true, @@ -343,6 +353,7 @@ set_mutable_1: { collapse_vars: true, evaluate: true, pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -367,6 +378,7 @@ set_mutable_2: { cascade: true, conditionals: true, pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, sequences: true, side_effects: true, @@ -403,6 +415,7 @@ issue_2265_1: { issue_2265_2: { options = { pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -428,6 +441,7 @@ issue_2265_2: { issue_2265_3: { options = { pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -447,6 +461,7 @@ issue_2265_3: { issue_2265_4: { options = { pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, diff --git a/test/compress/reduce_vars.js b/test/compress/reduce_vars.js index 5508355d..20ba90d8 100644 --- a/test/compress/reduce_vars.js +++ b/test/compress/reduce_vars.js @@ -6,6 +6,7 @@ reduce_vars: { global_defs : { C : 0 }, + reduce_funcs : true, reduce_vars : true, toplevel : true, unused : true @@ -64,6 +65,7 @@ modified: { options = { conditionals : true, evaluate : true, + reduce_funcs : true, reduce_vars : true, unused : true, } @@ -171,6 +173,7 @@ modified: { unsafe_evaluate: { options = { evaluate : true, + reduce_funcs : true, reduce_vars : true, side_effects : true, unsafe : true, @@ -214,6 +217,7 @@ unsafe_evaluate: { unsafe_evaluate_side_effect_free_1: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unsafe: true, unused: true, @@ -237,6 +241,7 @@ unsafe_evaluate_side_effect_free_2: { evaluate: true, passes: 2, pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, unsafe: true, unused: true, @@ -253,6 +258,7 @@ unsafe_evaluate_side_effect_free_2: { unsafe_evaluate_escaped: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unsafe: true, unused: true, @@ -273,6 +279,7 @@ unsafe_evaluate_escaped: { unsafe_evaluate_modified: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unsafe: true, unused: true, @@ -286,6 +293,7 @@ unsafe_evaluate_modified: { function inc() { this.p++; } console.log(function(){ var o={p:6}; inc.call(o); console.log(o.p); return o.p; }()); console.log(function(){ var o={p:7}; console.log([o][0].p++); return o.p; }()); + console.log(function(){ var o={p:8}; console.log({q:o}.q.p++); return o.p; }()); } expect: { console.log(function(){ var o={p:1}; o.p++; console.log(o.p); return o.p; }()); @@ -296,6 +304,7 @@ unsafe_evaluate_modified: { function inc() { this.p++; } console.log(function(){ var o={p:6}; inc.call(o); console.log(o.p); return o.p; }()); console.log(function(){ var o={p:7}; console.log([o][0].p++); return o.p; }()); + console.log(function(){ var o={p:8}; console.log({q:o}.q.p++); return o.p; }()); } expect_stdout: true } @@ -303,6 +312,7 @@ unsafe_evaluate_modified: { unsafe_evaluate_unknown: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unsafe: true, unused: true, @@ -323,6 +333,7 @@ unsafe_evaluate_unknown: { unsafe_evaluate_object_1: { options = { evaluate : true, + reduce_funcs : true, reduce_vars : true, unsafe : true } @@ -363,6 +374,7 @@ unsafe_evaluate_object_1: { unsafe_evaluate_object_2: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unsafe: true, @@ -399,6 +411,7 @@ unsafe_evaluate_object_2: { unsafe_evaluate_object_3: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unsafe: true, @@ -439,6 +452,7 @@ unsafe_evaluate_object_3: { unsafe_evaluate_array_1: { options = { evaluate : true, + reduce_funcs : true, reduce_vars : true, unsafe : true } @@ -487,6 +501,7 @@ unsafe_evaluate_array_1: { unsafe_evaluate_array_2: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unsafe: true, @@ -523,6 +538,7 @@ unsafe_evaluate_array_2: { unsafe_evaluate_array_3: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unsafe: true, @@ -553,6 +569,7 @@ unsafe_evaluate_array_3: { unsafe_evaluate_array_4: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unsafe: true, @@ -583,6 +600,7 @@ unsafe_evaluate_array_4: { unsafe_evaluate_array_5: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unsafe: true, @@ -613,6 +631,7 @@ unsafe_evaluate_array_5: { unsafe_evaluate_equality_1: { options = { evaluate : true, + reduce_funcs : true, reduce_vars : true, unsafe : true, unused : true @@ -645,6 +664,7 @@ unsafe_evaluate_equality_2: { collapse_vars: true, evaluate : true, passes : 2, + reduce_funcs : true, reduce_vars : true, unsafe : true, unused : true @@ -681,6 +701,7 @@ passes: { conditionals: true, evaluate: true, passes: 2, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -712,6 +733,7 @@ passes: { iife: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -732,6 +754,7 @@ iife: { iife_new: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -752,6 +775,7 @@ iife_new: { multi_def_1: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -777,6 +801,7 @@ multi_def_1: { multi_def_2: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -806,6 +831,7 @@ multi_def_2: { multi_def_3: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -833,6 +859,7 @@ multi_def_3: { use_before_var: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -852,6 +879,7 @@ use_before_var: { inner_var_if: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -875,6 +903,7 @@ inner_var_if: { inner_var_label: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -900,6 +929,7 @@ inner_var_label: { inner_var_for_1: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -929,6 +959,7 @@ inner_var_for_1: { inner_var_for_2: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -952,6 +983,7 @@ inner_var_for_2: { inner_var_for_in_1: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -983,6 +1015,7 @@ inner_var_for_in_1: { inner_var_for_in_2: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -1002,6 +1035,7 @@ inner_var_for_in_2: { inner_var_catch: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -1029,6 +1063,7 @@ inner_var_catch: { issue_1533_1: { options = { collapse_vars: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -1050,6 +1085,7 @@ issue_1533_1: { issue_1533_2: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -1073,6 +1109,7 @@ issue_1533_2: { toplevel_on: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel:true, unused: true, @@ -1090,6 +1127,7 @@ toplevel_on: { toplevel_off: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel:false, unused: true, @@ -1109,6 +1147,7 @@ toplevel_on_loops_1: { options = { evaluate: true, loops: true, + reduce_funcs: true, reduce_vars: true, toplevel:true, unused: true, @@ -1123,11 +1162,12 @@ toplevel_on_loops_1: { while (x); } expect: { + function bar() { + console.log("bar:", --x); + } var x = 3; do - (function() { - console.log("bar:", --x); - })(); + bar(); while (x); } expect_stdout: true @@ -1137,6 +1177,7 @@ toplevel_off_loops_1: { options = { evaluate: true, loops: true, + reduce_funcs: true, reduce_vars: true, toplevel:false, unused: true, @@ -1166,6 +1207,7 @@ toplevel_on_loops_2: { options = { evaluate: true, loops: true, + reduce_funcs: true, reduce_vars: true, toplevel:true, unused: true, @@ -1180,9 +1222,10 @@ toplevel_on_loops_2: { while (x); } expect: { - for (;;) (function() { + function bar() { console.log("bar:"); - })(); + } + for (;;) bar(); } } @@ -1190,6 +1233,7 @@ toplevel_off_loops_2: { options = { evaluate: true, loops: true, + reduce_funcs: true, reduce_vars: true, toplevel:false, unused: true, @@ -1218,6 +1262,7 @@ toplevel_on_loops_3: { options = { evaluate: true, loops: true, + reduce_funcs: true, reduce_vars: true, toplevel:true, unused: true, @@ -1235,6 +1280,7 @@ toplevel_off_loops_3: { options = { evaluate: true, loops: true, + reduce_funcs: true, reduce_vars: true, toplevel:false, unused: true, @@ -1252,6 +1298,7 @@ toplevel_off_loops_3: { defun_reference: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -1288,6 +1335,7 @@ defun_reference: { defun_inline_1: { options = { + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1316,6 +1364,7 @@ defun_inline_1: { defun_inline_2: { options = { + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1347,6 +1396,7 @@ defun_inline_3: { evaluate: true, inline: true, passes: 2, + reduce_funcs: true, reduce_vars: true, side_effects: true, unused: true, @@ -1369,6 +1419,7 @@ defun_inline_3: { defun_call: { options = { inline: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1396,6 +1447,7 @@ defun_call: { defun_redefine: { options = { inline: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1429,6 +1481,7 @@ defun_redefine: { func_inline: { options = { inline: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1456,6 +1509,7 @@ func_inline: { func_modified: { options = { inline: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1483,6 +1537,7 @@ func_modified: { defun_label: { options = { passes: 2, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1512,6 +1567,7 @@ defun_label: { double_reference: { options = { + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1534,6 +1590,7 @@ double_reference: { iife_arguments_1: { options = { + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1556,6 +1613,7 @@ iife_arguments_1: { iife_arguments_2: { options = { + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1579,6 +1637,7 @@ iife_arguments_2: { iife_eval_1: { options = { + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1601,6 +1660,7 @@ iife_eval_1: { iife_eval_2: { options = { + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1625,6 +1685,7 @@ iife_eval_2: { iife_func_side_effects: { options = { + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1675,6 +1736,7 @@ iife_func_side_effects: { issue_1595_1: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1693,6 +1755,7 @@ issue_1595_1: { issue_1595_2: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1712,6 +1775,7 @@ issue_1595_3: { options = { evaluate: true, passes: 2, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1730,6 +1794,7 @@ issue_1595_3: { issue_1595_4: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1752,6 +1817,7 @@ issue_1606: { options = { evaluate: true, hoist_vars: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -1778,6 +1844,7 @@ issue_1670_1: { conditionals: true, evaluate: true, dead_code: true, + reduce_funcs: true, reduce_vars: true, side_effects: true, switches: true, @@ -1811,6 +1878,7 @@ issue_1670_2: { evaluate: true, dead_code: true, passes: 2, + reduce_funcs: true, reduce_vars: true, side_effects: true, switches: true, @@ -1842,6 +1910,7 @@ issue_1670_3: { conditionals: true, evaluate: true, dead_code: true, + reduce_funcs: true, reduce_vars: true, side_effects: true, switches: true, @@ -1875,6 +1944,7 @@ issue_1670_4: { evaluate: true, dead_code: true, passes: 2, + reduce_funcs: true, reduce_vars: true, side_effects: true, switches: true, @@ -1905,6 +1975,7 @@ issue_1670_5: { dead_code: true, evaluate: true, keep_fargs: false, + reduce_funcs: true, reduce_vars: true, side_effects: true, switches: true, @@ -1935,6 +2006,7 @@ issue_1670_6: { dead_code: true, evaluate: true, keep_fargs: false, + reduce_funcs: true, reduce_vars: true, side_effects: true, switches: true, @@ -1969,6 +2041,7 @@ issue_1670_6: { unary_delete: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -1997,6 +2070,7 @@ redefine_arguments_1: { options = { evaluate: true, keep_fargs: false, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -2037,6 +2111,7 @@ redefine_arguments_2: { evaluate: true, inline: true, keep_fargs: false, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -2075,6 +2150,7 @@ redefine_arguments_3: { inline: true, keep_fargs: false, passes: 3, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -2111,6 +2187,7 @@ redefine_farg_1: { options = { evaluate: true, keep_fargs: false, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -2150,6 +2227,7 @@ redefine_farg_2: { evaluate: true, inline: true, keep_fargs: false, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -2188,6 +2266,7 @@ redefine_farg_3: { inline: true, keep_fargs: false, passes: 2, + reduce_funcs: true, reduce_vars: true, sequences: true, side_effects: true, @@ -2218,6 +2297,7 @@ redefine_farg_3: { delay_def: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -2250,6 +2330,7 @@ booleans: { options = { booleans: true, evaluate: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -2280,6 +2361,7 @@ booleans: { side_effects_assign: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, sequences: true, side_effects: true, @@ -2299,6 +2381,7 @@ side_effects_assign: { pure_getters_1: { options = { pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -2321,6 +2404,7 @@ pure_getters_1: { pure_getters_2: { options = { pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -2337,6 +2421,7 @@ pure_getters_2: { pure_getters_3: { options = { pure_getters: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -2353,6 +2438,7 @@ catch_var: { options = { booleans: true, evaluate: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -2377,6 +2463,7 @@ catch_var: { var_assign_1: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, sequences: true, side_effects: true, @@ -2400,6 +2487,7 @@ var_assign_1: { var_assign_2: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, sequences: true, side_effects: true, @@ -2422,6 +2510,7 @@ var_assign_2: { var_assign_3: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, sequences: true, side_effects: true, @@ -2446,6 +2535,7 @@ var_assign_3: { var_assign_4: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, sequences: true, side_effects: true, @@ -2468,6 +2558,7 @@ var_assign_4: { var_assign_5: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, sequences: true, side_effects: true, @@ -2497,6 +2588,7 @@ var_assign_5: { var_assign_6: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -2518,6 +2610,7 @@ var_assign_6: { immutable: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -2538,6 +2631,7 @@ immutable: { issue_1814_1: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -2564,6 +2658,7 @@ issue_1814_1: { issue_1814_2: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -2590,6 +2685,7 @@ issue_1814_2: { try_abort: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -2621,6 +2717,7 @@ try_abort: { boolean_binary_assign: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -2644,6 +2741,7 @@ boolean_binary_assign: { cond_assign: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -2667,6 +2765,7 @@ cond_assign: { iife_assign: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -2697,6 +2796,7 @@ iife_assign: { issue_1850_1: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: false, unused: true, @@ -2720,6 +2820,7 @@ issue_1850_1: { issue_1850_2: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: "funcs", unused: true, @@ -2742,6 +2843,7 @@ issue_1850_2: { issue_1850_3: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: "vars", unused: true, @@ -2765,6 +2867,7 @@ issue_1850_3: { issue_1850_4: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -2788,6 +2891,7 @@ issue_1850_4: { issue_1865: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unsafe: true, } @@ -2817,6 +2921,7 @@ issue_1865: { issue_1922_1: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -2838,6 +2943,7 @@ issue_1922_1: { issue_1922_2: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -2861,6 +2967,7 @@ issue_1922_2: { accessor_1: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, } @@ -2891,6 +2998,7 @@ accessor_2: { options = { collapse_vars: true, evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -2917,6 +3025,7 @@ accessor_2: { method_1: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, } @@ -2946,6 +3055,7 @@ method_2: { options = { collapse_vars: true, evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -2973,6 +3083,7 @@ method_2: { issue_2090_1: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -2996,6 +3107,7 @@ issue_2090_1: { issue_2090_2: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, } input: { @@ -3022,6 +3134,7 @@ issue_2090_2: { for_in_prop: { options = { + reduce_funcs: true, reduce_vars: true, } input: { @@ -3049,6 +3162,7 @@ obj_var_1: { options = { evaluate: true, passes: 2, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -3078,6 +3192,7 @@ obj_var_2: { inline: true, passes: 2, properties: true, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -3104,6 +3219,7 @@ obj_arg_1: { evaluate: true, inline: true, passes: 2, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -3135,6 +3251,7 @@ obj_arg_2: { inline: true, passes: 2, properties: true, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -3162,6 +3279,7 @@ func_arg_1: { evaluate: true, inline: true, passes: 2, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -3186,6 +3304,7 @@ func_arg_2: { evaluate: true, inline: true, passes: 2, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -3207,6 +3326,7 @@ func_arg_2: { regex_loop: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -3235,6 +3355,7 @@ regex_loop: { obj_for_1: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -3255,6 +3376,7 @@ obj_for_1: { obj_for_2: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -3274,6 +3396,7 @@ obj_for_2: { array_forin_1: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -3298,6 +3421,7 @@ array_forin_1: { array_forin_2: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -3319,6 +3443,7 @@ array_forin_2: { array_forof_1: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -3344,6 +3469,7 @@ array_forof_1: { array_forof_2: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -3367,6 +3493,7 @@ array_forof_2: { const_expr_1: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unsafe: true, @@ -3394,6 +3521,7 @@ const_expr_1: { const_expr_2: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unsafe: true, @@ -3426,6 +3554,7 @@ const_expr_2: { issue_2406_1: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: false, unused: true, @@ -3470,6 +3599,7 @@ issue_2406_1: { issue_2406_2: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -3509,12 +3639,13 @@ issue_2406_2: { } } -escaped_prop: { +escaped_prop_1: { options = { collapse_vars: true, evaluate: true, inline: true, pure_getters: "strict", + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -3538,8 +3669,44 @@ escaped_prop: { expect_stdout: "2" } +escaped_prop_2: { + options = { + reduce_funcs: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + var a; + function f(b) { + if (a) console.log(a === b.c); + a = b.c; + } + function g() {} + function h() { + f({ c: g }); + } + h(); + h(); + } + expect: { + var a; + function g() {} + function h() { + (function(b) { + if (a) console.log(a === b.c); + a = b.c; + })({ c: g }); + } + h(); + h(); + } + expect_stdout: "true" +} + issue_2420_1: { options = { + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -3582,6 +3749,7 @@ issue_2420_1: { issue_2420_2: { options = { + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -3624,6 +3792,7 @@ issue_2420_2: { issue_2420_3: { options = { + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -3667,6 +3836,7 @@ issue_2420_3: { issue_2423_1: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -3691,6 +3861,7 @@ issue_2423_1: { issue_2423_2: { options = { inline: true, + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -3714,6 +3885,7 @@ issue_2423_2: { issue_2423_3: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -3732,6 +3904,7 @@ issue_2423_3: { issue_2423_4: { options = { inline: true, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -3752,6 +3925,7 @@ issue_2423_5: { options = { inline: true, passes: 2, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -3790,6 +3964,7 @@ issue_2423_6: { options = { inline: true, passes: 2, + reduce_funcs: true, reduce_vars: true, side_effects: true, toplevel: true, @@ -3830,6 +4005,7 @@ issue_2423_6: { issue_2440_eval_1: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -3860,6 +4036,7 @@ issue_2440_eval_1: { issue_2440_eval_2: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -3890,6 +4067,7 @@ issue_2440_eval_2: { issue_2440_with_1: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -3916,6 +4094,7 @@ issue_2440_with_1: { issue_2440_with_2: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -3942,6 +4121,7 @@ issue_2440_with_2: { issue_2442: { options = { + reduce_funcs: true, reduce_vars: true, toplevel: true, unused: true, @@ -3956,6 +4136,7 @@ issue_2442: { recursive_inlining_1: { options = { + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -3976,6 +4157,7 @@ recursive_inlining_1: { recursive_inlining_2: { options = { + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -3997,6 +4179,8 @@ recursive_inlining_2: { recursive_inlining_3: { options = { + passes: 2, + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -4034,6 +4218,7 @@ recursive_inlining_3: { recursive_inlining_4: { options = { + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -4080,6 +4265,7 @@ recursive_inlining_4: { recursive_inlining_5: { options = { + reduce_funcs: true, reduce_vars: true, unused: true, } @@ -4130,3 +4316,458 @@ recursive_inlining_5: { "foo 0", ] } + +issue_2450_1: { + options = { + reduce_funcs: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + function f() {} + function g() { + return f; + } + console.log(g() === g()); + } + expect: { + function f() {} + function g() { + return f; + } + console.log(g() === g()); + } + expect_stdout: "true" +} + +issue_2450_2: { + options = { + reduce_funcs: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + function g() { + function f() {} + return f; + } + console.log(g() === g()); + } + expect: { + function g() { + return function() {}; + } + console.log(g() === g()); + } + expect_stdout: "false" +} + +issue_2450_3: { + options = { + reduce_funcs: true, + reduce_vars: true, + unused: true, + } + input: { + var x = (function() { + function test() { + return "foo"; + } + return function b() { + return [1, test]; + } + })(); + console.log(x()[1] === x()[1]); + } + expect: { + var x = (function() { + function test() { + return "foo"; + } + return function() { + return [1, test]; + } + })(); + console.log(x()[1] === x()[1]); + } + expect_stdout: "true" +} + +issue_2450_4: { + options = { + reduce_funcs: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + var a; + function f(b) { + console.log(a === b); + a = b; + } + function g() {} + for (var i = 3; --i >= 0;) + f(g); + } + expect: { + var a; + function f(b) { + console.log(a === b); + a = b; + } + function g() {} + for (var i = 3; --i >= 0;) + f(g); + } + expect_stdout: [ + "false", + "true", + "true", + ] +} + +issue_2450_5: { + options = { + reduce_funcs: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + var a; + function f(b) { + console.log(a === b); + a = b; + } + function g() {} + [1, 2, 3].forEach(function() { + f(g); + }); + } + expect: { + var a; + function g() {} + [1, 2, 3].forEach(function() { + (function(b) { + console.log(a === b); + a = b; + })(g); + }); + } + expect_stdout: [ + "false", + "true", + "true", + ] +} + +issue_2449: { + options = { + passes: 10, + reduce_funcs: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + var a = "PASS"; + function f() { + return a; + } + function g() { + return f(); + } + (function() { + var a = "FAIL"; + if (a == a) console.log(g()); + })(); + } + expect: { + var a = "PASS"; + function g() { + return function() { + return a; + }(); + } + (function() { + var a = "FAIL"; + if (a == a) console.log(g()); + })(); + } + expect_stdout: "PASS" +} + +perf_1: { + options = { + reduce_funcs: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + function foo(x, y, z) { + return x < y ? x * y + z : x * z - y; + } + function indirect_foo(x, y, z) { + return foo(x, y, z); + } + var sum = 0; + for (var i = 0; i < 100; ++i) { + sum += indirect_foo(i, i + 1, 3 * i); + } + console.log(sum); + } + expect: { + function indirect_foo(x, y, z) { + return function(x, y, z) { + return x < y ? x * y + z : x * z - y; + }(x, y, z); + } + var sum = 0; + for (var i = 0; i < 100; ++i) + sum += indirect_foo(i, i + 1, 3 * i); + console.log(sum); + } + expect_stdout: "348150" +} + +perf_2: { + options = { + reduce_funcs: false, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + function foo(x, y, z) { + return x < y ? x * y + z : x * z - y; + } + function indirect_foo(x, y, z) { + return foo(x, y, z); + } + var sum = 0; + for (var i = 0; i < 100; ++i) { + sum += indirect_foo(i, i + 1, 3 * i); + } + console.log(sum); + } + expect: { + function foo(x, y, z) { + return x < y ? x * y + z : x * z - y; + } + function indirect_foo(x, y, z) { + return foo(x, y, z); + } + var sum = 0; + for (var i = 0; i < 100; ++i) + sum += indirect_foo(i, i + 1, 3 * i); + console.log(sum); + } + expect_stdout: "348150" +} + +perf_3: { + options = { + reduce_funcs: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + var foo = function(x, y, z) { + return x < y ? x * y + z : x * z - y; + } + var indirect_foo = function(x, y, z) { + return foo(x, y, z); + } + var sum = 0; + for (var i = 0; i < 100; ++i) + sum += indirect_foo(i, i + 1, 3 * i); + console.log(sum); + } + expect: { + var indirect_foo = function(x, y, z) { + return function(x, y, z) { + return x < y ? x * y + z : x * z - y; + }(x, y, z); + } + var sum = 0; + for (var i = 0; i < 100; ++i) + sum += indirect_foo(i, i + 1, 3 * i); + console.log(sum); + } + expect_stdout: "348150" +} + +perf_4: { + options = { + reduce_funcs: false, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + var foo = function(x, y, z) { + return x < y ? x * y + z : x * z - y; + } + var indirect_foo = function(x, y, z) { + return foo(x, y, z); + } + var sum = 0; + for (var i = 0; i < 100; ++i) + sum += indirect_foo(i, i + 1, 3 * i); + console.log(sum); + } + expect: { + var foo = function(x, y, z) { + return x < y ? x * y + z : x * z - y; + } + var indirect_foo = function(x, y, z) { + return foo(x, y, z); + } + var sum = 0; + for (var i = 0; i < 100; ++i) + sum += indirect_foo(i, i + 1, 3 * i); + console.log(sum); + } + expect_stdout: "348150" +} + +perf_5: { + options = { + passes: 10, + reduce_funcs: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + function indirect_foo(x, y, z) { + function foo(x, y, z) { + return x < y ? x * y + z : x * z - y; + } + return foo(x, y, z); + } + var sum = 0; + for (var i = 0; i < 100; ++i) { + sum += indirect_foo(i, i + 1, 3 * i); + } + console.log(sum); + } + expect: { + function indirect_foo(x, y, z) { + return function(x, y, z) { + return x < y ? x * y + z : x * z - y; + }(x, y, z); + } + var sum = 0; + for (var i = 0; i < 100; ++i) + sum += indirect_foo(i, i + 1, 3 * i); + console.log(sum); + } + expect_stdout: "348150" +} + +perf_6: { + options = { + passes: 10, + reduce_funcs: false, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + function indirect_foo(x, y, z) { + function foo(x, y, z) { + return x < y ? x * y + z : x * z - y; + } + return foo(x, y, z); + } + var sum = 0; + for (var i = 0; i < 100; ++i) { + sum += indirect_foo(i, i + 1, 3 * i); + } + console.log(sum); + } + expect: { + function indirect_foo(x, y, z) { + return function(x, y, z) { + return x < y ? x * y + z : x * z - y; + }(x, y, z); + } + var sum = 0; + for (var i = 0; i < 100; ++i) + sum += indirect_foo(i, i + 1, 3 * i); + console.log(sum); + } + expect_stdout: "348150" +} + +perf_7: { + options = { + reduce_funcs: true, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + var indirect_foo = function(x, y, z) { + var foo = function(x, y, z) { + return x < y ? x * y + z : x * z - y; + } + return foo(x, y, z); + } + var sum = 0; + for (var i = 0; i < 100; ++i) + sum += indirect_foo(i, i + 1, 3 * i); + console.log(sum); + } + expect: { + var indirect_foo = function(x, y, z) { + return function(x, y, z) { + return x < y ? x * y + z : x * z - y; + }(x, y, z); + } + var sum = 0; + for (var i = 0; i < 100; ++i) + sum += indirect_foo(i, i + 1, 3 * i); + console.log(sum); + } + expect_stdout: "348150" +} + +perf_8: { + options = { + reduce_funcs: false, + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + var indirect_foo = function(x, y, z) { + var foo = function(x, y, z) { + return x < y ? x * y + z : x * z - y; + } + return foo(x, y, z); + } + var sum = 0; + for (var i = 0; i < 100; ++i) + sum += indirect_foo(i, i + 1, 3 * i); + console.log(sum); + } + expect: { + var indirect_foo = function(x, y, z) { + return function(x, y, z) { + return x < y ? x * y + z : x * z - y; + }(x, y, z); + } + var sum = 0; + for (var i = 0; i < 100; ++i) + sum += indirect_foo(i, i + 1, 3 * i); + console.log(sum); + } + expect_stdout: "348150" +} diff --git a/test/compress/screw-ie8.js b/test/compress/screw-ie8.js index 66559b0b..82152b7d 100644 --- a/test/compress/screw-ie8.js +++ b/test/compress/screw-ie8.js @@ -187,6 +187,7 @@ dont_screw_try_catch_undefined: { reduce_vars: { options = { evaluate: true, + reduce_funcs: true, reduce_vars: true, ie8: true, unused: true, diff --git a/test/compress/switch.js b/test/compress/switch.js index 03c1e00a..7f57a877 100644 --- a/test/compress/switch.js +++ b/test/compress/switch.js @@ -714,6 +714,7 @@ issue_1705_2: { options = { dead_code: true, evaluate: true, + reduce_funcs: true, reduce_vars: true, sequences: true, side_effects: true, diff --git a/test/mocha/minify.js b/test/mocha/minify.js index db32739b..db41cd8b 100644 --- a/test/mocha/minify.js +++ b/test/mocha/minify.js @@ -328,4 +328,36 @@ describe("minify", function() { }); }); }); + + describe("collapse_vars", function() { + it("Should not produce invalid AST", function() { + var code = [ + "function f(a) {", + " a = x();", + " return a;", + "}", + "f();", + ].join("\n"); + var ast = Uglify.minify(code, { + compress: false, + mangle: false, + output: { + ast: true + }, + }).ast; + assert.strictEqual(ast.TYPE, "Toplevel"); + assert.strictEqual(ast.body.length, 2); + assert.strictEqual(ast.body[0].TYPE, "Defun"); + assert.strictEqual(ast.body[0].body.length, 2); + assert.strictEqual(ast.body[0].body[0].TYPE, "SimpleStatement"); + var stat = ast.body[0].body[0]; + Uglify.minify(ast, { + compress: { + sequences: false + } + }); + assert.ok(stat.body); + assert.strictEqual(stat.print_to_string(), "a=x()"); + }); + }); });