@@ -1951,13 +1951,26 @@ Compressor.prototype.compress = function(node) {
1951
1951
return statements;
1952
1952
1953
1953
function last_of(compressor, predicate) {
1954
- var block = compressor.self(), stat, level = 0;
1954
+ var block = compressor.self(), level = 0;
1955
1955
do {
1956
- do {
1956
+ if (block instanceof AST_Catch || block instanceof AST_Finally) {
1957
+ block = compressor.parent(level++);
1958
+ } else if (block instanceof AST_LabeledStatement) {
1959
+ block = block.body;
1960
+ }
1961
+ var stat = null;
1962
+ while (true) {
1957
1963
if (predicate(block)) return true;
1958
1964
block = compressor.parent(level++);
1959
- } while (block instanceof AST_If && (stat = block));
1960
- } while ((block instanceof AST_BlockStatement || block instanceof AST_Scope)
1965
+ if (!(block instanceof AST_If)) break;
1966
+ stat = block;
1967
+ }
1968
+ } while (stat
1969
+ && (block instanceof AST_BlockStatement
1970
+ || block instanceof AST_Catch
1971
+ || block instanceof AST_Finally
1972
+ || block instanceof AST_Scope
1973
+ || block instanceof AST_Try)
1961
1974
&& is_last_statement(block.body, stat));
1962
1975
}
1963
1976
@@ -3677,6 +3690,11 @@ Compressor.prototype.compress = function(node) {
3677
3690
function eliminate_dead_code(statements, compressor) {
3678
3691
var has_quit;
3679
3692
var self = compressor.self();
3693
+ if (self instanceof AST_Catch || self instanceof AST_Finally) {
3694
+ self = compressor.parent();
3695
+ } else if (self instanceof AST_LabeledStatement) {
3696
+ self = self.body;
3697
+ }
3680
3698
for (var i = 0, n = 0, len = statements.length; i < len; i++) {
3681
3699
var stat = statements[i];
3682
3700
if (stat instanceof AST_LoopControl) {
@@ -5965,10 +5983,19 @@ Compressor.prototype.compress = function(node) {
5965
5983
});
5966
5984
5967
5985
OPT(AST_LabeledStatement, function(self, compressor) {
5968
- if (compressor.option("dead_code")
5969
- && self.body instanceof AST_Break
5970
- && compressor.loopcontrol_target(self.body) === self.body) {
5971
- return make_node(AST_EmptyStatement, self);
5986
+ if (self.body instanceof AST_If || self.body instanceof AST_Break) {
5987
+ var body = tighten_body([ self.body ], compressor);
5988
+ switch (body.length) {
5989
+ case 0:
5990
+ self.body = make_node(AST_EmptyStatement, self);
5991
+ break;
5992
+ case 1:
5993
+ self.body = body[0];
5994
+ break;
5995
+ default:
5996
+ self.body = make_node(AST_BlockStatement, self, { body: body });
5997
+ break;
5998
+ }
5972
5999
}
5973
6000
return compressor.option("unused") && self.label.references.length == 0 ? self.body : self;
5974
6001
});
0 commit comments