optimise do{...}while(false)

Now with better heuristics to avoid issues like #1532
This commit is contained in:
alexlamsl 2017-04-04 18:23:39 +08:00
parent 4b90dc1fdb
commit 67bc50db16
2 changed files with 13 additions and 6 deletions

View File

@ -2314,13 +2314,21 @@ merge(Compressor.prototype, {
return make_node(AST_For, self, { return make_node(AST_For, self, {
body: self.body body: self.body
}); });
} else if (compressor.option("dead_code") && self instanceof AST_While) { }
if (compressor.option("dead_code") && self instanceof AST_While) {
var a = []; var a = [];
extract_declarations_from_unreachable_code(compressor, self.body, a); extract_declarations_from_unreachable_code(compressor, self.body, a);
return make_node(AST_BlockStatement, self, { body: a }); return make_node(AST_BlockStatement, self, { body: a });
} else { }
cond = make_node_from_constant(cond, self.condition).transform(compressor); if (self instanceof AST_Do) {
self.condition = best_of_expression(cond, self.condition); var has_loop_control = false;
var tw = new TreeWalker(function(node) {
if (node instanceof AST_Scope || has_loop_control) return true;
if (node instanceof AST_LoopControl && tw.loopcontrol_target(node.label) === self)
return has_loop_control = true;
});
self.walk(tw);
if (!has_loop_control) return self.body;
} }
} }
if (self instanceof AST_While) { if (self instanceof AST_While) {

View File

@ -215,8 +215,7 @@ evaluate: {
a(); a();
for(;;) for(;;)
c(); c();
// rule disabled due to issue_1532 d();
do d(); while (false);
} }
} }