diff --git a/lib/compress.js b/lib/compress.js index e9e72ce6..aaadcd10 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -3867,7 +3867,7 @@ merge(Compressor.prototype, { } } if (fn instanceof AST_Function) { - var def, scope; + var def, scope, value; if (compressor.option("inline") && !fn.uses_arguments && !fn.uses_eval @@ -3876,23 +3876,13 @@ merge(Compressor.prototype, { : compressor.option("unused") && (def = exp.definition()).references.length == 1 && !recursive_ref(compressor, def)) + && !self.has_pure_annotation(compressor) && !fn.contains_this() && (scope = can_flatten_args(fn)) - && !self.has_pure_annotation(compressor)) { - var value; - if (stat instanceof AST_Return) { - value = stat.value; - } else if (stat instanceof AST_SimpleStatement) { - value = make_node(AST_UnaryPrefix, stat, { - operator: "void", - expression: stat.body - }); - } - if (value) { - var expressions = flatten_args(fn, scope); - expressions.push(value); - return make_sequence(self, expressions).optimize(compressor); - } + && (value = flatten_body(stat))) { + var expressions = flatten_args(fn, scope); + expressions.push(value); + return make_sequence(self, expressions).optimize(compressor); } if (compressor.option("side_effects") && all(fn.body, is_empty)) { var args = self.args.concat(make_node(AST_Undefined, self)); @@ -3957,11 +3947,26 @@ merge(Compressor.prototype, { for (i = len, len = self.args.length; i < len; i++) { expressions.push(self.args[i]); } - if (decls.length) scope.body.push(make_node(AST_Var, fn, { - definitions: decls - })); + if (decls.length) { + for (i = 0; compressor.parent(i) !== scope;) i++; + i = scope.body.indexOf(compressor.parent(i - 1)) + 1; + scope.body.splice(i, 0, make_node(AST_Var, fn, { + definitions: decls + })); + } return expressions; } + + function flatten_body(stat) { + if (stat instanceof AST_Return) { + return stat.value; + } else if (stat instanceof AST_SimpleStatement) { + return make_node(AST_UnaryPrefix, stat, { + operator: "void", + expression: stat.body + }); + } + } }); OPT(AST_New, function(self, compressor){ diff --git a/test/compress/functions.js b/test/compress/functions.js index 7b5318c4..a36509af 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -767,8 +767,8 @@ issue_2476: { expect: { for (var sum = 0, i = 0; i < 10; i++) sum += (x = i, y = i + 1, z = 3 * i, x < y ? x * y + z : x * z - y); - console.log(sum); var x, y, z; + console.log(sum); } expect_stdout: "465" }