Browse Source

Fix continuous attempt to reload domain with API assemblies out of sync

Ignacio Etcheverry 7 years ago
parent
commit
762c912e8e
1 changed files with 26 additions and 20 deletions
  1. 26 20
      modules/mono/csharp_script.cpp

+ 26 - 20
modules/mono/csharp_script.cpp

@@ -638,35 +638,41 @@ void CSharpLanguage::reload_tool_script(const Ref<Script> &p_script, bool p_soft
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 void CSharpLanguage::reload_assemblies_if_needed(bool p_soft_reload) {
 void CSharpLanguage::reload_assemblies_if_needed(bool p_soft_reload) {
 
 
-	if (gdmono->is_runtime_initialized()) {
-
-		GDMonoAssembly *proj_assembly = gdmono->get_project_assembly();
+	if (!gdmono->is_runtime_initialized())
+		return;
 
 
-		String name = ProjectSettings::get_singleton()->get("application/config/name");
-		if (name.empty()) {
-			name = "UnnamedProject";
-		}
+	GDMonoAssembly *proj_assembly = gdmono->get_project_assembly();
 
 
-		name += ".dll";
+	String name = ProjectSettings::get_singleton()->get("application/config/name");
+	if (name.empty()) {
+		name = "UnnamedProject";
+	}
 
 
-		if (proj_assembly) {
-			String proj_asm_path = proj_assembly->get_path();
+	name += ".dll";
 
 
-			if (!FileAccess::exists(proj_assembly->get_path())) {
-				// Maybe it wasn't loaded from the default path, so check this as well
-				proj_asm_path = GodotSharpDirs::get_res_temp_assemblies_dir().plus_file(name);
-				if (!FileAccess::exists(proj_asm_path))
-					return; // No assembly to load
-			}
+	if (proj_assembly) {
+		String proj_asm_path = proj_assembly->get_path();
 
 
-			if (FileAccess::get_modified_time(proj_asm_path) <= proj_assembly->get_modified_time())
-				return; // Already up to date
-		} else {
-			if (!FileAccess::exists(GodotSharpDirs::get_res_temp_assemblies_dir().plus_file(name)))
+		if (!FileAccess::exists(proj_assembly->get_path())) {
+			// Maybe it wasn't loaded from the default path, so check this as well
+			proj_asm_path = GodotSharpDirs::get_res_temp_assemblies_dir().plus_file(name);
+			if (!FileAccess::exists(proj_asm_path))
 				return; // No assembly to load
 				return; // No assembly to load
 		}
 		}
+
+		if (FileAccess::get_modified_time(proj_asm_path) <= proj_assembly->get_modified_time())
+			return; // Already up to date
+	} else {
+		if (!FileAccess::exists(GodotSharpDirs::get_res_temp_assemblies_dir().plus_file(name)))
+			return; // No assembly to load
 	}
 	}
 
 
+	if (!gdmono->get_core_api_assembly() && gdmono->metadata_is_api_assembly_invalidated(APIAssembly::API_CORE))
+		return; // The core API assembly to load is invalidated
+
+	if (!gdmono->get_editor_api_assembly() && gdmono->metadata_is_api_assembly_invalidated(APIAssembly::API_EDITOR))
+		return; // The editor API assembly to load is invalidated
+
 #ifndef NO_THREADS
 #ifndef NO_THREADS
 	lock->lock();
 	lock->lock();
 #endif
 #endif