GDScript: Reset local variables on exit from block

This commit is contained in:
Danil Alexeev 2023-06-01 21:46:37 +03:00
parent 621d68e412
commit f3bf75fbb4
No known key found for this signature in database
GPG key ID: 124453E157DA8DC7
8 changed files with 96 additions and 14 deletions

View file

@ -1532,6 +1532,11 @@ GDScriptParser::SuiteNode *GDScriptParser::parse_suite(const String &p_context,
suite->parent_function = current_function;
current_suite = suite;
if (!p_for_lambda && suite->parent_block != nullptr && suite->parent_block->is_in_loop) {
// Do not reset to false if true is set before calling parse_suite().
suite->is_in_loop = true;
}
bool multiline = false;
if (match(GDScriptTokenizer::Token::NEWLINE)) {
@ -1867,9 +1872,8 @@ GDScriptParser::ForNode *GDScriptParser::parse_for() {
}
suite->add_local(SuiteNode::Local(n_for->variable, current_function));
}
suite->is_in_loop = true;
n_for->loop = parse_suite(R"("for" block)", suite);
n_for->loop->is_loop = true;
complete_extents(n_for);
// Reset break/continue state.
@ -2182,8 +2186,9 @@ GDScriptParser::WhileNode *GDScriptParser::parse_while() {
can_break = true;
can_continue = true;
n_while->loop = parse_suite(R"("while" block)");
n_while->loop->is_loop = true;
SuiteNode *suite = alloc_node<SuiteNode>();
suite->is_in_loop = true;
n_while->loop = parse_suite(R"("while" block)", suite);
complete_extents(n_while);
// Reset break/continue state.