summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Snopek <dsnopek@gmail.com>2023-10-04 10:00:52 -0500
committerDavid Snopek <dsnopek@gmail.com>2023-10-04 10:53:17 -0500
commit55596eaac66036a4e75b0809e6062badba16004b (patch)
tree439c52c4d9a3578ea19adf773b8864ae3bacf528
parentbfd78bb917887cfc1fd842ba23570394cad8bedb (diff)
downloadredot-engine-55596eaac66036a4e75b0809e6062badba16004b.tar.gz
GDExtension: Convert `validated_call()` to `ptrcall()` (rather than `call()`)
-rw-r--r--core/extension/gdextension.cpp20
-rw-r--r--core/variant/variant_internal.h2
2 files changed, 8 insertions, 14 deletions
diff --git a/core/extension/gdextension.cpp b/core/extension/gdextension.cpp
index 7e280466a8..a7c6555615 100644
--- a/core/extension/gdextension.cpp
+++ b/core/extension/gdextension.cpp
@@ -225,29 +225,23 @@ public:
// 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) {
+ void *ret_opaque = nullptr;
+ if (r_ret) {
+ VariantInternal::initialize(r_ret, return_value_info.type);
ret_opaque = VariantInternal::get_opaque_pointer(r_ret);
- } else {
- ret_opaque = nullptr; // May be unnecessary as this is ignored, but just in case.
}
ptrcall(p_object, argptrs, ret_opaque);
-#endif
+
+ if (r_ret && r_ret->get_type() == Variant::OBJECT) {
+ VariantInternal::update_object_id(r_ret);
+ }
}
}
diff --git a/core/variant/variant_internal.h b/core/variant/variant_internal.h
index 782053b613..116210e8de 100644
--- a/core/variant/variant_internal.h
+++ b/core/variant/variant_internal.h
@@ -418,7 +418,7 @@ public:
case Variant::PACKED_COLOR_ARRAY:
return get_color_array(v);
case Variant::OBJECT:
- return v->_get_obj().obj;
+ return get_object(v);
case Variant::VARIANT_MAX:
ERR_FAIL_V(nullptr);
}