diff options
author | Rémi Verschelde <remi@verschelde.fr> | 2016-02-28 23:00:57 +0100 |
---|---|---|
committer | Rémi Verschelde <remi@verschelde.fr> | 2016-02-28 23:00:57 +0100 |
commit | adf50568890cefb5fc354dbc1b21c4140bb410f9 (patch) | |
tree | d22d36d9bf5dc497acc0265aabab96d70d413825 /modules/gdscript/gd_parser.cpp | |
parent | ee2bc87c0ef3cc1a432655ff935e60f32977904d (diff) | |
parent | 5f66692395744712244f19e66eaa89790590a019 (diff) |
Merge pull request #3814 from est31/iterators_for_for
Add Iterators and use them for for
Diffstat (limited to 'modules/gdscript/gd_parser.cpp')
-rw-r--r-- | modules/gdscript/gd_parser.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/modules/gdscript/gd_parser.cpp b/modules/gdscript/gd_parser.cpp index 4f572b7b6e..4b0164d8a2 100644 --- a/modules/gdscript/gd_parser.cpp +++ b/modules/gdscript/gd_parser.cpp @@ -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; |