Skip to content

Commit 7bccd51

Browse files
committed
GDExtension: Add system for builtin method compatibility
1 parent 0870525 commit 7bccd51

File tree

4 files changed

+247
-63
lines changed

4 files changed

+247
-63
lines changed

core/extension/extension_api_dump.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -797,6 +797,17 @@ Dictionary GDExtensionAPIDump::generate_extension_api(bool p_include_docs) {
797797
d2["is_static"] = Variant::is_builtin_method_static(type, method_name);
798798
d2["hash"] = Variant::get_builtin_method_hash(type, method_name);
799799

800+
Vector<uint32_t> compat_hashes = Variant::get_builtin_method_compatibility_hashes(type, method_name);
801+
Array compatibility;
802+
if (compat_hashes.size()) {
803+
for (int j = 0; j < compat_hashes.size(); j++) {
804+
compatibility.push_back(compat_hashes[j]);
805+
}
806+
}
807+
if (compatibility.size() > 0) {
808+
d2["hash_compatibility"] = compatibility;
809+
}
810+
800811
Vector<Variant> default_args = Variant::get_builtin_method_default_arguments(type, method_name);
801812

802813
Array arguments;

core/extension/gdextension_interface.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -817,13 +817,11 @@ static GDExtensionPtrOperatorEvaluator gdextension_variant_get_ptr_operator_eval
817817
}
818818
static GDExtensionPtrBuiltInMethod gdextension_variant_get_ptr_builtin_method(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, GDExtensionInt p_hash) {
819819
const StringName method = *reinterpret_cast<const StringName *>(p_method);
820-
uint32_t hash = Variant::get_builtin_method_hash(Variant::Type(p_type), method);
821-
if (hash != p_hash) {
822-
ERR_PRINT_ONCE("Error getting method " + method + ", hash mismatch.");
823-
return nullptr;
820+
GDExtensionPtrBuiltInMethod ptr = (GDExtensionPtrBuiltInMethod)Variant::get_ptr_builtin_method_with_compatibility(Variant::Type(p_type), method, p_hash);
821+
if (!ptr) {
822+
ERR_PRINT("Error getting method " + method + ", missing or hash mismatch.");
824823
}
825-
826-
return (GDExtensionPtrBuiltInMethod)Variant::get_ptr_builtin_method(Variant::Type(p_type), method);
824+
return ptr;
827825
}
828826
static GDExtensionPtrConstructor gdextension_variant_get_ptr_constructor(GDExtensionVariantType p_type, int32_t p_constructor) {
829827
return (GDExtensionPtrConstructor)Variant::get_ptr_constructor(Variant::Type(p_type), p_constructor);

core/variant/variant.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,7 @@ class Variant {
645645

646646
static ValidatedBuiltInMethod get_validated_builtin_method(Variant::Type p_type, const StringName &p_method);
647647
static PTRBuiltInMethod get_ptr_builtin_method(Variant::Type p_type, const StringName &p_method);
648+
static PTRBuiltInMethod get_ptr_builtin_method_with_compatibility(Variant::Type p_type, const StringName &p_method, uint32_t p_hash);
648649

649650
static MethodInfo get_builtin_method_info(Variant::Type p_type, const StringName &p_method);
650651
static int get_builtin_method_argument_count(Variant::Type p_type, const StringName &p_method);
@@ -659,6 +660,7 @@ class Variant {
659660
static void get_builtin_method_list(Variant::Type p_type, List<StringName> *p_list);
660661
static int get_builtin_method_count(Variant::Type p_type);
661662
static uint32_t get_builtin_method_hash(Variant::Type p_type, const StringName &p_method);
663+
static Vector<uint32_t> get_builtin_method_compatibility_hashes(Variant::Type p_type, const StringName &p_method);
662664

663665
void callp(const StringName &p_method, const Variant **p_args, int p_argcount, Variant &r_ret, Callable::CallError &r_error);
664666

0 commit comments

Comments
 (0)