소스 검색

Merge pull request #52883 from Germanrc/script_reload_fix

C# scripts reload in editor fixed
Rémi Verschelde 4 년 전
부모
커밋
6e39566344
2개의 변경된 파일8개의 추가작업 그리고 6개의 파일을 삭제
  1. 7 6
      modules/mono/csharp_script.cpp
  2. 1 0
      modules/mono/csharp_script.h

+ 7 - 6
modules/mono/csharp_script.cpp

@@ -2707,6 +2707,7 @@ int CSharpScript::_try_get_member_export_hint(IMonoClassMember *p_member, Manage
 void CSharpScript::_clear() {
 	tool = false;
 	valid = false;
+	reload_invalidated = true;
 
 	base = NULL;
 	native = NULL;
@@ -2810,6 +2811,7 @@ void CSharpScript::initialize_for_managed_type(Ref<CSharpScript> p_script, GDMon
 
 	p_script->valid = true;
 	p_script->tool = p_script->script_class->has_attribute(CACHED_CLASS(ToolAttribute));
+	p_script->reload_invalidated = false;
 
 	if (!p_script->tool) {
 		GDMonoClass *nesting_class = p_script->script_class->get_nesting_class();
@@ -3116,13 +3118,12 @@ MethodInfo CSharpScript::get_method_info(const StringName &p_method) const {
 }
 
 Error CSharpScript::reload(bool p_keep_state) {
-	bool has_instances;
-	{
-		MutexLock lock(CSharpLanguage::get_singleton()->script_instances_mutex);
-		has_instances = instances.size();
+	if (!reload_invalidated) {
+		return OK;
 	}
-
-	ERR_FAIL_COND_V(!p_keep_state && has_instances, ERR_ALREADY_IN_USE);
+	// In the case of C#, reload doesn't really do any script reloading.
+	// That's done separately via domain reloading.
+	reload_invalidated = false;
 
 	GD_MONO_SCOPE_THREAD_ATTACH;
 

+ 1 - 0
modules/mono/csharp_script.h

@@ -74,6 +74,7 @@ class CSharpScript : public Script {
 
 	bool tool;
 	bool valid;
+	bool reload_invalidated;
 
 	bool builtin;