fix has_side_effects() (#1675)
`AST_Try` is an `AST_Block`, so besides try block we also need to inspect catch and finally blocks for possible side effects. Also extend this functionality to handle `AST_If` and `AST_LabeledStatement` while we are at it. fixes #1673
This commit is contained in:
@@ -1600,14 +1600,29 @@ merge(Compressor.prototype, {
|
||||
return false;
|
||||
});
|
||||
|
||||
def(AST_Block, function(compressor){
|
||||
for (var i = this.body.length; --i >= 0;) {
|
||||
if (this.body[i].has_side_effects(compressor))
|
||||
function any(list, compressor) {
|
||||
for (var i = list.length; --i >= 0;)
|
||||
if (list[i].has_side_effects(compressor))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
def(AST_Block, function(compressor){
|
||||
return any(this.body, compressor);
|
||||
});
|
||||
def(AST_Try, function(compressor){
|
||||
return any(this.body, compressor)
|
||||
|| this.bcatch && this.bcatch.has_side_effects(compressor)
|
||||
|| this.bfinally && this.bfinally.has_side_effects(compressor);
|
||||
});
|
||||
def(AST_If, function(compressor){
|
||||
return this.condition.has_side_effects(compressor)
|
||||
|| this.body && this.body.has_side_effects(compressor)
|
||||
|| this.alternative && this.alternative.has_side_effects(compressor);
|
||||
});
|
||||
def(AST_LabeledStatement, function(compressor){
|
||||
return this.body.has_side_effects(compressor);
|
||||
});
|
||||
def(AST_SimpleStatement, function(compressor){
|
||||
return this.body.has_side_effects(compressor);
|
||||
});
|
||||
@@ -1633,19 +1648,13 @@ merge(Compressor.prototype, {
|
||||
return this.global() && this.undeclared();
|
||||
});
|
||||
def(AST_Object, function(compressor){
|
||||
for (var i = this.properties.length; --i >= 0;)
|
||||
if (this.properties[i].has_side_effects(compressor))
|
||||
return true;
|
||||
return false;
|
||||
return any(this.properties, compressor);
|
||||
});
|
||||
def(AST_ObjectProperty, function(compressor){
|
||||
return this.value.has_side_effects(compressor);
|
||||
});
|
||||
def(AST_Array, function(compressor){
|
||||
for (var i = this.elements.length; --i >= 0;)
|
||||
if (this.elements[i].has_side_effects(compressor))
|
||||
return true;
|
||||
return false;
|
||||
return any(this.elements, compressor);
|
||||
});
|
||||
def(AST_Dot, function(compressor){
|
||||
if (!compressor.option("pure_getters")) return true;
|
||||
|
||||
Reference in New Issue
Block a user