faster tree transversal (#1462)

- convert `[].forEach()` to for-loops
This commit is contained in:
Alex Lam S.L
2017-02-26 05:58:26 +08:00
committed by GitHub
parent 16cd5d57a5
commit 13be50a4a9
2 changed files with 27 additions and 21 deletions

View File

@@ -145,12 +145,13 @@ var AST_SimpleStatement = DEFNODE("SimpleStatement", "body", {
}, AST_Statement); }, AST_Statement);
function walk_body(node, visitor) { function walk_body(node, visitor) {
if (node.body instanceof AST_Statement) { var body = node.body;
node.body._walk(visitor); if (body instanceof AST_Statement) {
body._walk(visitor);
}
else for (var i = 0, len = body.length; i < len; i++) {
body[i]._walk(visitor);
} }
else node.body.forEach(function(stat){
stat._walk(visitor);
});
}; };
var AST_Block = DEFNODE("Block", "body", { var AST_Block = DEFNODE("Block", "body", {
@@ -371,9 +372,10 @@ var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments", {
_walk: function(visitor) { _walk: function(visitor) {
return visitor._visit(this, function(){ return visitor._visit(this, function(){
if (this.name) this.name._walk(visitor); if (this.name) this.name._walk(visitor);
this.argnames.forEach(function(arg){ var argnames = this.argnames;
arg._walk(visitor); for (var i = 0, len = argnames.length; i < len; i++) {
}); argnames[i]._walk(visitor);
}
walk_body(this, visitor); walk_body(this, visitor);
}); });
} }
@@ -533,9 +535,10 @@ var AST_Definitions = DEFNODE("Definitions", "definitions", {
}, },
_walk: function(visitor) { _walk: function(visitor) {
return visitor._visit(this, function(){ return visitor._visit(this, function(){
this.definitions.forEach(function(def){ var definitions = this.definitions;
def._walk(visitor); for (var i = 0, len = definitions.length; i < len; i++) {
}); definitions[i]._walk(visitor);
}
}); });
} }
}, AST_Statement); }, AST_Statement);
@@ -573,9 +576,10 @@ var AST_Call = DEFNODE("Call", "expression args", {
_walk: function(visitor) { _walk: function(visitor) {
return visitor._visit(this, function(){ return visitor._visit(this, function(){
this.expression._walk(visitor); this.expression._walk(visitor);
this.args.forEach(function(arg){ var args = this.args;
arg._walk(visitor); for (var i = 0, len = args.length; i < len; i++) {
}); args[i]._walk(visitor);
}
}); });
} }
}); });
@@ -742,9 +746,10 @@ var AST_Array = DEFNODE("Array", "elements", {
}, },
_walk: function(visitor) { _walk: function(visitor) {
return visitor._visit(this, function(){ return visitor._visit(this, function(){
this.elements.forEach(function(el){ var elements = this.elements;
el._walk(visitor); for (var i = 0, len = elements.length; i < len; i++) {
}); elements[i]._walk(visitor);
}
}); });
} }
}); });
@@ -756,9 +761,10 @@ var AST_Object = DEFNODE("Object", "properties", {
}, },
_walk: function(visitor) { _walk: function(visitor) {
return visitor._visit(this, function(){ return visitor._visit(this, function(){
this.properties.forEach(function(prop){ var properties = this.properties;
prop._walk(visitor); for (var i = 0, len = properties.length; i < len; i++) {
}); properties[i]._walk(visitor);
}
}); });
} }
}); });

View File

@@ -1911,7 +1911,7 @@ merge(Compressor.prototype, {
// returned if nothing changed. // returned if nothing changed.
function trim(nodes, compressor, first_in_statement) { function trim(nodes, compressor, first_in_statement) {
var ret = [], changed = false; var ret = [], changed = false;
for (var i = 0, ii = nodes.length; i < ii; i++) { for (var i = 0, len = nodes.length; i < len; i++) {
var node = nodes[i].drop_side_effect_free(compressor, first_in_statement); var node = nodes[i].drop_side_effect_free(compressor, first_in_statement);
changed |= node !== nodes[i]; changed |= node !== nodes[i];
if (node) { if (node) {