Merge pull request #72390 from vonagam/fix-allowed-vararg-ptrcall

GDScript: Fix vararg method calls with exact arguments
This commit is contained in:
Rémi Verschelde 2023-01-30 20:26:58 +01:00
commit 08ec942e1f
No known key found for this signature in database
GPG Key ID: C3336907360768E1
3 changed files with 15 additions and 3 deletions

View File

@ -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 {

View File

@ -0,0 +1,6 @@
signal ok()
@warning_ignore("return_value_discarded")
func test():
ok.connect(func(): print('ok'))
emit_signal(&'ok')

View File

@ -0,0 +1,2 @@
GDTEST_OK
ok