Use xrange for common "for i in range(...)" use case

Make the parser eliminate a wasteful allocation and initialisation
of a possibly large array.
This commit is contained in:
est31 2016-02-24 02:46:36 +01:00
parent f81153eb69
commit 5f66692395
1 changed files with 14 additions and 0 deletions

View File

@ -1779,6 +1779,20 @@ void GDParser::_parse_block(BlockNode *p_block,bool p_static) {
return;
}
// Little optimisation for common usage "for i in range(...):":
// don't create and initialize a possibly huge array as range()
// would do, but instead create an iterator using xrange()
if (container->type == Node::TYPE_OPERATOR) {
OperatorNode *op = static_cast<OperatorNode *>(container);
if (op->arguments.size() > 0 &&
op->arguments[0]->type == Node::TYPE_BUILT_IN_FUNCTION) {
BuiltInFunctionNode *c = static_cast<BuiltInFunctionNode *>(op->arguments[0]);
if (c->function == GDFunctions::GEN_RANGE) {
c->function = GDFunctions::GEN_XRANGE;
}
}
}
ControlFlowNode *cf_for = alloc_node<ControlFlowNode>();
cf_for->cf_type=ControlFlowNode::CF_FOR;