enhance dead_code & if_return (#5520)

This commit is contained in:
Alex Lam S.L
2022-06-26 05:32:25 +01:00
committed by GitHub
parent 9f57920566
commit 8b464331ba
2 changed files with 89 additions and 8 deletions

View File

@@ -1951,13 +1951,26 @@ Compressor.prototype.compress = function(node) {
return statements; return statements;
function last_of(compressor, predicate) { function last_of(compressor, predicate) {
var block = compressor.self(), stat, level = 0; var block = compressor.self(), level = 0;
do { do {
do { if (block instanceof AST_Catch || block instanceof AST_Finally) {
block = compressor.parent(level++);
} else if (block instanceof AST_LabeledStatement) {
block = block.body;
}
var stat = null;
while (true) {
if (predicate(block)) return true; if (predicate(block)) return true;
block = compressor.parent(level++); block = compressor.parent(level++);
} while (block instanceof AST_If && (stat = block)); if (!(block instanceof AST_If)) break;
} while ((block instanceof AST_BlockStatement || block instanceof AST_Scope) stat = block;
}
} while (stat
&& (block instanceof AST_BlockStatement
|| block instanceof AST_Catch
|| block instanceof AST_Finally
|| block instanceof AST_Scope
|| block instanceof AST_Try)
&& is_last_statement(block.body, stat)); && is_last_statement(block.body, stat));
} }
@@ -3677,6 +3690,11 @@ Compressor.prototype.compress = function(node) {
function eliminate_dead_code(statements, compressor) { function eliminate_dead_code(statements, compressor) {
var has_quit; var has_quit;
var self = compressor.self(); var self = compressor.self();
if (self instanceof AST_Catch || self instanceof AST_Finally) {
self = compressor.parent();
} else if (self instanceof AST_LabeledStatement) {
self = self.body;
}
for (var i = 0, n = 0, len = statements.length; i < len; i++) { for (var i = 0, n = 0, len = statements.length; i < len; i++) {
var stat = statements[i]; var stat = statements[i];
if (stat instanceof AST_LoopControl) { if (stat instanceof AST_LoopControl) {
@@ -5965,10 +5983,19 @@ Compressor.prototype.compress = function(node) {
}); });
OPT(AST_LabeledStatement, function(self, compressor) { OPT(AST_LabeledStatement, function(self, compressor) {
if (compressor.option("dead_code") if (self.body instanceof AST_If || self.body instanceof AST_Break) {
&& self.body instanceof AST_Break var body = tighten_body([ self.body ], compressor);
&& compressor.loopcontrol_target(self.body) === self.body) { switch (body.length) {
return make_node(AST_EmptyStatement, self); case 0:
self.body = make_node(AST_EmptyStatement, self);
break;
case 1:
self.body = body[0];
break;
default:
self.body = make_node(AST_BlockStatement, self, { body: body });
break;
}
} }
return compressor.option("unused") && self.label.references.length == 0 ? self.body : self; return compressor.option("unused") && self.label.references.length == 0 ? self.body : self;
}); });

View File

@@ -111,6 +111,7 @@ labels_5: {
labels_6: { labels_6: {
options = { options = {
dead_code: true, dead_code: true,
unused: true,
} }
input: { input: {
out: break out; out: break out;
@@ -208,6 +209,59 @@ labels_10: {
expect_stdout: "PASS" expect_stdout: "PASS"
} }
labels_11: {
options = {
conditionals: true,
if_return: true,
unused: true,
}
input: {
L: if (console.log("PASS"))
break L;
}
expect: {
console.log("PASS");
}
expect_stdout: "PASS"
}
labels_12: {
options = {
conditionals: true,
dead_code: true,
if_return: true,
unused: true,
}
input: {
L: try {
if (console.log("foo"))
break L;
throw "bar";
} catch (e) {
console.log(e);
break L;
} finally {
if (console.log("baz"))
break L;
}
}
expect: {
try {
if (!console.log("foo"))
throw "bar";
} catch (e) {
console.log(e);
} finally {
console.log("baz")
}
}
expect_stdout: [
"foo",
"bar",
"baz",
]
}
issue_4466_1: { issue_4466_1: {
mangle = { mangle = {
v8: false, v8: false,