mirror of
https://github.com/godotengine/godot.git
synced 2024-12-15 10:12:40 +08:00
Merge pull request #72390 from vonagam/fix-allowed-vararg-ptrcall
GDScript: Fix vararg method calls with exact arguments
This commit is contained in:
commit
08ec942e1f
@ -196,7 +196,11 @@ static bool _is_exact_type(const PropertyInfo &p_par_type, const GDScriptDataTyp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool _have_exact_arguments(const MethodBind *p_method, const Vector<GDScriptCodeGenerator::Address> &p_arguments) {
|
static bool _can_use_ptrcall(const MethodBind *p_method, const Vector<GDScriptCodeGenerator::Address> &p_arguments) {
|
||||||
|
if (p_method->is_vararg()) {
|
||||||
|
// ptrcall won't work with vararg methods.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (p_method->get_argument_count() != p_arguments.size()) {
|
if (p_method->get_argument_count() != p_arguments.size()) {
|
||||||
// ptrcall won't work with default arguments.
|
// ptrcall won't work with default arguments.
|
||||||
return false;
|
return false;
|
||||||
@ -563,7 +567,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
|
|||||||
self.mode = GDScriptCodeGenerator::Address::SELF;
|
self.mode = GDScriptCodeGenerator::Address::SELF;
|
||||||
MethodBind *method = ClassDB::get_method(codegen.script->native->get_name(), call->function_name);
|
MethodBind *method = ClassDB::get_method(codegen.script->native->get_name(), call->function_name);
|
||||||
|
|
||||||
if (_have_exact_arguments(method, arguments)) {
|
if (_can_use_ptrcall(method, arguments)) {
|
||||||
// Exact arguments, use ptrcall.
|
// Exact arguments, use ptrcall.
|
||||||
gen->write_call_ptrcall(result, self, method, arguments);
|
gen->write_call_ptrcall(result, self, method, arguments);
|
||||||
} else {
|
} else {
|
||||||
@ -613,7 +617,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
|
|||||||
}
|
}
|
||||||
if (ClassDB::class_exists(class_name) && ClassDB::has_method(class_name, call->function_name)) {
|
if (ClassDB::class_exists(class_name) && ClassDB::has_method(class_name, call->function_name)) {
|
||||||
MethodBind *method = ClassDB::get_method(class_name, call->function_name);
|
MethodBind *method = ClassDB::get_method(class_name, call->function_name);
|
||||||
if (_have_exact_arguments(method, arguments)) {
|
if (_can_use_ptrcall(method, arguments)) {
|
||||||
// Exact arguments, use ptrcall.
|
// Exact arguments, use ptrcall.
|
||||||
gen->write_call_ptrcall(result, base, method, arguments);
|
gen->write_call_ptrcall(result, base, method, arguments);
|
||||||
} else {
|
} else {
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
signal ok()
|
||||||
|
|
||||||
|
@warning_ignore("return_value_discarded")
|
||||||
|
func test():
|
||||||
|
ok.connect(func(): print('ok'))
|
||||||
|
emit_signal(&'ok')
|
@ -0,0 +1,2 @@
|
|||||||
|
GDTEST_OK
|
||||||
|
ok
|
Loading…
Reference in New Issue
Block a user