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:
parent
f81153eb69
commit
5f66692395
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue