mirror of
https://github.com/godotengine/godot.git
synced 2024-11-27 09:16:35 +08:00
Merge pull request #74147 from vonagam/fix-call-await-check-in-compiler
GDScript: Fix checking if a call is awaited in compiler
This commit is contained in:
commit
a0134f7fbc
@ -511,6 +511,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
|
||||
} break;
|
||||
case GDScriptParser::Node::CALL: {
|
||||
const GDScriptParser::CallNode *call = static_cast<const GDScriptParser::CallNode *>(p_expression);
|
||||
bool is_awaited = p_expression == awaited_node;
|
||||
GDScriptDataType type = _gdtype_from_datatype(call->get_datatype(), codegen.script);
|
||||
GDScriptCodeGenerator::Address result;
|
||||
if (p_root) {
|
||||
@ -565,13 +566,13 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
|
||||
} else if ((codegen.function_node && codegen.function_node->is_static) || call->function_name == "new") {
|
||||
GDScriptCodeGenerator::Address self;
|
||||
self.mode = GDScriptCodeGenerator::Address::CLASS;
|
||||
if (within_await) {
|
||||
if (is_awaited) {
|
||||
gen->write_call_async(result, self, call->function_name, arguments);
|
||||
} else {
|
||||
gen->write_call(result, self, call->function_name, arguments);
|
||||
}
|
||||
} else {
|
||||
if (within_await) {
|
||||
if (is_awaited) {
|
||||
gen->write_call_self_async(result, call->function_name, arguments);
|
||||
} else {
|
||||
gen->write_call_self(result, call->function_name, arguments);
|
||||
@ -593,7 +594,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
|
||||
if (r_error) {
|
||||
return GDScriptCodeGenerator::Address();
|
||||
}
|
||||
if (within_await) {
|
||||
if (is_awaited) {
|
||||
gen->write_call_async(result, base, call->function_name, arguments);
|
||||
} else if (base.type.has_type && base.type.kind != GDScriptDataType::BUILTIN) {
|
||||
// Native method, use faster path.
|
||||
@ -666,9 +667,10 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
|
||||
const GDScriptParser::AwaitNode *await = static_cast<const GDScriptParser::AwaitNode *>(p_expression);
|
||||
|
||||
GDScriptCodeGenerator::Address result = codegen.add_temporary(_gdtype_from_datatype(p_expression->get_datatype(), codegen.script));
|
||||
within_await = true;
|
||||
GDScriptParser::ExpressionNode *previous_awaited_node = awaited_node;
|
||||
awaited_node = await->to_await;
|
||||
GDScriptCodeGenerator::Address argument = _parse_expression(codegen, r_error, await->to_await);
|
||||
within_await = false;
|
||||
awaited_node = previous_awaited_node;
|
||||
if (r_error) {
|
||||
return GDScriptCodeGenerator::Address();
|
||||
}
|
||||
|
@ -137,7 +137,7 @@ class GDScriptCompiler {
|
||||
int err_column = 0;
|
||||
StringName source;
|
||||
String error;
|
||||
bool within_await = false;
|
||||
GDScriptParser::ExpressionNode *awaited_node = nullptr;
|
||||
|
||||
public:
|
||||
static void convert_to_initializer_type(Variant &p_variant, const GDScriptParser::VariableNode *p_node);
|
||||
|
Loading…
Reference in New Issue
Block a user