summaryrefslogtreecommitdiffstats
path: root/core/extension/gdextension.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/extension/gdextension.cpp')
-rw-r--r--core/extension/gdextension.cpp26
1 files changed, 10 insertions, 16 deletions
diff --git a/core/extension/gdextension.cpp b/core/extension/gdextension.cpp
index e295a2b30a..181bf1978f 100644
--- a/core/extension/gdextension.cpp
+++ b/core/extension/gdextension.cpp
@@ -218,36 +218,30 @@ public:
#ifdef TOOLS_ENABLED
ERR_FAIL_COND_MSG(!valid, vformat("Cannot call invalid GDExtension method bind '%s'. It's probably cached - you may need to restart Godot.", name));
#endif
- ERR_FAIL_COND_MSG(vararg, "Validated methods don't have ptrcall support. This is most likely an engine bug.");
+ ERR_FAIL_COND_MSG(vararg, "Vararg methods don't have validated call support. This is most likely an engine bug.");
GDExtensionClassInstancePtr extension_instance = is_static() ? nullptr : p_object->_get_extension_instance();
if (validated_call_func) {
// This is added here, but it's unlikely to be provided by most extensions.
validated_call_func(method_userdata, extension_instance, reinterpret_cast<GDExtensionConstVariantPtr *>(p_args), (GDExtensionVariantPtr)r_ret);
} else {
-#if 1
- // Slow code-path, but works for the time being.
- Callable::CallError ce;
- call(p_object, p_args, argument_count, ce);
-#else
- // This is broken, because it needs more information to do the calling properly
-
// If not provided, go via ptrcall, which is faster than resorting to regular call.
const void **argptrs = (const void **)alloca(argument_count * sizeof(void *));
for (uint32_t i = 0; i < argument_count; i++) {
argptrs[i] = VariantInternal::get_opaque_pointer(p_args[i]);
}
- bool returns = true;
- void *ret_opaque;
- if (returns) {
- ret_opaque = VariantInternal::get_opaque_pointer(r_ret);
- } else {
- ret_opaque = nullptr; // May be unnecessary as this is ignored, but just in case.
+ void *ret_opaque = nullptr;
+ if (r_ret) {
+ VariantInternal::initialize(r_ret, return_value_info.type);
+ ret_opaque = r_ret->get_type() == Variant::NIL ? r_ret : VariantInternal::get_opaque_pointer(r_ret);
}
ptrcall(p_object, argptrs, ret_opaque);
-#endif
+
+ if (r_ret && r_ret->get_type() == Variant::OBJECT) {
+ VariantInternal::update_object_id(r_ret);
+ }
}
}
@@ -782,7 +776,7 @@ void GDExtension::initialize_library(InitializationLevel p_level) {
level_initialized = int32_t(p_level);
- ERR_FAIL_COND(initialization.initialize == nullptr);
+ ERR_FAIL_NULL(initialization.initialize);
initialization.initialize(initialization.userdata, GDExtensionInitializationLevel(p_level));
}