Hoist functions when reversing if (x) return; ... vs. if (!x) ...

Fixes #1052
This commit is contained in:
Richard van Velzen
2016-04-23 23:48:33 +02:00
parent c55dd5ed74
commit 4fe630431c
2 changed files with 43 additions and 2 deletions

View File

@@ -578,11 +578,13 @@ merge(Compressor.prototype, {
CHANGED = true; CHANGED = true;
stat = stat.clone(); stat = stat.clone();
stat.condition = stat.condition.negate(compressor); stat.condition = stat.condition.negate(compressor);
var body = as_statement_array(stat.alternative).concat(ret);
var funs = extract_functions_from_statement_array(body);
stat.body = make_node(AST_BlockStatement, stat, { stat.body = make_node(AST_BlockStatement, stat, {
body: as_statement_array(stat.alternative).concat(ret) body: body
}); });
stat.alternative = null; stat.alternative = null;
ret = [ stat.transform(compressor) ]; ret = funs.concat([ stat.transform(compressor) ]);
continue loop; continue loop;
} }
//--- //---
@@ -840,6 +842,18 @@ merge(Compressor.prototype, {
}; };
function extract_functions_from_statement_array(statements) {
var funs = [];
for (var i = statements.length - 1; i >= 0; --i) {
var stat = statements[i];
if (stat instanceof AST_Defun) {
statements.splice(i, 1);
funs.unshift(stat);
}
}
return funs;
}
function extract_declarations_from_unreachable_code(compressor, stat, target) { function extract_declarations_from_unreachable_code(compressor, stat, target) {
if (!(stat instanceof AST_Defun)) { if (!(stat instanceof AST_Defun)) {
compressor.warn("Dropping unreachable code [{file}:{line},{col}]", stat.start); compressor.warn("Dropping unreachable code [{file}:{line},{col}]", stat.start);

View File

@@ -0,0 +1,27 @@
hoist_funs_when_handling_if_return_rerversal: {
options = { if_return: true, hoist_funs: false };
input: {
"use strict";
( function() {
if ( !window ) {
return;
}
function f() {}
function g() {}
} )();
}
expect: {
"use strict";
( function() {
function f() {}
function g() {}
// NOTE: other compression steps will reduce this
// down to just `window`.
if ( window );
} )();
}
}