summaryrefslogtreecommitdiff
path: root/modules/gdscript/gd_parser.cpp
diff options
context:
space:
mode:
authorRémi Verschelde <remi@verschelde.fr>2016-02-28 23:00:57 +0100
committerRémi Verschelde <remi@verschelde.fr>2016-02-28 23:00:57 +0100
commitadf50568890cefb5fc354dbc1b21c4140bb410f9 (patch)
treed22d36d9bf5dc497acc0265aabab96d70d413825 /modules/gdscript/gd_parser.cpp
parentee2bc87c0ef3cc1a432655ff935e60f32977904d (diff)
parent5f66692395744712244f19e66eaa89790590a019 (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.cpp14
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;