Compare commits

...

2 Commits

Author SHA1 Message Date
忘忧の 4a9122ae35
Merge 29d19fbed1 into 6c04514039 2024-01-19 07:32:34 -06:00
DaylilyZeleen 29d19fbed1 Fix object return value of builtin types' methods. 2024-01-19 14:18:31 +08:00
2 changed files with 29 additions and 2 deletions

View File

@ -964,8 +964,20 @@ def generate_builtin_class_source(builtin_api, size, used_classes, fully_used_cl
result.append(method_signature + "{") result.append(method_signature + "{")
method_call = "\t" method_call = "\t"
need_additional_right_bracke = False
if "return_type" in method: if "return_type" in method:
method_call += f'return internal::_call_builtin_method_ptr_ret<{correct_type(method["return_type"])}>(' return_type = method["return_type"]
if not is_variant(return_type) and not is_pod_type(return_type) and not is_enum(return_type):
if is_refcounted(return_type):
# RefCounted
method_call += f"return Ref<{return_type}>::_gde_internal_constructor("
need_additional_right_bracke = True
else:
# Object
method_call += f"return "
method_call += f"internal::_call_builtin_method_ptr_ret_obj<{return_type}>("
else:
method_call += f"return internal::_call_builtin_method_ptr_ret<{correct_type(return_type)}>("
else: else:
method_call += "internal::_call_builtin_method_ptr_no_ret(" method_call += "internal::_call_builtin_method_ptr_no_ret("
method_call += f'_method_bindings.method_{method["name"]}, ' method_call += f'_method_bindings.method_{method["name"]}, '
@ -986,7 +998,10 @@ def generate_builtin_class_source(builtin_api, size, used_classes, fully_used_cl
result += encode result += encode
arguments.append(arg_name) arguments.append(arg_name)
method_call += ", ".join(arguments) method_call += ", ".join(arguments)
method_call += ");" if need_additional_right_bracke:
method_call += "));"
else:
method_call += ");"
result.append(method_call) result.append(method_call)
result.append("}") result.append("}")

View File

@ -32,6 +32,7 @@
#define GODOT_BUILTIN_PTRCALL_HPP #define GODOT_BUILTIN_PTRCALL_HPP
#include <gdextension_interface.h> #include <gdextension_interface.h>
#include <godot_cpp/core/object.hpp>
#include <array> #include <array>
@ -39,6 +40,17 @@ namespace godot {
namespace internal { namespace internal {
template <class O, class... Args>
O *_call_builtin_method_ptr_ret_obj(const GDExtensionPtrBuiltInMethod method, GDExtensionTypePtr base, const Args &...args) {
GodotObject *ret = nullptr;
std::array<GDExtensionConstTypePtr, sizeof...(Args)> call_args = { { (GDExtensionConstTypePtr)args... } };
method(base, call_args.data(), &ret, sizeof...(Args));
if (ret == nullptr) {
return nullptr;
}
return reinterpret_cast<O *>(internal::get_object_instance_binding(ret));
}
template <class... Args> template <class... Args>
void _call_builtin_constructor(const GDExtensionPtrConstructor constructor, GDExtensionTypePtr base, Args... args) { void _call_builtin_constructor(const GDExtensionPtrConstructor constructor, GDExtensionTypePtr base, Args... args) {
std::array<GDExtensionConstTypePtr, sizeof...(Args)> call_args = { { (GDExtensionConstTypePtr)args... } }; std::array<GDExtensionConstTypePtr, sizeof...(Args)> call_args = { { (GDExtensionConstTypePtr)args... } };