diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2024-02-12 23:29:37 +0100 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2024-02-12 23:29:37 +0100 |
commit | 306dd5be3fe8887124be9ebce470090240c5f757 (patch) | |
tree | 8a510ffda0e85b2148ae5bd22180cc74718d9561 /core/object/class_db.cpp | |
parent | 3be3d5099cc75a2db544b3a0964a430c3eb00909 (diff) | |
parent | be11002e410bbd8e01ef3e91682a94b50dba1dd8 (diff) | |
download | redot-engine-306dd5be3fe8887124be9ebce470090240c5f757.tar.gz |
Merge pull request #87758 from dsnopek/gdextension-register-virtual-method
Allow GDExtensions to register virtual methods and call them on scripts
Diffstat (limited to 'core/object/class_db.cpp')
-rw-r--r-- | core/object/class_db.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/core/object/class_db.cpp b/core/object/class_db.cpp index 45fbb19f88..f2a9a68d08 100644 --- a/core/object/class_db.cpp +++ b/core/object/class_db.cpp @@ -1615,6 +1615,28 @@ void ClassDB::get_virtual_methods(const StringName &p_class, List<MethodInfo> *p #endif } +void ClassDB::add_extension_class_virtual_method(const StringName &p_class, const GDExtensionClassVirtualMethodInfo *p_method_info) { + ERR_FAIL_COND_MSG(!classes.has(p_class), "Request for nonexistent class '" + p_class + "'."); + +#ifdef DEBUG_METHODS_ENABLED + PackedStringArray arg_names; + + MethodInfo mi; + mi.name = *reinterpret_cast<StringName *>(p_method_info->name); + mi.return_val = PropertyInfo(p_method_info->return_value); + mi.return_val_metadata = p_method_info->return_value_metadata; + mi.flags = p_method_info->method_flags; + for (int i = 0; i < (int)p_method_info->argument_count; i++) { + PropertyInfo arg(p_method_info->arguments[i]); + mi.arguments.push_back(arg); + mi.arguments_metadata.push_back(p_method_info->arguments_metadata[i]); + arg_names.push_back(arg.name); + } + + add_virtual_method(p_class, mi, true, arg_names); +#endif +} + void ClassDB::set_class_enabled(const StringName &p_class, bool p_enable) { OBJTYPE_WLOCK; |