Fix error when calling coroutine with await in _ready
The code paths for calling async functions seemed to be missing in some cases, causing a debug break and false positive error.
This commit is contained in:
parent
68117f5e75
commit
2e4ee06b7a
|
@ -899,6 +899,17 @@ void GDScriptByteCodeGenerator::write_call_self(const Address &p_target, const S
|
||||||
append(p_function_name);
|
append(p_function_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GDScriptByteCodeGenerator::write_call_self_async(const Address &p_target, const StringName &p_function_name, const Vector<Address> &p_arguments) {
|
||||||
|
append(GDScriptFunction::OPCODE_CALL_ASYNC, 2 + p_arguments.size());
|
||||||
|
for (int i = 0; i < p_arguments.size(); i++) {
|
||||||
|
append(p_arguments[i]);
|
||||||
|
}
|
||||||
|
append(GDScriptFunction::ADDR_TYPE_SELF << GDScriptFunction::ADDR_BITS);
|
||||||
|
append(p_target);
|
||||||
|
append(p_arguments.size());
|
||||||
|
append(p_function_name);
|
||||||
|
}
|
||||||
|
|
||||||
void GDScriptByteCodeGenerator::write_call_script_function(const Address &p_target, const Address &p_base, const StringName &p_function_name, const Vector<Address> &p_arguments) {
|
void GDScriptByteCodeGenerator::write_call_script_function(const Address &p_target, const Address &p_base, const StringName &p_function_name, const Vector<Address> &p_arguments) {
|
||||||
append(p_target.mode == Address::NIL ? GDScriptFunction::OPCODE_CALL : GDScriptFunction::OPCODE_CALL_RETURN, 2 + p_arguments.size());
|
append(p_target.mode == Address::NIL ? GDScriptFunction::OPCODE_CALL : GDScriptFunction::OPCODE_CALL_RETURN, 2 + p_arguments.size());
|
||||||
for (int i = 0; i < p_arguments.size(); i++) {
|
for (int i = 0; i < p_arguments.size(); i++) {
|
||||||
|
|
|
@ -441,6 +441,7 @@ public:
|
||||||
virtual void write_call_method_bind(const Address &p_target, const Address &p_base, MethodBind *p_method, const Vector<Address> &p_arguments) override;
|
virtual void write_call_method_bind(const Address &p_target, const Address &p_base, MethodBind *p_method, const Vector<Address> &p_arguments) override;
|
||||||
virtual void write_call_ptrcall(const Address &p_target, const Address &p_base, MethodBind *p_method, const Vector<Address> &p_arguments) override;
|
virtual void write_call_ptrcall(const Address &p_target, const Address &p_base, MethodBind *p_method, const Vector<Address> &p_arguments) override;
|
||||||
virtual void write_call_self(const Address &p_target, const StringName &p_function_name, const Vector<Address> &p_arguments) override;
|
virtual void write_call_self(const Address &p_target, const StringName &p_function_name, const Vector<Address> &p_arguments) override;
|
||||||
|
virtual void write_call_self_async(const Address &p_target, const StringName &p_function_name, const Vector<Address> &p_arguments) override;
|
||||||
virtual void write_call_script_function(const Address &p_target, const Address &p_base, const StringName &p_function_name, const Vector<Address> &p_arguments) override;
|
virtual void write_call_script_function(const Address &p_target, const Address &p_base, const StringName &p_function_name, const Vector<Address> &p_arguments) override;
|
||||||
virtual void write_construct(const Address &p_target, Variant::Type p_type, const Vector<Address> &p_arguments) override;
|
virtual void write_construct(const Address &p_target, Variant::Type p_type, const Vector<Address> &p_arguments) override;
|
||||||
virtual void write_construct_array(const Address &p_target, const Vector<Address> &p_arguments) override;
|
virtual void write_construct_array(const Address &p_target, const Vector<Address> &p_arguments) override;
|
||||||
|
|
|
@ -133,6 +133,7 @@ public:
|
||||||
virtual void write_call_method_bind(const Address &p_target, const Address &p_base, MethodBind *p_method, const Vector<Address> &p_arguments) = 0;
|
virtual void write_call_method_bind(const Address &p_target, const Address &p_base, MethodBind *p_method, const Vector<Address> &p_arguments) = 0;
|
||||||
virtual void write_call_ptrcall(const Address &p_target, const Address &p_base, MethodBind *p_method, const Vector<Address> &p_arguments) = 0;
|
virtual void write_call_ptrcall(const Address &p_target, const Address &p_base, MethodBind *p_method, const Vector<Address> &p_arguments) = 0;
|
||||||
virtual void write_call_self(const Address &p_target, const StringName &p_function_name, const Vector<Address> &p_arguments) = 0;
|
virtual void write_call_self(const Address &p_target, const StringName &p_function_name, const Vector<Address> &p_arguments) = 0;
|
||||||
|
virtual void write_call_self_async(const Address &p_target, const StringName &p_function_name, const Vector<Address> &p_arguments) = 0;
|
||||||
virtual void write_call_script_function(const Address &p_target, const Address &p_base, const StringName &p_function_name, const Vector<Address> &p_arguments) = 0;
|
virtual void write_call_script_function(const Address &p_target, const Address &p_base, const StringName &p_function_name, const Vector<Address> &p_arguments) = 0;
|
||||||
virtual void write_construct(const Address &p_target, Variant::Type p_type, const Vector<Address> &p_arguments) = 0;
|
virtual void write_construct(const Address &p_target, Variant::Type p_type, const Vector<Address> &p_arguments) = 0;
|
||||||
virtual void write_construct_array(const Address &p_target, const Vector<Address> &p_arguments) = 0;
|
virtual void write_construct_array(const Address &p_target, const Vector<Address> &p_arguments) = 0;
|
||||||
|
|
|
@ -494,9 +494,17 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
|
||||||
} else if ((codegen.function_node && codegen.function_node->is_static) || call->function_name == "new") {
|
} else if ((codegen.function_node && codegen.function_node->is_static) || call->function_name == "new") {
|
||||||
GDScriptCodeGenerator::Address self;
|
GDScriptCodeGenerator::Address self;
|
||||||
self.mode = GDScriptCodeGenerator::Address::CLASS;
|
self.mode = GDScriptCodeGenerator::Address::CLASS;
|
||||||
gen->write_call(result, self, call->function_name, arguments);
|
if (within_await) {
|
||||||
|
gen->write_call_async(result, self, call->function_name, arguments);
|
||||||
|
} else {
|
||||||
|
gen->write_call(result, self, call->function_name, arguments);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
gen->write_call_self(result, call->function_name, arguments);
|
if (within_await) {
|
||||||
|
gen->write_call_self_async(result, call->function_name, arguments);
|
||||||
|
} else {
|
||||||
|
gen->write_call_self(result, call->function_name, arguments);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (callee->type == GDScriptParser::Node::SUBSCRIPT) {
|
} else if (callee->type == GDScriptParser::Node::SUBSCRIPT) {
|
||||||
const GDScriptParser::SubscriptNode *subscript = static_cast<const GDScriptParser::SubscriptNode *>(call->callee);
|
const GDScriptParser::SubscriptNode *subscript = static_cast<const GDScriptParser::SubscriptNode *>(call->callee);
|
||||||
|
|
Loading…
Reference in New Issue