You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-30 16:26:50 +00:00
[ClassDB] Unify construct/extension retrieval.
This commit is contained in:
@@ -854,24 +854,19 @@ static GDNativeMethodBindPtr gdnative_classdb_get_method_bind(const char *p_clas
|
|||||||
return (GDNativeMethodBindPtr)mb;
|
return (GDNativeMethodBindPtr)mb;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GDNativeClassConstructor gdnative_classdb_get_constructor(const char *p_classname) {
|
static GDNativeClassConstructor gdnative_classdb_get_constructor(const char *p_classname, GDNativeExtensionPtr *r_extension) {
|
||||||
ClassDB::ClassInfo *class_info = ClassDB::classes.getptr(StringName(p_classname));
|
ClassDB::ClassInfo *class_info = ClassDB::classes.getptr(StringName(p_classname));
|
||||||
if (class_info) {
|
if (class_info) {
|
||||||
|
if (r_extension) {
|
||||||
|
*r_extension = class_info->native_extension;
|
||||||
|
}
|
||||||
return (GDNativeClassConstructor)class_info->creation_func;
|
return (GDNativeClassConstructor)class_info->creation_func;
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GDNativeExtensionPtr gdnative_classdb_get_extension(const char *p_classname) {
|
static GDNativeObjectPtr gdnative_classdb_construct_object(GDNativeClassConstructor p_constructor, GDNativeExtensionPtr p_extension) {
|
||||||
ClassDB::ClassInfo *class_info = ClassDB::classes.getptr(StringName(p_classname));
|
return (GDNativeObjectPtr)ClassDB::construct_object((Object * (*)()) p_constructor, (ObjectNativeExtension *)p_extension);
|
||||||
if (class_info) {
|
|
||||||
return (GDNativeExtensionPtr)class_info->native_extension;
|
|
||||||
}
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GDNativeObjectPtr gdnative_classdb_construct_extended(GDNativeClassConstructor p_constructor, GDNativeExtensionPtr p_extension) {
|
|
||||||
return (GDNativeObjectPtr)ClassDB::construct_extended((Object * (*)()) p_constructor, (ObjectNativeExtension *)p_extension);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *gdnative_classdb_get_class_tag(const char *p_classname) {
|
static void *gdnative_classdb_get_class_tag(const char *p_classname) {
|
||||||
@@ -1022,8 +1017,7 @@ void gdnative_setup_interface(GDNativeInterface *p_interface) {
|
|||||||
/* CLASSDB */
|
/* CLASSDB */
|
||||||
|
|
||||||
gdni.classdb_get_constructor = gdnative_classdb_get_constructor;
|
gdni.classdb_get_constructor = gdnative_classdb_get_constructor;
|
||||||
gdni.classdb_get_extension = gdnative_classdb_get_extension;
|
gdni.classdb_construct_object = gdnative_classdb_construct_object;
|
||||||
gdni.classdb_construct_extended = gdnative_classdb_construct_extended;
|
|
||||||
gdni.classdb_get_method_bind = gdnative_classdb_get_method_bind;
|
gdni.classdb_get_method_bind = gdnative_classdb_get_method_bind;
|
||||||
gdni.classdb_get_class_tag = gdnative_classdb_get_class_tag;
|
gdni.classdb_get_class_tag = gdnative_classdb_get_class_tag;
|
||||||
|
|
||||||
|
|||||||
@@ -432,9 +432,8 @@ typedef struct {
|
|||||||
|
|
||||||
/* CLASSDB */
|
/* CLASSDB */
|
||||||
|
|
||||||
GDNativeClassConstructor (*classdb_get_constructor)(const char *p_classname);
|
GDNativeClassConstructor (*classdb_get_constructor)(const char *p_classname, GDNativeExtensionPtr *r_extension);
|
||||||
GDNativeExtensionPtr (*classdb_get_extension)(const char *p_classname);
|
GDNativeObjectPtr (*classdb_construct_object)(GDNativeClassConstructor p_constructor, GDNativeExtensionPtr p_extension);
|
||||||
GDNativeObjectPtr (*classdb_construct_extended)(GDNativeClassConstructor p_constructor, GDNativeExtensionPtr p_extension);
|
|
||||||
GDNativeMethodBindPtr (*classdb_get_method_bind)(const char *p_classname, const char *p_methodname, GDNativeInt p_hash);
|
GDNativeMethodBindPtr (*classdb_get_method_bind)(const char *p_classname, const char *p_methodname, GDNativeInt p_hash);
|
||||||
void *(*classdb_get_class_tag)(const char *p_classname);
|
void *(*classdb_get_class_tag)(const char *p_classname);
|
||||||
|
|
||||||
|
|||||||
@@ -545,10 +545,12 @@ Object *ClassDB::instantiate(const StringName &p_class) {
|
|||||||
return ti->creation_func();
|
return ti->creation_func();
|
||||||
}
|
}
|
||||||
|
|
||||||
Object *ClassDB::construct_extended(Object *(*p_create_func)(), ObjectNativeExtension *p_extension) {
|
Object *ClassDB::construct_object(Object *(*p_create_func)(), ObjectNativeExtension *p_extension) {
|
||||||
|
if (p_extension) {
|
||||||
initializing_with_extension = true;
|
initializing_with_extension = true;
|
||||||
initializing_extension = p_extension;
|
initializing_extension = p_extension;
|
||||||
initializing_extension_instance = p_extension->create_instance(p_extension->class_userdata);
|
initializing_extension_instance = p_extension->create_instance(p_extension->class_userdata);
|
||||||
|
}
|
||||||
return p_create_func();
|
return p_create_func();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -234,7 +234,7 @@ public:
|
|||||||
static bool is_parent_class(const StringName &p_class, const StringName &p_inherits);
|
static bool is_parent_class(const StringName &p_class, const StringName &p_inherits);
|
||||||
static bool can_instantiate(const StringName &p_class);
|
static bool can_instantiate(const StringName &p_class);
|
||||||
static Object *instantiate(const StringName &p_class);
|
static Object *instantiate(const StringName &p_class);
|
||||||
static Object *construct_extended(Object *(*p_create_func)(), ObjectNativeExtension *p_extension);
|
static Object *construct_object(Object *(*p_create_func)(), ObjectNativeExtension *p_extension);
|
||||||
static void instance_get_native_extension_data(ObjectNativeExtension **r_extension, GDExtensionClassInstancePtr *r_extension_instance, Object *p_base);
|
static void instance_get_native_extension_data(ObjectNativeExtension **r_extension, GDExtensionClassInstancePtr *r_extension_instance, Object *p_base);
|
||||||
|
|
||||||
static APIType get_api_type(const StringName &p_class);
|
static APIType get_api_type(const StringName &p_class);
|
||||||
|
|||||||
Reference in New Issue
Block a user