Ver código fonte

Merge pull request #10085 from endragor/no-uninitialized-cb

Dont call nativescript callbacks if lib is not initialized
Thomas Herzog 8 anos atrás
pai
commit
f79a5c464b

+ 8 - 2
modules/gdnative/gdnative.cpp

@@ -155,7 +155,6 @@ String GDNativeLibrary::get_active_library_path() const {
 }
 
 GDNative::GDNative() {
-	initialized = false;
 	native_handle = NULL;
 }
 
@@ -219,6 +218,9 @@ bool GDNative::initialize() {
 			library_init);
 
 	if (err || !library_init) {
+		OS::get_singleton()->close_dynamic_library(native_handle);
+		native_handle = NULL;
+		ERR_PRINT("Failed to obtain godot_gdnative_init symbol");
 		return false;
 	}
 
@@ -272,7 +274,11 @@ bool GDNative::terminate() {
 	OS::get_singleton()->close_dynamic_library(native_handle);
 	native_handle = NULL;
 
-	return false;
+	return true;
+}
+
+bool GDNative::is_initialized() {
+	return (native_handle != NULL);
 }
 
 void GDNativeCallRegistry::register_native_call_type(StringName p_call_type, native_call_cb p_callback) {

+ 0 - 1
modules/gdnative/gdnative.h

@@ -117,7 +117,6 @@ class GDNative : public Reference {
 	GDCLASS(GDNative, Reference)
 
 	Ref<GDNativeLibrary> library;
-	bool initialized;
 
 	// TODO(karroffel): different platforms? WASM????
 	void *native_handle;

+ 9 - 7
modules/nativescript/nativescript.cpp

@@ -1055,13 +1055,15 @@ void NativeScriptLanguage::unregister_script(NativeScript *script) {
 void NativeScriptLanguage::call_libraries_cb(const StringName &name) {
 	// library_gdnatives is modified only from the main thread, so it's safe not to use mutex here
 	for (Map<String, Ref<GDNative> >::Element *L = library_gdnatives.front(); L; L = L->next()) {
-		L->get()->call_native_raw(
-				_noarg_call_type,
-				name,
-				NULL,
-				0,
-				NULL,
-				NULL);
+		if (L->get()->is_initialized()) {
+			L->get()->call_native_raw(
+					_noarg_call_type,
+					name,
+					NULL,
+					0,
+					NULL,
+					NULL);
+		}
 	}
 }