Browse Source

[ClassDB] Unify construct/extension retrieval.

Fabio Alessandrelli 4 years ago
parent
commit
f9ce9a8e10

+ 7 - 13
core/extension/gdnative_interface.cpp

@@ -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) {
-	ClassDB::ClassInfo *class_info = ClassDB::classes.getptr(StringName(p_classname));
-	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 GDNativeObjectPtr gdnative_classdb_construct_object(GDNativeClassConstructor p_constructor, GDNativeExtensionPtr p_extension) {
+	return (GDNativeObjectPtr)ClassDB::construct_object((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_extended = gdnative_classdb_construct_extended;
+	gdni.classdb_construct_object = gdnative_classdb_construct_object;
 	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;
 
 

+ 2 - 3
core/extension/gdnative_interface.h

@@ -432,9 +432,8 @@ typedef struct {
 
 
 	/* CLASSDB */
 	/* CLASSDB */
 
 
-	GDNativeClassConstructor (*classdb_get_constructor)(const char *p_classname);
-	GDNativeExtensionPtr (*classdb_get_extension)(const char *p_classname);
-	GDNativeObjectPtr (*classdb_construct_extended)(GDNativeClassConstructor p_constructor, GDNativeExtensionPtr p_extension);
+	GDNativeClassConstructor (*classdb_get_constructor)(const char *p_classname, GDNativeExtensionPtr *r_extension);
+	GDNativeObjectPtr (*classdb_construct_object)(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);
 
 

+ 6 - 4
core/object/class_db.cpp

@@ -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) {
-	initializing_with_extension = true;
-	initializing_extension = p_extension;
-	initializing_extension_instance = p_extension->create_instance(p_extension->class_userdata);
+Object *ClassDB::construct_object(Object *(*p_create_func)(), ObjectNativeExtension *p_extension) {
+	if (p_extension) {
+		initializing_with_extension = true;
+		initializing_extension = p_extension;
+		initializing_extension_instance = p_extension->create_instance(p_extension->class_userdata);
+	}
 	return p_create_func();
 	return p_create_func();
 }
 }
 
 

+ 1 - 1
core/object/class_db.h

@@ -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);