Avoid c-style const_cast in GDScript

This commit is contained in:
rune-scape 2024-07-28 14:19:09 -07:00
parent 40b378e9e2
commit 5198a541b4
1 changed files with 33 additions and 54 deletions

View File

@ -482,6 +482,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
Variant retvalue; Variant retvalue;
Variant *stack = nullptr; Variant *stack = nullptr;
Variant **instruction_args = nullptr; Variant **instruction_args = nullptr;
const Variant **&argptrs = const_cast<const Variant **&>(instruction_args);
int defarg = 0; int defarg = 0;
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
@ -497,8 +498,8 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
if (p_state) { if (p_state) {
//use existing (supplied) state (awaited) //use existing (supplied) state (awaited)
stack = (Variant *)p_state->stack.ptr(); stack = const_cast<Variant *>(reinterpret_cast<const Variant *>(p_state->stack.ptr()));
instruction_args = (Variant **)&p_state->stack.ptr()[sizeof(Variant) * p_state->stack_size]; //ptr() to avoid bounds check instruction_args = const_cast<Variant **>(reinterpret_cast<Variant *const *>(&p_state->stack.ptr()[sizeof(Variant) * p_state->stack_size])); //ptr() to avoid bounds check
line = p_state->line; line = p_state->line;
ip = p_state->ip; ip = p_state->ip;
alloca_size = p_state->stack.size(); alloca_size = p_state->stack.size();
@ -526,8 +527,8 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
// Add 3 here for self, class, and nil. // Add 3 here for self, class, and nil.
alloca_size = sizeof(Variant *) * 3 + sizeof(Variant *) * _instruction_args_size + sizeof(Variant) * _stack_size; alloca_size = sizeof(Variant *) * 3 + sizeof(Variant *) * _instruction_args_size + sizeof(Variant) * _stack_size;
uint8_t *aptr = (uint8_t *)alloca(alloca_size); uint8_t *aptr = reinterpret_cast<uint8_t *>(alloca(alloca_size));
stack = (Variant *)aptr; stack = reinterpret_cast<Variant *>(aptr);
for (int i = 0; i < p_argcount; i++) { for (int i = 0; i < p_argcount; i++) {
if (!argument_types[i].has_type) { if (!argument_types[i].has_type) {
@ -573,7 +574,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
} }
if (_instruction_args_size) { if (_instruction_args_size) {
instruction_args = (Variant **)&aptr[sizeof(Variant) * _stack_size]; instruction_args = reinterpret_cast<Variant **>(&aptr[sizeof(Variant) * _stack_size]);
} else { } else {
instruction_args = nullptr; instruction_args = nullptr;
} }
@ -1333,7 +1334,8 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
if (Variant::can_convert_strict(src->get_type(), var_type)) { if (Variant::can_convert_strict(src->get_type(), var_type)) {
#endif // DEBUG_ENABLED #endif // DEBUG_ENABLED
Callable::CallError ce; Callable::CallError ce;
Variant::construct(var_type, *dst, const_cast<const Variant **>(&src), 1, ce); const Variant *args = src;
Variant::construct(var_type, *dst, &args, 1, ce);
} else { } else {
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
err_text = "Trying to assign value of type '" + Variant::get_type_name(src->get_type()) + err_text = "Trying to assign value of type '" + Variant::get_type_name(src->get_type()) +
@ -1597,16 +1599,14 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
Variant::Type t = Variant::Type(_code_ptr[ip + 2]); Variant::Type t = Variant::Type(_code_ptr[ip + 2]);
Variant **argptrs = instruction_args;
GET_INSTRUCTION_ARG(dst, argc); GET_INSTRUCTION_ARG(dst, argc);
Callable::CallError err; Callable::CallError err;
Variant::construct(t, *dst, (const Variant **)argptrs, argc, err); Variant::construct(t, *dst, argptrs, argc, err);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
if (err.error != Callable::CallError::CALL_OK) { if (err.error != Callable::CallError::CALL_OK) {
err_text = _get_call_error("'" + Variant::get_type_name(t) + "' constructor", (const Variant **)argptrs, *dst, err); err_text = _get_call_error("'" + Variant::get_type_name(t) + "' constructor", argptrs, *dst, err);
OPCODE_BREAK; OPCODE_BREAK;
} }
#endif #endif
@ -1626,11 +1626,9 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
GD_ERR_BREAK(constructor_idx < 0 || constructor_idx >= _constructors_count); GD_ERR_BREAK(constructor_idx < 0 || constructor_idx >= _constructors_count);
Variant::ValidatedConstructor constructor = _constructors_ptr[constructor_idx]; Variant::ValidatedConstructor constructor = _constructors_ptr[constructor_idx];
Variant **argptrs = instruction_args;
GET_INSTRUCTION_ARG(dst, argc); GET_INSTRUCTION_ARG(dst, argc);
constructor(dst, (const Variant **)argptrs); constructor(dst, argptrs);
ip += 3; ip += 3;
} }
@ -1729,7 +1727,6 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
const StringName *methodname = &_global_names_ptr[methodname_idx]; const StringName *methodname = &_global_names_ptr[methodname_idx];
GET_INSTRUCTION_ARG(base, argc); GET_INSTRUCTION_ARG(base, argc);
Variant **argptrs = instruction_args;
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
uint64_t call_time = 0; uint64_t call_time = 0;
@ -1746,7 +1743,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
Callable::CallError err; Callable::CallError err;
if (call_ret) { if (call_ret) {
GET_INSTRUCTION_ARG(ret, argc + 1); GET_INSTRUCTION_ARG(ret, argc + 1);
base->callp(*methodname, (const Variant **)argptrs, argc, temp_ret, err); base->callp(*methodname, argptrs, argc, temp_ret, err);
*ret = temp_ret; *ret = temp_ret;
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
if (ret->get_type() == Variant::NIL) { if (ret->get_type() == Variant::NIL) {
@ -1776,7 +1773,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
} }
#endif #endif
} else { } else {
base->callp(*methodname, (const Variant **)argptrs, argc, temp_ret, err); base->callp(*methodname, argptrs, argc, temp_ret, err);
} }
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
@ -1821,7 +1818,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
} }
} }
} }
err_text = _get_call_error("function '" + methodstr + (is_callable ? "" : "' in base '" + basestr) + "'", (const Variant **)argptrs, temp_ret, err); err_text = _get_call_error("function '" + methodstr + (is_callable ? "" : "' in base '" + basestr) + "'", argptrs, temp_ret, err);
OPCODE_BREAK; OPCODE_BREAK;
} }
#endif #endif
@ -1858,7 +1855,6 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
#else #else
Object *base_obj = base->operator Object *(); Object *base_obj = base->operator Object *();
#endif #endif
Variant **argptrs = instruction_args;
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
uint64_t call_time = 0; uint64_t call_time = 0;
@ -1871,10 +1867,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
Callable::CallError err; Callable::CallError err;
if (call_ret) { if (call_ret) {
GET_INSTRUCTION_ARG(ret, argc + 1); GET_INSTRUCTION_ARG(ret, argc + 1);
temp_ret = method->call(base_obj, (const Variant **)argptrs, argc, err); temp_ret = method->call(base_obj, argptrs, argc, err);
*ret = temp_ret; *ret = temp_ret;
} else { } else {
temp_ret = method->call(base_obj, (const Variant **)argptrs, argc, err); temp_ret = method->call(base_obj, argptrs, argc, err);
} }
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
@ -1907,7 +1903,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
} }
} }
} }
err_text = _get_call_error("function '" + methodstr + "' in base '" + basestr + "'", (const Variant **)argptrs, temp_ret, err); err_text = _get_call_error("function '" + methodstr + "' in base '" + basestr + "'", argptrs, temp_ret, err);
OPCODE_BREAK; OPCODE_BREAK;
} }
#endif #endif
@ -1933,8 +1929,6 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
GET_INSTRUCTION_ARG(ret, argc); GET_INSTRUCTION_ARG(ret, argc);
const Variant **argptrs = const_cast<const Variant **>(instruction_args);
Callable::CallError err; Callable::CallError err;
Variant::call_static(builtin_type, *methodname, argptrs, argc, *ret, err); Variant::call_static(builtin_type, *methodname, argptrs, argc, *ret, err);
@ -1963,8 +1957,6 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
GET_INSTRUCTION_ARG(ret, argc); GET_INSTRUCTION_ARG(ret, argc);
const Variant **argptrs = const_cast<const Variant **>(instruction_args);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
uint64_t call_time = 0; uint64_t call_time = 0;
if (GDScriptLanguage::get_singleton()->profiling && GDScriptLanguage::get_singleton()->profile_native_calls) { if (GDScriptLanguage::get_singleton()->profiling && GDScriptLanguage::get_singleton()->profile_native_calls) {
@ -2004,8 +1996,6 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
GD_ERR_BREAK(_code_ptr[ip + 2] < 0 || _code_ptr[ip + 2] >= _methods_count); GD_ERR_BREAK(_code_ptr[ip + 2] < 0 || _code_ptr[ip + 2] >= _methods_count);
MethodBind *method = _methods_ptr[_code_ptr[ip + 2]]; MethodBind *method = _methods_ptr[_code_ptr[ip + 2]];
Variant **argptrs = instruction_args;
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
uint64_t call_time = 0; uint64_t call_time = 0;
if (GDScriptLanguage::get_singleton()->profiling && GDScriptLanguage::get_singleton()->profile_native_calls) { if (GDScriptLanguage::get_singleton()->profiling && GDScriptLanguage::get_singleton()->profile_native_calls) {
@ -2014,7 +2004,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
#endif #endif
GET_INSTRUCTION_ARG(ret, argc); GET_INSTRUCTION_ARG(ret, argc);
method->validated_call(nullptr, (const Variant **)argptrs, ret); method->validated_call(nullptr, argptrs, ret);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
if (GDScriptLanguage::get_singleton()->profiling && GDScriptLanguage::get_singleton()->profile_native_calls) { if (GDScriptLanguage::get_singleton()->profiling && GDScriptLanguage::get_singleton()->profile_native_calls) {
@ -2040,7 +2030,6 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
GD_ERR_BREAK(_code_ptr[ip + 2] < 0 || _code_ptr[ip + 2] >= _methods_count); GD_ERR_BREAK(_code_ptr[ip + 2] < 0 || _code_ptr[ip + 2] >= _methods_count);
MethodBind *method = _methods_ptr[_code_ptr[ip + 2]]; MethodBind *method = _methods_ptr[_code_ptr[ip + 2]];
Variant **argptrs = instruction_args;
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
uint64_t call_time = 0; uint64_t call_time = 0;
if (GDScriptLanguage::get_singleton()->profiling && GDScriptLanguage::get_singleton()->profile_native_calls) { if (GDScriptLanguage::get_singleton()->profiling && GDScriptLanguage::get_singleton()->profile_native_calls) {
@ -2050,7 +2039,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
GET_INSTRUCTION_ARG(ret, argc); GET_INSTRUCTION_ARG(ret, argc);
VariantInternal::initialize(ret, Variant::NIL); VariantInternal::initialize(ret, Variant::NIL);
method->validated_call(nullptr, (const Variant **)argptrs, nullptr); method->validated_call(nullptr, argptrs, nullptr);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
if (GDScriptLanguage::get_singleton()->profiling && GDScriptLanguage::get_singleton()->profile_native_calls) { if (GDScriptLanguage::get_singleton()->profiling && GDScriptLanguage::get_singleton()->profile_native_calls) {
@ -2092,8 +2081,6 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
Object *base_obj = *VariantInternal::get_object(base); Object *base_obj = *VariantInternal::get_object(base);
#endif #endif
Variant **argptrs = instruction_args;
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
uint64_t call_time = 0; uint64_t call_time = 0;
if (GDScriptLanguage::get_singleton()->profiling && GDScriptLanguage::get_singleton()->profile_native_calls) { if (GDScriptLanguage::get_singleton()->profiling && GDScriptLanguage::get_singleton()->profile_native_calls) {
@ -2102,7 +2089,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
#endif #endif
GET_INSTRUCTION_ARG(ret, argc + 1); GET_INSTRUCTION_ARG(ret, argc + 1);
method->validated_call(base_obj, (const Variant **)argptrs, ret); method->validated_call(base_obj, argptrs, ret);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
if (GDScriptLanguage::get_singleton()->profiling && GDScriptLanguage::get_singleton()->profile_native_calls) { if (GDScriptLanguage::get_singleton()->profiling && GDScriptLanguage::get_singleton()->profile_native_calls) {
@ -2142,7 +2129,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
#else #else
Object *base_obj = *VariantInternal::get_object(base); Object *base_obj = *VariantInternal::get_object(base);
#endif #endif
Variant **argptrs = instruction_args;
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
uint64_t call_time = 0; uint64_t call_time = 0;
if (GDScriptLanguage::get_singleton()->profiling && GDScriptLanguage::get_singleton()->profile_native_calls) { if (GDScriptLanguage::get_singleton()->profiling && GDScriptLanguage::get_singleton()->profile_native_calls) {
@ -2152,7 +2139,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
GET_INSTRUCTION_ARG(ret, argc + 1); GET_INSTRUCTION_ARG(ret, argc + 1);
VariantInternal::initialize(ret, Variant::NIL); VariantInternal::initialize(ret, Variant::NIL);
method->validated_call(base_obj, (const Variant **)argptrs, nullptr); method->validated_call(base_obj, argptrs, nullptr);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
if (GDScriptLanguage::get_singleton()->profiling && GDScriptLanguage::get_singleton()->profile_native_calls) { if (GDScriptLanguage::get_singleton()->profiling && GDScriptLanguage::get_singleton()->profile_native_calls) {
@ -2180,10 +2167,9 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
GD_ERR_BREAK(_code_ptr[ip + 2] < 0 || _code_ptr[ip + 2] >= _builtin_methods_count); GD_ERR_BREAK(_code_ptr[ip + 2] < 0 || _code_ptr[ip + 2] >= _builtin_methods_count);
Variant::ValidatedBuiltInMethod method = _builtin_methods_ptr[_code_ptr[ip + 2]]; Variant::ValidatedBuiltInMethod method = _builtin_methods_ptr[_code_ptr[ip + 2]];
Variant **argptrs = instruction_args;
GET_INSTRUCTION_ARG(ret, argc + 1); GET_INSTRUCTION_ARG(ret, argc + 1);
method(base, (const Variant **)argptrs, argc, ret); method(base, argptrs, argc, ret);
ip += 3; ip += 3;
} }
@ -2201,12 +2187,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
GD_ERR_BREAK(_code_ptr[ip + 2] < 0 || _code_ptr[ip + 2] >= _global_names_count); GD_ERR_BREAK(_code_ptr[ip + 2] < 0 || _code_ptr[ip + 2] >= _global_names_count);
StringName function = _global_names_ptr[_code_ptr[ip + 2]]; StringName function = _global_names_ptr[_code_ptr[ip + 2]];
Variant **argptrs = instruction_args;
GET_INSTRUCTION_ARG(dst, argc); GET_INSTRUCTION_ARG(dst, argc);
Callable::CallError err; Callable::CallError err;
Variant::call_utility_function(function, dst, (const Variant **)argptrs, argc, err); Variant::call_utility_function(function, dst, argptrs, argc, err);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
if (err.error != Callable::CallError::CALL_OK) { if (err.error != Callable::CallError::CALL_OK) {
@ -2215,7 +2199,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
// Call provided error string. // Call provided error string.
err_text = vformat(R"*(Error calling utility function "%s()": %s)*", methodstr, *dst); err_text = vformat(R"*(Error calling utility function "%s()": %s)*", methodstr, *dst);
} else { } else {
err_text = _get_call_error(vformat(R"*(utility function "%s()")*", methodstr), (const Variant **)argptrs, *dst, err); err_text = _get_call_error(vformat(R"*(utility function "%s()")*", methodstr), argptrs, *dst, err);
} }
OPCODE_BREAK; OPCODE_BREAK;
} }
@ -2236,11 +2220,9 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
GD_ERR_BREAK(_code_ptr[ip + 2] < 0 || _code_ptr[ip + 2] >= _utilities_count); GD_ERR_BREAK(_code_ptr[ip + 2] < 0 || _code_ptr[ip + 2] >= _utilities_count);
Variant::ValidatedUtilityFunction function = _utilities_ptr[_code_ptr[ip + 2]]; Variant::ValidatedUtilityFunction function = _utilities_ptr[_code_ptr[ip + 2]];
Variant **argptrs = instruction_args;
GET_INSTRUCTION_ARG(dst, argc); GET_INSTRUCTION_ARG(dst, argc);
function(dst, (const Variant **)argptrs, argc); function(dst, argptrs, argc);
ip += 3; ip += 3;
} }
@ -2258,12 +2240,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
GD_ERR_BREAK(_code_ptr[ip + 2] < 0 || _code_ptr[ip + 2] >= _gds_utilities_count); GD_ERR_BREAK(_code_ptr[ip + 2] < 0 || _code_ptr[ip + 2] >= _gds_utilities_count);
GDScriptUtilityFunctions::FunctionPtr function = _gds_utilities_ptr[_code_ptr[ip + 2]]; GDScriptUtilityFunctions::FunctionPtr function = _gds_utilities_ptr[_code_ptr[ip + 2]];
Variant **argptrs = instruction_args;
GET_INSTRUCTION_ARG(dst, argc); GET_INSTRUCTION_ARG(dst, argc);
Callable::CallError err; Callable::CallError err;
function(dst, (const Variant **)argptrs, argc, err); function(dst, argptrs, argc, err);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
if (err.error != Callable::CallError::CALL_OK) { if (err.error != Callable::CallError::CALL_OK) {
@ -2272,7 +2252,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
// Call provided error string. // Call provided error string.
err_text = vformat(R"*(Error calling GDScript utility function "%s()": %s)*", methodstr, *dst); err_text = vformat(R"*(Error calling GDScript utility function "%s()": %s)*", methodstr, *dst);
} else { } else {
err_text = _get_call_error(vformat(R"*(GDScript utility function "%s()")*", methodstr), (const Variant **)argptrs, *dst, err); err_text = _get_call_error(vformat(R"*(GDScript utility function "%s()")*", methodstr), argptrs, *dst, err);
} }
OPCODE_BREAK; OPCODE_BREAK;
} }
@ -2299,8 +2279,6 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
#endif #endif
const StringName *methodname = &_global_names_ptr[self_fun]; const StringName *methodname = &_global_names_ptr[self_fun];
Variant **argptrs = instruction_args;
GET_INSTRUCTION_ARG(dst, argc); GET_INSTRUCTION_ARG(dst, argc);
const GDScript *gds = _script; const GDScript *gds = _script;
@ -2317,14 +2295,14 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
Callable::CallError err; Callable::CallError err;
if (E) { if (E) {
*dst = E->value->call(p_instance, (const Variant **)argptrs, argc, err); *dst = E->value->call(p_instance, argptrs, argc, err);
} else if (gds->native.ptr()) { } else if (gds->native.ptr()) {
if (*methodname != GDScriptLanguage::get_singleton()->strings._init) { if (*methodname != GDScriptLanguage::get_singleton()->strings._init) {
MethodBind *mb = ClassDB::get_method(gds->native->get_name(), *methodname); MethodBind *mb = ClassDB::get_method(gds->native->get_name(), *methodname);
if (!mb) { if (!mb) {
err.error = Callable::CallError::CALL_ERROR_INVALID_METHOD; err.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
} else { } else {
*dst = mb->call(p_instance->owner, (const Variant **)argptrs, argc, err); *dst = mb->call(p_instance->owner, argptrs, argc, err);
} }
} else { } else {
err.error = Callable::CallError::CALL_OK; err.error = Callable::CallError::CALL_OK;
@ -2339,7 +2317,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
if (err.error != Callable::CallError::CALL_OK) { if (err.error != Callable::CallError::CALL_OK) {
String methodstr = *methodname; String methodstr = *methodname;
err_text = _get_call_error("function '" + methodstr + "'", (const Variant **)argptrs, *dst, err); err_text = _get_call_error("function '" + methodstr + "'", argptrs, *dst, err);
OPCODE_BREAK; OPCODE_BREAK;
} }
@ -2600,7 +2578,8 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
if (r->get_type() != ret_type) { if (r->get_type() != ret_type) {
if (Variant::can_convert_strict(r->get_type(), ret_type)) { if (Variant::can_convert_strict(r->get_type(), ret_type)) {
Callable::CallError ce; Callable::CallError ce;
Variant::construct(ret_type, retvalue, const_cast<const Variant **>(&r), 1, ce); const Variant *args = r;
Variant::construct(ret_type, retvalue, &args, 1, ce);
} else { } else {
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
err_text = vformat(R"(Trying to return value of type "%s" from a function whose return type is "%s".)", err_text = vformat(R"(Trying to return value of type "%s" from a function whose return type is "%s".)",