Selaa lähdekoodia

Mono/C#: Fix several clang-tidy warnings and cleanup

Ignacio Etcheverry 5 vuotta sitten
vanhempi
commit
2511c43972
48 muutettua tiedostoa jossa 935 lisäystä ja 1205 poistoa
  1. 4 2
      modules/mono/class_db_api_json.cpp
  2. 204 109
      modules/mono/csharp_script.cpp
  3. 129 124
      modules/mono/csharp_script.h
  4. 0 2
      modules/mono/editor/bindings_generator.cpp
  5. 12 6
      modules/mono/editor/code_completion.cpp
  6. 2 1
      modules/mono/editor/csharp_project.cpp
  7. 1 1
      modules/mono/editor/editor_internal_calls.cpp
  8. 4 2
      modules/mono/editor/godotsharp_export.cpp
  9. 34 17
      modules/mono/editor/script_class_parser.cpp
  10. 0 1
      modules/mono/editor/script_class_parser.h
  11. 2 2
      modules/mono/glue/arguments_vector.h
  12. 8 4
      modules/mono/glue/base_object_glue.cpp
  13. 0 73
      modules/mono/glue/base_object_glue.h
  14. 3 2
      modules/mono/glue/collections_glue.cpp
  15. 0 124
      modules/mono/glue/collections_glue.h
  16. 9 7
      modules/mono/glue/gd_glue.cpp
  17. 0 86
      modules/mono/glue/gd_glue.h
  18. 10 8
      modules/mono/glue/glue_header.h
  19. 5 4
      modules/mono/glue/nodepath_glue.cpp
  20. 0 68
      modules/mono/glue/nodepath_glue.h
  21. 6 3
      modules/mono/glue/rid_glue.cpp
  22. 0 53
      modules/mono/glue/rid_glue.h
  23. 9 5
      modules/mono/glue/scene_tree_glue.cpp
  24. 0 50
      modules/mono/glue/scene_tree_glue.h
  25. 2 2
      modules/mono/glue/string_glue.cpp
  26. 0 56
      modules/mono/glue/string_glue.h
  27. 4 3
      modules/mono/glue/string_name_glue.cpp
  28. 0 54
      modules/mono/glue/string_name_glue.h
  29. 4 2
      modules/mono/managed_callable.cpp
  30. 97 54
      modules/mono/mono_gd/gd_mono.cpp
  31. 13 14
      modules/mono/mono_gd/gd_mono.h
  32. 42 21
      modules/mono/mono_gd/gd_mono_assembly.cpp
  33. 1 1
      modules/mono/mono_gd/gd_mono_cache.cpp
  34. 46 23
      modules/mono/mono_gd/gd_mono_class.cpp
  35. 8 4
      modules/mono/mono_gd/gd_mono_field.cpp
  36. 3 2
      modules/mono/mono_gd/gd_mono_internals.cpp
  37. 6 3
      modules/mono/mono_gd/gd_mono_log.cpp
  38. 184 125
      modules/mono/mono_gd/gd_mono_marshal.cpp
  39. 6 4
      modules/mono/mono_gd/gd_mono_marshal.h
  40. 12 6
      modules/mono/mono_gd/gd_mono_method.cpp
  41. 12 6
      modules/mono/mono_gd/gd_mono_property.cpp
  42. 17 18
      modules/mono/mono_gd/gd_mono_utils.cpp
  43. 0 5
      modules/mono/mono_gd/gd_mono_utils.h
  44. 4 2
      modules/mono/register_types.cpp
  45. 12 6
      modules/mono/signal_awaiter_utils.cpp
  46. 12 34
      modules/mono/utils/path_utils.cpp
  47. 0 2
      modules/mono/utils/path_utils.h
  48. 8 4
      modules/mono/utils/string_utils.cpp

+ 4 - 2
modules/mono/class_db_api_json.cpp

@@ -53,8 +53,9 @@ void class_db_api_to_json(const String &p_output_file, ClassDB::APIType p_api) {
 	for (List<StringName>::Element *E = names.front(); E; E = E->next()) {
 		ClassDB::ClassInfo *t = ClassDB::classes.getptr(E->get());
 		ERR_FAIL_COND(!t);
-		if (t->api != p_api || !t->exposed)
+		if (t->api != p_api || !t->exposed) {
 			continue;
+		}
 
 		Dictionary class_dict;
 		classes_dict[t->name] = class_dict;
@@ -72,8 +73,9 @@ void class_db_api_to_json(const String &p_output_file, ClassDB::APIType p_api) {
 
 				ERR_CONTINUE(name.empty());
 
-				if (name[0] == '_')
+				if (name[0] == '_') {
 					continue; // Ignore non-virtual methods that start with an underscore
+				}
 
 				snames.push_back(*k);
 			}

+ 204 - 109
modules/mono/csharp_script.cpp

@@ -125,8 +125,9 @@ void CSharpLanguage::init() {
 	print_line("Run this binary with '--generate-mono-glue path/to/modules/mono/glue'");
 #endif
 
-	if (gdmono->is_runtime_initialized())
+	if (gdmono->is_runtime_initialized()) {
 		gdmono->initialize_load_assemblies();
+	}
 
 #ifdef TOOLS_ENABLED
 	EditorNode::add_init_callback(&_editor_init_callback);
@@ -134,8 +135,13 @@ void CSharpLanguage::init() {
 }
 
 void CSharpLanguage::finish() {
-	if (finalized)
+	finalize();
+}
+
+void CSharpLanguage::finalize() {
+	if (finalized) {
 		return;
+	}
 
 	finalizing = true;
 
@@ -390,15 +396,17 @@ bool CSharpLanguage::supports_builtin_mode() const {
 
 #ifdef TOOLS_ENABLED
 static String variant_type_to_managed_name(const String &p_var_type_name) {
-	if (p_var_type_name.empty())
+	if (p_var_type_name.empty()) {
 		return "object";
+	}
 
 	if (!ClassDB::class_exists(p_var_type_name)) {
 		return p_var_type_name;
 	}
 
-	if (p_var_type_name == Variant::get_type_name(Variant::OBJECT))
+	if (p_var_type_name == Variant::get_type_name(Variant::OBJECT)) {
 		return "Godot.Object";
+	}
 
 	if (p_var_type_name == Variant::get_type_name(Variant::FLOAT)) {
 #ifdef REAL_T_IS_DOUBLE
@@ -408,36 +416,49 @@ static String variant_type_to_managed_name(const String &p_var_type_name) {
 #endif
 	}
 
-	if (p_var_type_name == Variant::get_type_name(Variant::STRING))
+	if (p_var_type_name == Variant::get_type_name(Variant::STRING)) {
 		return "string"; // I prefer this one >:[
+	}
 
-	if (p_var_type_name == Variant::get_type_name(Variant::DICTIONARY))
+	if (p_var_type_name == Variant::get_type_name(Variant::DICTIONARY)) {
 		return "Collections.Dictionary";
+	}
 
-	if (p_var_type_name == Variant::get_type_name(Variant::ARRAY))
+	if (p_var_type_name == Variant::get_type_name(Variant::ARRAY)) {
 		return "Collections.Array";
+	}
 
-	if (p_var_type_name == Variant::get_type_name(Variant::PACKED_BYTE_ARRAY))
+	if (p_var_type_name == Variant::get_type_name(Variant::PACKED_BYTE_ARRAY)) {
 		return "byte[]";
-	if (p_var_type_name == Variant::get_type_name(Variant::PACKED_INT32_ARRAY))
+	}
+	if (p_var_type_name == Variant::get_type_name(Variant::PACKED_INT32_ARRAY)) {
 		return "int[]";
-	if (p_var_type_name == Variant::get_type_name(Variant::PACKED_INT64_ARRAY))
+	}
+	if (p_var_type_name == Variant::get_type_name(Variant::PACKED_INT64_ARRAY)) {
 		return "long[]";
-	if (p_var_type_name == Variant::get_type_name(Variant::PACKED_FLOAT32_ARRAY))
+	}
+	if (p_var_type_name == Variant::get_type_name(Variant::PACKED_FLOAT32_ARRAY)) {
 		return "float[]";
-	if (p_var_type_name == Variant::get_type_name(Variant::PACKED_FLOAT64_ARRAY))
+	}
+	if (p_var_type_name == Variant::get_type_name(Variant::PACKED_FLOAT64_ARRAY)) {
 		return "double[]";
-	if (p_var_type_name == Variant::get_type_name(Variant::PACKED_STRING_ARRAY))
+	}
+	if (p_var_type_name == Variant::get_type_name(Variant::PACKED_STRING_ARRAY)) {
 		return "string[]";
-	if (p_var_type_name == Variant::get_type_name(Variant::PACKED_VECTOR2_ARRAY))
+	}
+	if (p_var_type_name == Variant::get_type_name(Variant::PACKED_VECTOR2_ARRAY)) {
 		return "Vector2[]";
-	if (p_var_type_name == Variant::get_type_name(Variant::PACKED_VECTOR3_ARRAY))
+	}
+	if (p_var_type_name == Variant::get_type_name(Variant::PACKED_VECTOR3_ARRAY)) {
 		return "Vector3[]";
-	if (p_var_type_name == Variant::get_type_name(Variant::PACKED_COLOR_ARRAY))
+	}
+	if (p_var_type_name == Variant::get_type_name(Variant::PACKED_COLOR_ARRAY)) {
 		return "Color[]";
+	}
 
-	if (p_var_type_name == Variant::get_type_name(Variant::SIGNAL))
+	if (p_var_type_name == Variant::get_type_name(Variant::SIGNAL)) {
 		return "SignalInfo";
+	}
 
 	Variant::Type var_types[] = {
 		Variant::BOOL,
@@ -462,8 +483,9 @@ static String variant_type_to_managed_name(const String &p_var_type_name) {
 	};
 
 	for (unsigned int i = 0; i < sizeof(var_types) / sizeof(Variant::Type); i++) {
-		if (p_var_type_name == Variant::get_type_name(var_types[i]))
+		if (p_var_type_name == Variant::get_type_name(var_types[i])) {
 			return p_var_type_name;
+		}
 	}
 
 	return "object";
@@ -477,8 +499,9 @@ String CSharpLanguage::make_function(const String &, const String &p_name, const
 	for (int i = 0; i < p_args.size(); i++) {
 		const String &arg = p_args[i];
 
-		if (i > 0)
+		if (i > 0) {
 			s += ", ";
+		}
 
 		s += variant_type_to_managed_name(arg.get_slice(":", 1)) + " " + escape_csharp_keyword(arg.get_slice(":", 0));
 	}
@@ -516,32 +539,36 @@ String CSharpLanguage::debug_get_error() const {
 }
 
 int CSharpLanguage::debug_get_stack_level_count() const {
-	if (_debug_parse_err_line >= 0)
+	if (_debug_parse_err_line >= 0) {
 		return 1;
+	}
 
 	// TODO: StackTrace
 	return 1;
 }
 
 int CSharpLanguage::debug_get_stack_level_line(int p_level) const {
-	if (_debug_parse_err_line >= 0)
+	if (_debug_parse_err_line >= 0) {
 		return _debug_parse_err_line;
+	}
 
 	// TODO: StackTrace
 	return 1;
 }
 
 String CSharpLanguage::debug_get_stack_level_function(int p_level) const {
-	if (_debug_parse_err_line >= 0)
+	if (_debug_parse_err_line >= 0) {
 		return String();
+	}
 
 	// TODO: StackTrace
 	return String();
 }
 
 String CSharpLanguage::debug_get_stack_level_source(int p_level) const {
-	if (_debug_parse_err_line >= 0)
+	if (_debug_parse_err_line >= 0) {
 		return _debug_parse_err_file;
+	}
 
 	// TODO: StackTrace
 	return String();
@@ -551,15 +578,17 @@ Vector<ScriptLanguage::StackInfo> CSharpLanguage::debug_get_current_stack_info()
 #ifdef DEBUG_ENABLED
 	// Printing an error here will result in endless recursion, so we must be careful
 	static thread_local bool _recursion_flag_ = false;
-	if (_recursion_flag_)
+	if (_recursion_flag_) {
 		return Vector<StackInfo>();
+	}
 	_recursion_flag_ = true;
 	SCOPE_EXIT { _recursion_flag_ = false; };
 
 	GD_MONO_SCOPE_THREAD_ATTACH;
 
-	if (!gdmono->is_runtime_initialized() || !GDMono::get_singleton()->get_core_api_assembly() || !GDMonoCache::cached_data.corlib_cache_updated)
+	if (!gdmono->is_runtime_initialized() || !GDMono::get_singleton()->get_core_api_assembly() || !GDMonoCache::cached_data.corlib_cache_updated) {
 		return Vector<StackInfo>();
+	}
 
 	MonoObject *stack_trace = mono_object_new(mono_domain_get(), CACHED_CLASS(System_Diagnostics_StackTrace)->get_mono_ptr());
 
@@ -581,8 +610,9 @@ Vector<ScriptLanguage::StackInfo> CSharpLanguage::debug_get_current_stack_info()
 Vector<ScriptLanguage::StackInfo> CSharpLanguage::stack_trace_get_info(MonoObject *p_stack_trace) {
 	// Printing an error here will result in endless recursion, so we must be careful
 	static thread_local bool _recursion_flag_ = false;
-	if (_recursion_flag_)
+	if (_recursion_flag_) {
 		return Vector<StackInfo>();
+	}
 	_recursion_flag_ = true;
 	SCOPE_EXIT { _recursion_flag_ = false; };
 
@@ -599,8 +629,9 @@ Vector<ScriptLanguage::StackInfo> CSharpLanguage::stack_trace_get_info(MonoObjec
 
 	int frame_count = mono_array_length(frames);
 
-	if (frame_count <= 0)
+	if (frame_count <= 0) {
 		return Vector<StackInfo>();
+	}
 
 	Vector<StackInfo> si;
 	si.resize(frame_count);
@@ -646,8 +677,9 @@ void CSharpLanguage::pre_unsafe_unreference(Object *p_obj) {
 	ObjectID id = p_obj->get_instance_id();
 	Map<ObjectID, int>::Element *elem = unsafe_object_references.find(id);
 	ERR_FAIL_NULL(elem);
-	if (--elem->value() == 0)
+	if (--elem->value() == 0) {
 		unsafe_object_references.erase(elem);
+	}
 #endif
 }
 
@@ -673,8 +705,9 @@ void CSharpLanguage::frame() {
 struct CSharpScriptDepSort {
 	// must support sorting so inheritance works properly (parent must be reloaded first)
 	bool operator()(const Ref<CSharpScript> &A, const Ref<CSharpScript> &B) const {
-		if (A == B)
+		if (A == B) {
 			return false; // shouldn't happen but..
+		}
 		GDMonoClass *I = B->base;
 		while (I) {
 			if (I == A->script_class) {
@@ -717,8 +750,9 @@ void CSharpLanguage::reload_tool_script(const Ref<Script> &p_script, bool p_soft
 
 #ifdef GD_MONO_HOT_RELOAD
 bool CSharpLanguage::is_assembly_reloading_needed() {
-	if (!gdmono->is_runtime_initialized())
+	if (!gdmono->is_runtime_initialized()) {
 		return false;
+	}
 
 	GDMonoAssembly *proj_assembly = gdmono->get_project_assembly();
 
@@ -736,23 +770,27 @@ bool CSharpLanguage::is_assembly_reloading_needed() {
 		if (!FileAccess::exists(proj_asm_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(appname_safe);
-			if (!FileAccess::exists(proj_asm_path))
+			if (!FileAccess::exists(proj_asm_path)) {
 				return false; // No assembly to load
+			}
 		}
 
-		if (FileAccess::get_modified_time(proj_asm_path) <= proj_assembly->get_modified_time())
+		if (FileAccess::get_modified_time(proj_asm_path) <= proj_assembly->get_modified_time()) {
 			return false; // Already up to date
+		}
 	} else {
-		if (!FileAccess::exists(GodotSharpDirs::get_res_temp_assemblies_dir().plus_file(appname_safe)))
+		if (!FileAccess::exists(GodotSharpDirs::get_res_temp_assemblies_dir().plus_file(appname_safe))) {
 			return false; // No assembly to load
+		}
 	}
 
 	return true;
 }
 
 void CSharpLanguage::reload_assemblies(bool p_soft_reload) {
-	if (!gdmono->is_runtime_initialized())
+	if (!gdmono->is_runtime_initialized()) {
 		return;
+	}
 
 	// There is no soft reloading with Mono. It's always hard reloading.
 
@@ -858,8 +896,9 @@ void CSharpLanguage::reload_assemblies(bool p_soft_reload) {
 			CSharpInstance *csi = static_cast<CSharpInstance *>(obj->get_script_instance());
 
 			// Call OnBeforeSerialize
-			if (csi->script->script_class->implements_interface(CACHED_CLASS(ISerializationListener)))
+			if (csi->script->script_class->implements_interface(CACHED_CLASS(ISerializationListener))) {
 				obj->get_script_instance()->call_multilevel(string_names.on_before_serialize);
+			}
 
 			// Save instance info
 			CSharpScript::StateBackup state;
@@ -894,8 +933,9 @@ void CSharpLanguage::reload_assemblies(bool p_soft_reload) {
 			for (const Map<ObjectID, CSharpScript::StateBackup>::Element *F = scr->pending_reload_state.front(); F; F = F->next()) {
 				Object *obj = ObjectDB::get_instance(F->key());
 
-				if (!obj)
+				if (!obj) {
 					continue;
+				}
 
 				ObjectID obj_id = obj->get_instance_id();
 
@@ -1092,8 +1132,9 @@ void CSharpLanguage::reload_assemblies(bool p_soft_reload) {
 				}
 
 				// Call OnAfterDeserialization
-				if (csi->script->script_class->implements_interface(CACHED_CLASS(ISerializationListener)))
+				if (csi->script->script_class->implements_interface(CACHED_CLASS(ISerializationListener))) {
 					obj->get_script_instance()->call_multilevel(string_names.on_after_deserialize);
+				}
 			}
 		}
 
@@ -1246,6 +1287,7 @@ void CSharpLanguage::_on_scripts_domain_unloaded() {
 		script_binding.inited = false;
 	}
 
+#ifdef GD_MONO_HOT_RELOAD
 	{
 		MutexLock lock(ManagedCallable::instances_mutex);
 
@@ -1255,6 +1297,7 @@ void CSharpLanguage::_on_scripts_domain_unloaded() {
 			managed_callable->delegate_invoke = nullptr;
 		}
 	}
+#endif
 
 	scripts_metadata_invalidated = true;
 }
@@ -1275,7 +1318,8 @@ void CSharpLanguage::_editor_init_callback() {
 	GDMonoUtils::runtime_object_init(mono_object, editor_klass, &exc);
 	UNHANDLED_EXCEPTION(exc);
 
-	EditorPlugin *godotsharp_editor = Object::cast_to<EditorPlugin>(GDMonoMarshal::mono_object_to_variant(mono_object));
+	EditorPlugin *godotsharp_editor = Object::cast_to<EditorPlugin>(
+			GDMonoMarshal::mono_object_to_variant(mono_object).operator Object *());
 	CRASH_COND(godotsharp_editor == nullptr);
 
 	// Enable it as a plugin
@@ -1324,7 +1368,7 @@ CSharpLanguage::CSharpLanguage() {
 }
 
 CSharpLanguage::~CSharpLanguage() {
-	finish();
+	finalize();
 	singleton = nullptr;
 }
 
@@ -1341,8 +1385,9 @@ bool CSharpLanguage::setup_csharp_script_binding(CSharpScriptBinding &r_script_b
 
 	// ¯\_(ツ)_/¯
 	const ClassDB::ClassInfo *classinfo = ClassDB::classes.getptr(type_name);
-	while (classinfo && !classinfo->exposed)
+	while (classinfo && !classinfo->exposed) {
 		classinfo = classinfo->inherits_ptr;
+	}
 	ERR_FAIL_NULL_V(classinfo, false);
 	type_name = classinfo->name;
 
@@ -1380,13 +1425,15 @@ void *CSharpLanguage::alloc_instance_binding_data(Object *p_object) {
 	MutexLock lock(language_bind_mutex);
 
 	Map<Object *, CSharpScriptBinding>::Element *match = script_bindings.find(p_object);
-	if (match)
+	if (match) {
 		return (void *)match;
+	}
 
 	CSharpScriptBinding script_binding;
 
-	if (!setup_csharp_script_binding(script_binding, p_object))
+	if (!setup_csharp_script_binding(script_binding, p_object)) {
 		return nullptr;
+	}
 
 	return (void *)insert_script_binding(p_object, script_binding);
 }
@@ -1404,8 +1451,9 @@ void CSharpLanguage::free_instance_binding_data(void *p_data) {
 		return;
 	}
 
-	if (finalizing)
+	if (finalizing) {
 		return; // inside CSharpLanguage::finish(), all the gchandle bindings are released there
+	}
 
 	GD_MONO_ASSERT_THREAD_ATTACHED;
 
@@ -1444,8 +1492,9 @@ void CSharpLanguage::refcount_incremented_instance_binding(Object *p_object) {
 	CSharpScriptBinding &script_binding = ((Map<Object *, CSharpScriptBinding>::Element *)data)->get();
 	MonoGCHandleData &gchandle = script_binding.gchandle;
 
-	if (!script_binding.inited)
+	if (!script_binding.inited) {
 		return;
+	}
 
 	if (ref_owner->reference_get_count() > 1 && gchandle.is_weak()) { // The managed side also holds a reference, hence 1 instead of 0
 		GD_MONO_SCOPE_THREAD_ATTACH;
@@ -1455,8 +1504,9 @@ void CSharpLanguage::refcount_incremented_instance_binding(Object *p_object) {
 		// so the owner must hold the managed side alive again to avoid it from being GCed.
 
 		MonoObject *target = gchandle.get_target();
-		if (!target)
+		if (!target) {
 			return; // Called after the managed side was collected, so nothing to do here
+		}
 
 		// Release the current weak handle and replace it with a strong handle.
 		MonoGCHandleData strong_gchandle = MonoGCHandleData::new_strong_handle(target);
@@ -1481,8 +1531,9 @@ bool CSharpLanguage::refcount_decremented_instance_binding(Object *p_object) {
 
 	int refcount = ref_owner->reference_get_count();
 
-	if (!script_binding.inited)
+	if (!script_binding.inited) {
 		return refcount == 0;
+	}
 
 	if (refcount == 1 && !gchandle.is_released() && !gchandle.is_weak()) { // The managed side also holds a reference, hence 1 instead of 0
 		GD_MONO_SCOPE_THREAD_ATTACH;
@@ -1491,8 +1542,9 @@ bool CSharpLanguage::refcount_decremented_instance_binding(Object *p_object) {
 		// the managed instance takes responsibility of deleting the owner when GCed.
 
 		MonoObject *target = gchandle.get_target();
-		if (!target)
+		if (!target) {
 			return refcount == 0; // Called after the managed side was collected, so nothing to do here
+		}
 
 		// Release the current strong handle and replace it with a weak handle.
 		MonoGCHandleData weak_gchandle = MonoGCHandleData::new_weak_handle(target);
@@ -1514,8 +1566,9 @@ CSharpInstance *CSharpInstance::create_for_managed_type(Object *p_owner, CSharpS
 	instance->owner = p_owner;
 	instance->gchandle = p_gchandle;
 
-	if (instance->base_ref)
+	if (instance->base_ref) {
 		instance->_reference_owner_unsafe();
+	}
 
 	p_script->instances.insert(p_owner);
 
@@ -1572,8 +1625,9 @@ bool CSharpInstance::set(const StringName &p_name, const Variant &p_value) {
 
 			MonoObject *ret = method->invoke(mono_object, args);
 
-			if (ret && GDMonoMarshal::unbox<MonoBoolean>(ret))
+			if (ret && GDMonoMarshal::unbox<MonoBoolean>(ret)) {
 				return true;
+			}
 
 			break;
 		}
@@ -1658,8 +1712,9 @@ void CSharpInstance::get_properties_state_for_reloading(List<Pair<StringName, Va
 		ManagedType managedType;
 
 		GDMonoField *field = script->script_class->get_field(state_pair.first);
-		if (!field)
+		if (!field) {
 			continue; // Properties ignored. We get the property baking fields instead.
+		}
 
 		managedType = field->get_type();
 
@@ -1679,8 +1734,9 @@ void CSharpInstance::get_event_signals_state_for_reloading(List<Pair<StringName,
 		const CSharpScript::EventSignal &event_signal = E->value();
 
 		MonoDelegate *delegate_field_value = (MonoDelegate *)event_signal.field->get_value(owner_managed);
-		if (!delegate_field_value)
+		if (!delegate_field_value) {
 			continue; // Empty
+		}
 
 		Array serialized_data;
 		MonoObject *managed_serialized_data = GDMonoMarshal::variant_to_mono_object(serialized_data);
@@ -1725,8 +1781,9 @@ void CSharpInstance::get_property_list(List<PropertyInfo> *p_properties) const {
 
 			if (ret) {
 				Array array = Array(GDMonoMarshal::mono_object_to_variant(ret));
-				for (int i = 0, size = array.size(); i < size; i++)
+				for (int i = 0, size = array.size(); i < size; i++) {
 					p_properties->push_back(PropertyInfo::from_dict(array.get(i)));
+				}
 				return;
 			}
 
@@ -1739,20 +1796,23 @@ void CSharpInstance::get_property_list(List<PropertyInfo> *p_properties) const {
 
 Variant::Type CSharpInstance::get_property_type(const StringName &p_name, bool *r_is_valid) const {
 	if (script->member_info.has(p_name)) {
-		if (r_is_valid)
+		if (r_is_valid) {
 			*r_is_valid = true;
+		}
 		return script->member_info[p_name].type;
 	}
 
-	if (r_is_valid)
+	if (r_is_valid) {
 		*r_is_valid = false;
+	}
 
 	return Variant::NIL;
 }
 
 bool CSharpInstance::has_method(const StringName &p_method) const {
-	if (!script.is_valid())
+	if (!script.is_valid()) {
 		return false;
+	}
 
 	GD_MONO_SCOPE_THREAD_ATTACH;
 
@@ -1868,8 +1928,9 @@ bool CSharpInstance::_unreference_owner_unsafe() {
 	CRASH_COND(owner == nullptr);
 #endif
 
-	if (!unsafe_referenced)
+	if (!unsafe_referenced) {
 		return false; // Already unreferenced
+	}
 
 	unsafe_referenced = false;
 
@@ -1912,8 +1973,9 @@ MonoObject *CSharpInstance::_internal_new_managed() {
 	// Tie managed to unmanaged
 	gchandle = MonoGCHandleData::new_strong_handle(mono_object);
 
-	if (base_ref)
+	if (base_ref) {
 		_reference_owner_unsafe(); // Here, after assigning the gchandle (for the refcount_incremented callback)
+	}
 
 	CACHED_FIELD(GodotObject, ptr)->set_value_raw(mono_object, owner);
 
@@ -2130,7 +2192,7 @@ void CSharpInstance::_call_notification(int p_notification) {
 
 	// Custom version of _call_multilevel, optimized for _notification
 
-	uint32_t arg = p_notification;
+	int32_t arg = p_notification;
 	void *args[1] = { &arg };
 	StringName method_name = CACHED_STRING_NAME(_notification);
 
@@ -2154,8 +2216,9 @@ String CSharpInstance::to_string(bool *r_valid) {
 	MonoObject *mono_object = get_mono_object();
 
 	if (mono_object == nullptr) {
-		if (r_valid)
+		if (r_valid) {
 			*r_valid = false;
+		}
 		return String();
 	}
 
@@ -2164,14 +2227,16 @@ String CSharpInstance::to_string(bool *r_valid) {
 
 	if (exc) {
 		GDMonoUtils::set_pending_exception(exc);
-		if (r_valid)
+		if (r_valid) {
 			*r_valid = false;
+		}
 		return String();
 	}
 
 	if (result == nullptr) {
-		if (r_valid)
+		if (r_valid) {
 			*r_valid = false;
+		}
 		return String();
 	}
 
@@ -2342,11 +2407,13 @@ void CSharpScript::_update_member_info_no_exports() {
 bool CSharpScript::_update_exports() {
 #ifdef TOOLS_ENABLED
 	bool is_editor = Engine::get_singleton()->is_editor_hint();
-	if (is_editor)
+	if (is_editor) {
 		placeholder_fallback_enabled = true; // until proven otherwise
+	}
 #endif
-	if (!valid)
+	if (!valid) {
 		return false;
+	}
 
 	bool changed = false;
 
@@ -2543,8 +2610,9 @@ void CSharpScript::load_script_signals(GDMonoClass *p_class, GDMonoClass *p_nati
 		for (int i = delegates.size() - 1; i >= 0; --i) {
 			GDMonoClass *delegate = delegates[i];
 
-			if (!delegate->has_attribute(CACHED_CLASS(SignalAttribute)))
+			if (!delegate->has_attribute(CACHED_CLASS(SignalAttribute))) {
 				continue;
+			}
 
 			// Arguments are accessibles as arguments of .Invoke method
 			GDMonoMethod *invoke_method = delegate->get_method(mono_get_delegate_invoke(delegate->get_mono_ptr()));
@@ -2577,11 +2645,13 @@ void CSharpScript::load_script_signals(GDMonoClass *p_class, GDMonoClass *p_nati
 
 			GDMonoClass *field_class = field->get_type().type_class;
 
-			if (!mono_class_is_delegate(field_class->get_mono_ptr()))
+			if (!mono_class_is_delegate(field_class->get_mono_ptr())) {
 				continue;
+			}
 
-			if (!found_event_signals.find(field->get_name()))
+			if (!found_event_signals.find(field->get_name())) {
 				continue;
+			}
 
 			GDMonoMethod *invoke_method = field_class->get_method(mono_get_delegate_invoke(field_class->get_mono_ptr()));
 
@@ -2640,14 +2710,16 @@ bool CSharpScript::_get_member_export(IMonoClassMember *p_member, bool p_inspect
 
 	if (p_member->is_static()) {
 #ifdef TOOLS_ENABLED
-		if (p_member->has_attribute(CACHED_CLASS(ExportAttribute)))
+		if (p_member->has_attribute(CACHED_CLASS(ExportAttribute))) {
 			ERR_PRINT("Cannot export member because it is static: '" + MEMBER_FULL_QUALIFIED_NAME(p_member) + "'.");
+		}
 #endif
 		return false;
 	}
 
-	if (member_info.has(p_member->get_name()))
+	if (member_info.has(p_member->get_name())) {
 		return false;
+	}
 
 	ManagedType type;
 
@@ -2665,15 +2737,17 @@ bool CSharpScript::_get_member_export(IMonoClassMember *p_member, bool p_inspect
 		GDMonoProperty *property = static_cast<GDMonoProperty *>(p_member);
 		if (!property->has_getter()) {
 #ifdef TOOLS_ENABLED
-			if (exported)
+			if (exported) {
 				ERR_PRINT("Read-only property cannot be exported: '" + MEMBER_FULL_QUALIFIED_NAME(p_member) + "'.");
+			}
 #endif
 			return false;
 		}
 		if (!property->has_setter()) {
 #ifdef TOOLS_ENABLED
-			if (exported)
+			if (exported) {
 				ERR_PRINT("Write-only property (without getter) cannot be exported: '" + MEMBER_FULL_QUALIFIED_NAME(p_member) + "'.");
+			}
 #endif
 			return false;
 		}
@@ -2802,8 +2876,9 @@ int CSharpScript::_try_get_member_export_hint(IMonoClassMember *p_member, Manage
 
 		ManagedType elem_type;
 
-		if (!GDMonoMarshal::try_get_array_element_type(p_type, elem_type))
+		if (!GDMonoMarshal::try_get_array_element_type(p_type, elem_type)) {
 			return 0;
+		}
 
 		Variant::Type elem_variant_type = GDMonoMarshal::managed_to_variant_type(elem_type);
 
@@ -2830,15 +2905,6 @@ int CSharpScript::_try_get_member_export_hint(IMonoClassMember *p_member, Manage
 }
 #endif
 
-void CSharpScript::_clear() {
-	tool = false;
-	valid = false;
-
-	base = nullptr;
-	native = nullptr;
-	script_class = nullptr;
-}
-
 Variant CSharpScript::call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
 	if (unlikely(GDMono::get_singleton() == nullptr)) {
 		// Probably not the best error but eh.
@@ -2871,11 +2937,7 @@ Variant CSharpScript::call(const StringName &p_method, const Variant **p_args, i
 }
 
 void CSharpScript::_resource_path_changed() {
-	String path = get_path();
-
-	if (!path.empty()) {
-		name = get_path().get_file().get_basename();
-	}
+	_update_name();
 }
 
 bool CSharpScript::_get(const StringName &p_name, Variant &r_ret) const {
@@ -2931,8 +2993,9 @@ void CSharpScript::initialize_for_managed_type(Ref<CSharpScript> p_script, GDMon
 
 	GDMonoClass *base = p_script->script_class->get_parent_class();
 
-	if (base != p_script->native)
+	if (base != p_script->native) {
 		p_script->base = base;
+	}
 
 	p_script->valid = true;
 	p_script->tool = p_script->script_class->has_attribute(CACHED_CLASS(ToolAttribute));
@@ -2958,8 +3021,9 @@ void CSharpScript::initialize_for_managed_type(Ref<CSharpScript> p_script, GDMon
 		while (native_top) {
 			native_top->fetch_methods_with_godot_api_checks(p_script->native);
 
-			if (native_top == CACHED_CLASS(GodotObject))
+			if (native_top == CACHED_CLASS(GodotObject)) {
 				break;
+			}
 
 			native_top = native_top->get_parent_class();
 		}
@@ -3005,10 +3069,11 @@ bool CSharpScript::can_instance() const {
 }
 
 StringName CSharpScript::get_instance_base_type() const {
-	if (native)
+	if (native) {
 		return native->get_name();
-	else
+	} else {
 		return StringName();
+	}
 }
 
 CSharpInstance *CSharpScript::_create_instance(const Variant **p_args, int p_argcount, Object *p_owner, bool p_isref, Callable::CallError &r_error) {
@@ -3081,8 +3146,9 @@ CSharpInstance *CSharpScript::_create_instance(const Variant **p_args, int p_arg
 	// Tie managed to unmanaged
 	instance->gchandle = MonoGCHandleData::new_strong_handle(mono_object);
 
-	if (instance->base_ref)
+	if (instance->base_ref) {
 		instance->_reference_owner_unsafe(); // Here, after assigning the gchandle (for the refcount_incremented callback)
+	}
 
 	{
 		MutexLock lock(CSharpLanguage::get_singleton()->script_instances_mutex);
@@ -3184,8 +3250,9 @@ String CSharpScript::get_source_code() const {
 }
 
 void CSharpScript::set_source_code(const String &p_code) {
-	if (source == p_code)
+	if (source == p_code) {
 		return;
+	}
 	source = p_code;
 #ifdef TOOLS_ENABLED
 	source_changed_cache = true;
@@ -3193,8 +3260,9 @@ void CSharpScript::set_source_code(const String &p_code) {
 }
 
 void CSharpScript::get_script_method_list(List<MethodInfo> *p_list) const {
-	if (!script_class)
+	if (!script_class) {
 		return;
+	}
 
 	GD_MONO_SCOPE_THREAD_ATTACH;
 
@@ -3206,8 +3274,9 @@ void CSharpScript::get_script_method_list(List<MethodInfo> *p_list) const {
 }
 
 bool CSharpScript::has_method(const StringName &p_method) const {
-	if (!script_class)
+	if (!script_class) {
 		return false;
+	}
 
 	GD_MONO_SCOPE_THREAD_ATTACH;
 
@@ -3215,8 +3284,9 @@ bool CSharpScript::has_method(const StringName &p_method) const {
 }
 
 MethodInfo CSharpScript::get_method_info(const StringName &p_method) const {
-	if (!script_class)
+	if (!script_class) {
 		return MethodInfo();
+	}
 
 	GD_MONO_SCOPE_THREAD_ATTACH;
 
@@ -3290,8 +3360,9 @@ Error CSharpScript::reload(bool p_keep_state) {
 
 			GDMonoClass *base_class = script_class->get_parent_class();
 
-			if (base_class != native)
+			if (base_class != native) {
 				base = base_class;
+			}
 
 #ifdef DEBUG_ENABLED
 			// For debug builds, we must fetch from all native base methods as well.
@@ -3303,8 +3374,9 @@ Error CSharpScript::reload(bool p_keep_state) {
 				while (native_top) {
 					native_top->fetch_methods_with_godot_api_checks(native);
 
-					if (native_top == CACHED_CLASS(GodotObject))
+					if (native_top == CACHED_CLASS(GodotObject)) {
 						break;
+					}
 
 					native_top = native_top->get_parent_class();
 				}
@@ -3434,8 +3506,9 @@ void CSharpScript::get_script_signal_list(List<MethodInfo> *r_signals) const {
 			const SignalParameter &param = params[i];
 
 			PropertyInfo arg_info = PropertyInfo(param.type, param.name);
-			if (param.type == Variant::NIL && param.nil_is_variant)
+			if (param.type == Variant::NIL && param.nil_is_variant) {
 				arg_info.usage |= PROPERTY_USAGE_NIL_IS_VARIANT;
+			}
 
 			mi.arguments.push_back(arg_info);
 		}
@@ -3453,8 +3526,9 @@ void CSharpScript::get_script_signal_list(List<MethodInfo> *r_signals) const {
 			const SignalParameter &param = params[i];
 
 			PropertyInfo arg_info = PropertyInfo(param.type, param.name);
-			if (param.type == Variant::NIL && param.nil_is_variant)
+			if (param.type == Variant::NIL && param.nil_is_variant) {
 				arg_info.usage |= PROPERTY_USAGE_NIL_IS_VARIANT;
+			}
 
 			mi.arguments.push_back(arg_info);
 		}
@@ -3497,18 +3571,24 @@ int CSharpScript::get_member_line(const StringName &p_member) const {
 }
 
 MultiplayerAPI::RPCMode CSharpScript::_member_get_rpc_mode(IMonoClassMember *p_member) const {
-	if (p_member->has_attribute(CACHED_CLASS(RemoteAttribute)))
+	if (p_member->has_attribute(CACHED_CLASS(RemoteAttribute))) {
 		return MultiplayerAPI::RPC_MODE_REMOTE;
-	if (p_member->has_attribute(CACHED_CLASS(MasterAttribute)))
+	}
+	if (p_member->has_attribute(CACHED_CLASS(MasterAttribute))) {
 		return MultiplayerAPI::RPC_MODE_MASTER;
-	if (p_member->has_attribute(CACHED_CLASS(PuppetAttribute)))
+	}
+	if (p_member->has_attribute(CACHED_CLASS(PuppetAttribute))) {
 		return MultiplayerAPI::RPC_MODE_PUPPET;
-	if (p_member->has_attribute(CACHED_CLASS(RemoteSyncAttribute)))
+	}
+	if (p_member->has_attribute(CACHED_CLASS(RemoteSyncAttribute))) {
 		return MultiplayerAPI::RPC_MODE_REMOTESYNC;
-	if (p_member->has_attribute(CACHED_CLASS(MasterSyncAttribute)))
+	}
+	if (p_member->has_attribute(CACHED_CLASS(MasterSyncAttribute))) {
 		return MultiplayerAPI::RPC_MODE_MASTERSYNC;
-	if (p_member->has_attribute(CACHED_CLASS(PuppetSyncAttribute)))
+	}
+	if (p_member->has_attribute(CACHED_CLASS(PuppetSyncAttribute))) {
 		return MultiplayerAPI::RPC_MODE_PUPPETSYNC;
+	}
 
 	return MultiplayerAPI::RPC_MODE_DISABLED;
 }
@@ -3583,14 +3663,27 @@ Error CSharpScript::load_source_code(const String &p_path) {
 	return OK;
 }
 
-StringName CSharpScript::get_script_name() const {
-	return name;
+void CSharpScript::_update_name() {
+	String path = get_path();
+
+	if (!path.empty()) {
+		name = get_path().get_file().get_basename();
+	}
+}
+
+void CSharpScript::_clear() {
+	tool = false;
+	valid = false;
+
+	base = nullptr;
+	native = nullptr;
+	script_class = nullptr;
 }
 
 CSharpScript::CSharpScript() {
 	_clear();
 
-	_resource_path_changed();
+	_update_name();
 
 #ifdef DEBUG_ENABLED
 	{
@@ -3620,8 +3713,9 @@ void CSharpScript::get_members(Set<StringName> *p_members) {
 /*************** RESOURCE ***************/
 
 RES ResourceFormatLoaderCSharpScript::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) {
-	if (r_error)
+	if (r_error) {
 		*r_error = ERR_FILE_CANT_OPEN;
+	}
 
 	// TODO ignore anything inside bin/ and obj/ in tools builds?
 
@@ -3638,8 +3732,9 @@ RES ResourceFormatLoaderCSharpScript::load(const String &p_path, const String &p
 
 	script->reload();
 
-	if (r_error)
+	if (r_error) {
 		*r_error = OK;
+	}
 
 	return scriptres;
 }

+ 129 - 124
modules/mono/csharp_script.h

@@ -135,7 +135,7 @@ private:
 	bool exports_invalidated = true;
 	void _update_exports_values(Map<StringName, Variant> &values, List<PropertyInfo> &propnames);
 	void _update_member_info_no_exports();
-	virtual void _placeholder_erased(PlaceHolderScriptInstance *p_placeholder);
+	void _placeholder_erased(PlaceHolderScriptInstance *p_placeholder) override;
 #endif
 
 #if defined(TOOLS_ENABLED) || defined(DEBUG_ENABLED)
@@ -146,6 +146,8 @@ private:
 
 	void _clear();
 
+	void _update_name();
+
 	void load_script_signals(GDMonoClass *p_class, GDMonoClass *p_native_class);
 	bool _get_signal(GDMonoClass *p_class, GDMonoMethod *p_delegate_invoke, Vector<SignalParameter> &params);
 
@@ -169,68 +171,66 @@ private:
 protected:
 	static void _bind_methods();
 
-	Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error);
-	virtual void _resource_path_changed();
+	Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) override;
+	void _resource_path_changed() override;
 	bool _get(const StringName &p_name, Variant &r_ret) const;
 	bool _set(const StringName &p_name, const Variant &p_value);
 	void _get_property_list(List<PropertyInfo> *p_properties) const;
 
 public:
-	virtual bool can_instance() const;
-	virtual StringName get_instance_base_type() const;
-	virtual ScriptInstance *instance_create(Object *p_this);
-	virtual PlaceHolderScriptInstance *placeholder_instance_create(Object *p_this);
-	virtual bool instance_has(const Object *p_this) const;
+	bool can_instance() const override;
+	StringName get_instance_base_type() const override;
+	ScriptInstance *instance_create(Object *p_this) override;
+	PlaceHolderScriptInstance *placeholder_instance_create(Object *p_this) override;
+	bool instance_has(const Object *p_this) const override;
 
-	virtual bool has_source_code() const;
-	virtual String get_source_code() const;
-	virtual void set_source_code(const String &p_code);
+	bool has_source_code() const override;
+	String get_source_code() const override;
+	void set_source_code(const String &p_code) override;
 
-	virtual Error reload(bool p_keep_state = false);
+	Error reload(bool p_keep_state = false) override;
 
-	virtual bool has_script_signal(const StringName &p_signal) const;
-	virtual void get_script_signal_list(List<MethodInfo> *r_signals) const;
+	bool has_script_signal(const StringName &p_signal) const override;
+	void get_script_signal_list(List<MethodInfo> *r_signals) const override;
 
-	virtual bool get_property_default_value(const StringName &p_property, Variant &r_value) const;
-	virtual void get_script_property_list(List<PropertyInfo> *p_list) const;
-	virtual void update_exports();
+	bool get_property_default_value(const StringName &p_property, Variant &r_value) const override;
+	void get_script_property_list(List<PropertyInfo> *p_list) const override;
+	void update_exports() override;
 
 	void get_members(Set<StringName> *p_members) override;
 
-	virtual bool is_tool() const { return tool; }
-	virtual bool is_valid() const { return valid; }
+	bool is_tool() const override { return tool; }
+	bool is_valid() const override { return valid; }
 
-	bool inherits_script(const Ref<Script> &p_script) const;
+	bool inherits_script(const Ref<Script> &p_script) const override;
 
-	virtual Ref<Script> get_base_script() const;
-	virtual ScriptLanguage *get_language() const;
+	Ref<Script> get_base_script() const override;
+	ScriptLanguage *get_language() const override;
 
-	virtual void get_script_method_list(List<MethodInfo> *p_list) const;
-	bool has_method(const StringName &p_method) const;
-	MethodInfo get_method_info(const StringName &p_method) const;
+	void get_script_method_list(List<MethodInfo> *p_list) const override;
+	bool has_method(const StringName &p_method) const override;
+	MethodInfo get_method_info(const StringName &p_method) const override;
 
-	virtual int get_member_line(const StringName &p_member) const;
+	int get_member_line(const StringName &p_member) const override;
 
-	virtual Vector<ScriptNetData> get_rpc_methods() const;
-	virtual uint16_t get_rpc_method_id(const StringName &p_method) const;
-	virtual StringName get_rpc_method(const uint16_t p_rpc_method_id) const;
-	virtual MultiplayerAPI::RPCMode get_rpc_mode_by_id(const uint16_t p_rpc_method_id) const;
-	virtual MultiplayerAPI::RPCMode get_rpc_mode(const StringName &p_method) const;
+	Vector<ScriptNetData> get_rpc_methods() const override;
+	uint16_t get_rpc_method_id(const StringName &p_method) const override;
+	StringName get_rpc_method(const uint16_t p_rpc_method_id) const override;
+	MultiplayerAPI::RPCMode get_rpc_mode_by_id(const uint16_t p_rpc_method_id) const override;
+	MultiplayerAPI::RPCMode get_rpc_mode(const StringName &p_method) const override;
 
-	virtual Vector<ScriptNetData> get_rset_properties() const;
-	virtual uint16_t get_rset_property_id(const StringName &p_variable) const;
-	virtual StringName get_rset_property(const uint16_t p_variable_id) const;
-	virtual MultiplayerAPI::RPCMode get_rset_mode_by_id(const uint16_t p_variable_id) const;
-	virtual MultiplayerAPI::RPCMode get_rset_mode(const StringName &p_variable) const;
+	Vector<ScriptNetData> get_rset_properties() const override;
+	uint16_t get_rset_property_id(const StringName &p_variable) const override;
+	StringName get_rset_property(const uint16_t p_variable_id) const override;
+	MultiplayerAPI::RPCMode get_rset_mode_by_id(const uint16_t p_variable_id) const override;
+	MultiplayerAPI::RPCMode get_rset_mode(const StringName &p_variable) const override;
 
 #ifdef TOOLS_ENABLED
-	virtual bool is_placeholder_fallback_enabled() const { return placeholder_fallback_enabled; }
+	bool is_placeholder_fallback_enabled() const override { return placeholder_fallback_enabled; }
 #endif
 
 	Error load_source_code(const String &p_path);
 
-	StringName get_script_name() const;
-
 	CSharpScript();
 	~CSharpScript();
 };
@@ -249,8 +249,6 @@ class CSharpInstance : public ScriptInstance {
 	Ref<CSharpScript> script;
 	MonoGCHandleData gchandle;
 
-	Vector<Callable> event_signal_callables;
-
 	bool _reference_owner_unsafe();
 
 	/*
@@ -277,18 +275,18 @@ public:
 
 	_FORCE_INLINE_ bool is_destructing_script_instance() { return destructing_script_instance; }
 
-	virtual Object *get_owner();
+	Object *get_owner() override;
 
-	virtual bool set(const StringName &p_name, const Variant &p_value);
-	virtual bool get(const StringName &p_name, Variant &r_ret) const;
-	virtual void get_property_list(List<PropertyInfo> *p_properties) const;
-	virtual Variant::Type get_property_type(const StringName &p_name, bool *r_is_valid) const;
+	bool set(const StringName &p_name, const Variant &p_value) override;
+	bool get(const StringName &p_name, Variant &r_ret) const override;
+	void get_property_list(List<PropertyInfo> *p_properties) const override;
+	Variant::Type get_property_type(const StringName &p_name, bool *r_is_valid) const override;
 
-	/* TODO */ virtual void get_method_list(List<MethodInfo> *p_list) const {}
-	virtual bool has_method(const StringName &p_method) const;
-	virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error);
-	virtual void call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount);
-	virtual void call_multilevel_reversed(const StringName &p_method, const Variant **p_args, int p_argcount);
+	/* TODO */ void get_method_list(List<MethodInfo> *p_list) const override {}
+	bool has_method(const StringName &p_method) const override;
+	Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) override;
+	void call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount) override;
+	void call_multilevel_reversed(const StringName &p_method, const Variant **p_args, int p_argcount) override;
 
 	void mono_object_disposed(MonoObject *p_obj);
 
@@ -301,29 +299,29 @@ public:
 	void connect_event_signals();
 	void disconnect_event_signals();
 
-	virtual void refcount_incremented();
-	virtual bool refcount_decremented();
+	void refcount_incremented() override;
+	bool refcount_decremented() override;
 
-	virtual Vector<ScriptNetData> get_rpc_methods() const;
-	virtual uint16_t get_rpc_method_id(const StringName &p_method) const;
-	virtual StringName get_rpc_method(const uint16_t p_rpc_method_id) const;
-	virtual MultiplayerAPI::RPCMode get_rpc_mode_by_id(const uint16_t p_rpc_method_id) const;
-	virtual MultiplayerAPI::RPCMode get_rpc_mode(const StringName &p_method) const;
+	Vector<ScriptNetData> get_rpc_methods() const override;
+	uint16_t get_rpc_method_id(const StringName &p_method) const override;
+	StringName get_rpc_method(const uint16_t p_rpc_method_id) const override;
+	MultiplayerAPI::RPCMode get_rpc_mode_by_id(const uint16_t p_rpc_method_id) const override;
+	MultiplayerAPI::RPCMode get_rpc_mode(const StringName &p_method) const override;
 
-	virtual Vector<ScriptNetData> get_rset_properties() const;
-	virtual uint16_t get_rset_property_id(const StringName &p_variable) const;
-	virtual StringName get_rset_property(const uint16_t p_variable_id) const;
-	virtual MultiplayerAPI::RPCMode get_rset_mode_by_id(const uint16_t p_variable_id) const;
-	virtual MultiplayerAPI::RPCMode get_rset_mode(const StringName &p_variable) const;
+	Vector<ScriptNetData> get_rset_properties() const override;
+	uint16_t get_rset_property_id(const StringName &p_variable) const override;
+	StringName get_rset_property(const uint16_t p_variable_id) const override;
+	MultiplayerAPI::RPCMode get_rset_mode_by_id(const uint16_t p_variable_id) const override;
+	MultiplayerAPI::RPCMode get_rset_mode(const StringName &p_variable) const override;
 
-	virtual void notification(int p_notification);
+	void notification(int p_notification) override;
 	void _call_notification(int p_notification);
 
-	virtual String to_string(bool *r_valid);
+	String to_string(bool *r_valid) override;
 
-	virtual Ref<Script> get_script() const;
+	Ref<Script> get_script() const override;
 
-	virtual ScriptLanguage *get_language();
+	ScriptLanguage *get_language() override;
 
 	CSharpInstance(const Ref<CSharpScript> &p_script);
 	~CSharpInstance();
@@ -437,83 +435,90 @@ public:
 	}
 
 	_FORCE_INLINE_ const Dictionary &get_scripts_metadata() {
-		if (scripts_metadata_invalidated)
+		if (scripts_metadata_invalidated) {
 			_load_scripts_metadata();
+		}
 		return scripts_metadata;
 	}
 
 	_FORCE_INLINE_ ManagedCallableMiddleman *get_managed_callable_middleman() const { return managed_callable_middleman; }
 
-	virtual String get_name() const;
+	String get_name() const override;
 
 	/* LANGUAGE FUNCTIONS */
-	virtual String get_type() const;
-	virtual String get_extension() const;
-	virtual Error execute_file(const String &p_path);
-	virtual void init();
-	virtual void finish();
+	String get_type() const override;
+	String get_extension() const override;
+	Error execute_file(const String &p_path) override;
+	void init() override;
+	void finish() override;
+
+	void finalize();
 
 	/* EDITOR FUNCTIONS */
-	virtual void get_reserved_words(List<String> *p_words) const;
-	virtual void get_comment_delimiters(List<String> *p_delimiters) const;
-	virtual void get_string_delimiters(List<String> *p_delimiters) const;
-	virtual Ref<Script> get_template(const String &p_class_name, const String &p_base_class_name) const;
-	virtual bool is_using_templates();
-	virtual void make_template(const String &p_class_name, const String &p_base_class_name, Ref<Script> &p_script);
-	/* TODO */ virtual bool validate(const String &p_script, int &r_line_error, int &r_col_error, String &r_test_error, const String &p_path, List<String> *r_functions, List<ScriptLanguage::Warning> *r_warnings = nullptr, Set<int> *r_safe_lines = nullptr) const { return true; }
-	virtual String validate_path(const String &p_path) const;
-	virtual Script *create_script() const;
-	virtual bool has_named_classes() const;
-	virtual bool supports_builtin_mode() const;
-	/* TODO? */ virtual int find_function(const String &p_function, const String &p_code) const { return -1; }
-	virtual String make_function(const String &p_class, const String &p_name, const PackedStringArray &p_args) const;
+	void get_reserved_words(List<String> *p_words) const override;
+	void get_comment_delimiters(List<String> *p_delimiters) const override;
+	void get_string_delimiters(List<String> *p_delimiters) const override;
+	Ref<Script> get_template(const String &p_class_name, const String &p_base_class_name) const override;
+	bool is_using_templates() override;
+	void make_template(const String &p_class_name, const String &p_base_class_name, Ref<Script> &p_script) override;
+	/* TODO */ bool validate(const String &p_script, int &r_line_error, int &r_col_error,
+			String &r_test_error, const String &p_path, List<String> *r_functions,
+			List<ScriptLanguage::Warning> *r_warnings = nullptr, Set<int> *r_safe_lines = nullptr) const override {
+		return true;
+	}
+	String validate_path(const String &p_path) const override;
+	Script *create_script() const override;
+	bool has_named_classes() const override;
+	bool supports_builtin_mode() const override;
+	/* TODO? */ int find_function(const String &p_function, const String &p_code) const override { return -1; }
+	String make_function(const String &p_class, const String &p_name, const PackedStringArray &p_args) const override;
 	virtual String _get_indentation() const;
-	/* TODO? */ virtual void auto_indent_code(String &p_code, int p_from_line, int p_to_line) const {}
-	/* TODO */ virtual void add_global_constant(const StringName &p_variable, const Variant &p_value) {}
+	/* TODO? */ void auto_indent_code(String &p_code, int p_from_line, int p_to_line) const override {}
+	/* TODO */ void add_global_constant(const StringName &p_variable, const Variant &p_value) override {}
 
 	/* DEBUGGER FUNCTIONS */
-	virtual String debug_get_error() const;
-	virtual int debug_get_stack_level_count() const;
-	virtual int debug_get_stack_level_line(int p_level) const;
-	virtual String debug_get_stack_level_function(int p_level) const;
-	virtual String debug_get_stack_level_source(int p_level) const;
-	/* TODO */ virtual void debug_get_stack_level_locals(int p_level, List<String> *p_locals, List<Variant> *p_values, int p_max_subitems, int p_max_depth) {}
-	/* TODO */ virtual void debug_get_stack_level_members(int p_level, List<String> *p_members, List<Variant> *p_values, int p_max_subitems, int p_max_depth) {}
-	/* TODO */ virtual void debug_get_globals(List<String> *p_locals, List<Variant> *p_values, int p_max_subitems, int p_max_depth) {}
-	/* TODO */ virtual String debug_parse_stack_level_expression(int p_level, const String &p_expression, int p_max_subitems, int p_max_depth) { return ""; }
-	virtual Vector<StackInfo> debug_get_current_stack_info();
+	String debug_get_error() const override;
+	int debug_get_stack_level_count() const override;
+	int debug_get_stack_level_line(int p_level) const override;
+	String debug_get_stack_level_function(int p_level) const override;
+	String debug_get_stack_level_source(int p_level) const override;
+	/* TODO */ void debug_get_stack_level_locals(int p_level, List<String> *p_locals, List<Variant> *p_values, int p_max_subitems, int p_max_depth) override {}
+	/* TODO */ void debug_get_stack_level_members(int p_level, List<String> *p_members, List<Variant> *p_values, int p_max_subitems, int p_max_depth) override {}
+	/* TODO */ void debug_get_globals(List<String> *p_locals, List<Variant> *p_values, int p_max_subitems, int p_max_depth) override {}
+	/* TODO */ String debug_parse_stack_level_expression(int p_level, const String &p_expression, int p_max_subitems, int p_max_depth) override { return ""; }
+	Vector<StackInfo> debug_get_current_stack_info() override;
 
 	/* PROFILING FUNCTIONS */
-	/* TODO */ virtual void profiling_start() {}
-	/* TODO */ virtual void profiling_stop() {}
-	/* TODO */ virtual int profiling_get_accumulated_data(ProfilingInfo *p_info_arr, int p_info_max) { return 0; }
-	/* TODO */ virtual int profiling_get_frame_data(ProfilingInfo *p_info_arr, int p_info_max) { return 0; }
+	/* TODO */ void profiling_start() override {}
+	/* TODO */ void profiling_stop() override {}
+	/* TODO */ int profiling_get_accumulated_data(ProfilingInfo *p_info_arr, int p_info_max) override { return 0; }
+	/* TODO */ int profiling_get_frame_data(ProfilingInfo *p_info_arr, int p_info_max) override { return 0; }
 
-	virtual void frame();
+	void frame() override;
 
-	/* TODO? */ virtual void get_public_functions(List<MethodInfo> *p_functions) const {}
-	/* TODO? */ virtual void get_public_constants(List<Pair<String, Variant>> *p_constants) const {}
+	/* TODO? */ void get_public_functions(List<MethodInfo> *p_functions) const override {}
+	/* TODO? */ void get_public_constants(List<Pair<String, Variant>> *p_constants) const override {}
 
-	virtual void reload_all_scripts();
-	virtual void reload_tool_script(const Ref<Script> &p_script, bool p_soft_reload);
+	void reload_all_scripts() override;
+	void reload_tool_script(const Ref<Script> &p_script, bool p_soft_reload) override;
 
 	/* LOADER FUNCTIONS */
-	virtual void get_recognized_extensions(List<String> *p_extensions) const;
+	void get_recognized_extensions(List<String> *p_extensions) const override;
 
 #ifdef TOOLS_ENABLED
-	virtual Error open_in_external_editor(const Ref<Script> &p_script, int p_line, int p_col);
-	virtual bool overrides_external_editor();
+	Error open_in_external_editor(const Ref<Script> &p_script, int p_line, int p_col) override;
+	bool overrides_external_editor() override;
 #endif
 
 	/* THREAD ATTACHING */
-	virtual void thread_enter();
-	virtual void thread_exit();
+	void thread_enter() override;
+	void thread_exit() override;
 
 	// Don't use these. I'm watching you
-	virtual void *alloc_instance_binding_data(Object *p_object);
-	virtual void free_instance_binding_data(void *p_data);
-	virtual void refcount_incremented_instance_binding(Object *p_object);
-	virtual bool refcount_decremented_instance_binding(Object *p_object);
+	void *alloc_instance_binding_data(Object *p_object) override;
+	void free_instance_binding_data(void *p_data) override;
+	void refcount_incremented_instance_binding(Object *p_object) override;
+	bool refcount_decremented_instance_binding(Object *p_object) override;
 
 	Map<Object *, CSharpScriptBinding>::Element *insert_script_binding(Object *p_object, const CSharpScriptBinding &p_script_binding);
 	bool setup_csharp_script_binding(CSharpScriptBinding &r_script_binding, Object *p_object);
@@ -531,17 +536,17 @@ public:
 
 class ResourceFormatLoaderCSharpScript : public ResourceFormatLoader {
 public:
-	virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false);
-	virtual void get_recognized_extensions(List<String> *p_extensions) const;
-	virtual bool handles_type(const String &p_type) const;
-	virtual String get_resource_type(const String &p_path) const;
+	RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false) override;
+	void get_recognized_extensions(List<String> *p_extensions) const override;
+	bool handles_type(const String &p_type) const override;
+	String get_resource_type(const String &p_path) const override;
 };
 
 class ResourceFormatSaverCSharpScript : public ResourceFormatSaver {
 public:
-	virtual Error save(const String &p_path, const RES &p_resource, uint32_t p_flags = 0);
-	virtual void get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const;
-	virtual bool recognize(const RES &p_resource) const;
+	Error save(const String &p_path, const RES &p_resource, uint32_t p_flags = 0) override;
+	void get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const override;
+	bool recognize(const RES &p_resource) const override;
 };
 
 #endif // CSHARP_SCRIPT_H

+ 0 - 2
modules/mono/editor/bindings_generator.cpp

@@ -62,10 +62,8 @@
 
 #define OPEN_BLOCK_L2 INDENT2 OPEN_BLOCK INDENT3
 #define OPEN_BLOCK_L3 INDENT3 OPEN_BLOCK INDENT4
-#define OPEN_BLOCK_L4 INDENT4 OPEN_BLOCK INDENT5
 #define CLOSE_BLOCK_L2 INDENT2 CLOSE_BLOCK
 #define CLOSE_BLOCK_L3 INDENT3 CLOSE_BLOCK
-#define CLOSE_BLOCK_L4 INDENT4 CLOSE_BLOCK
 
 #define CS_FIELD_MEMORYOWN "memoryOwn"
 #define CS_PARAM_METHODBIND "method"

+ 12 - 6
modules/mono/editor/code_completion.cpp

@@ -45,8 +45,9 @@ _FORCE_INLINE_ String quoted(const String &p_str) {
 }
 
 void _add_nodes_suggestions(const Node *p_base, const Node *p_node, PackedStringArray &r_suggestions) {
-	if (p_node != p_base && !p_node->get_owner())
+	if (p_node != p_base && !p_node->get_owner()) {
 		return;
+	}
 
 	String path_relative_to_orig = p_base->get_path_to(p_node);
 
@@ -58,18 +59,21 @@ void _add_nodes_suggestions(const Node *p_base, const Node *p_node, PackedString
 }
 
 Node *_find_node_for_script(Node *p_base, Node *p_current, const Ref<Script> &p_script) {
-	if (p_current->get_owner() != p_base && p_base != p_current)
+	if (p_current->get_owner() != p_base && p_base != p_current) {
 		return nullptr;
+	}
 
 	Ref<Script> c = p_current->get_script();
 
-	if (c == p_script)
+	if (c == p_script) {
 		return p_current;
+	}
 
 	for (int i = 0; i < p_current->get_child_count(); i++) {
 		Node *found = _find_node_for_script(p_base, p_current->get_child(i), p_script);
-		if (found)
+		if (found) {
 			return found;
+		}
 	}
 
 	return nullptr;
@@ -87,8 +91,9 @@ void _get_directory_contents(EditorFileSystemDirectory *p_dir, PackedStringArray
 
 Node *_try_find_owner_node_in_tree(const Ref<Script> p_script) {
 	SceneTree *tree = SceneTree::get_singleton();
-	if (!tree)
+	if (!tree) {
 		return nullptr;
+	}
 	Node *base = tree->get_edited_scene_root();
 	if (base) {
 		base = _find_node_for_script(base, base, p_script);
@@ -107,8 +112,9 @@ PackedStringArray get_code_completion(CompletionKind p_kind, const String &p_scr
 			for (List<PropertyInfo>::Element *E = project_props.front(); E; E = E->next()) {
 				const PropertyInfo &prop = E->get();
 
-				if (!prop.name.begins_with("input/"))
+				if (!prop.name.begins_with("input/")) {
 					continue;
+				}
 
 				String name = prop.name.substr(prop.name.find("/") + 1, prop.name.length());
 				suggestions.push_back(quoted(name));

+ 2 - 1
modules/mono/editor/csharp_project.cpp

@@ -45,8 +45,9 @@
 namespace CSharpProject {
 
 void add_item(const String &p_project_path, const String &p_item_type, const String &p_include) {
-	if (!GLOBAL_DEF("mono/project/auto_update_project", true))
+	if (!GLOBAL_DEF("mono/project/auto_update_project", true)) {
 		return;
+	}
 
 	GDMonoAssembly *tools_project_editor_assembly = GDMono::get_singleton()->get_tools_project_editor_assembly();
 

+ 1 - 1
modules/mono/editor/editor_internal_calls.cpp

@@ -324,7 +324,7 @@ MonoObject *godot_icall_Internal_GetScriptsMetadataOrNothing(MonoReflectionType
 
 	MonoType *dict_type = mono_reflection_type_get_type(p_dict_reftype);
 
-	uint32_t type_encoding = mono_type_get_type(dict_type);
+	int type_encoding = mono_type_get_type(dict_type);
 	MonoClass *type_class_raw = mono_class_from_mono_type(dict_type);
 	GDMonoClass *type_class = GDMono::get_singleton()->get_class(type_class_raw);
 

+ 4 - 2
modules/mono/editor/godotsharp_export.cpp

@@ -75,8 +75,9 @@ Error get_assembly_dependencies(GDMonoAssembly *p_assembly, const Vector<String>
 
 		const String &ref_name = ref_info.name;
 
-		if (r_assembly_dependencies.has(ref_name))
+		if (r_assembly_dependencies.has(ref_name)) {
 			continue;
+		}
 
 		GDMonoAssembly *ref_assembly = nullptr;
 
@@ -130,8 +131,9 @@ Error get_exported_assembly_dependencies(const Dictionary &p_initial_assemblies,
 		ERR_FAIL_COND_V_MSG(!load_success, ERR_CANT_RESOLVE, "Cannot load assembly (refonly): '" + assembly_name + "'.");
 
 		Error err = get_assembly_dependencies(assembly, search_dirs, r_assembly_dependencies);
-		if (err != OK)
+		if (err != OK) {
 			return err;
+		}
 	}
 
 	return OK;

+ 34 - 17
modules/mono/editor/script_class_parser.cpp

@@ -208,8 +208,9 @@ ScriptClassParser::Token ScriptClassParser::get_token() {
 						tk_string += res;
 
 					} else {
-						if (code[idx] == '\n')
+						if (code[idx] == '\n') {
 							line++;
+						}
 						tk_string += code[idx];
 					}
 					idx++;
@@ -300,15 +301,17 @@ Error ScriptClassParser::_skip_generic_type_params() {
 
 					tk = get_token();
 
-					if (tk != TK_PERIOD)
+					if (tk != TK_PERIOD) {
 						break;
+					}
 				}
 			}
 
 			if (tk == TK_OP_LESS) {
 				Error err = _skip_generic_type_params();
-				if (err)
+				if (err) {
 					return err;
+				}
 				tk = get_token();
 			}
 
@@ -349,12 +352,14 @@ Error ScriptClassParser::_parse_type_full_name(String &r_full_name) {
 
 		// We don't mind if the base is generic, but we skip it any ways since this information is not needed
 		Error err = _skip_generic_type_params();
-		if (err)
+		if (err) {
 			return err;
+		}
 	}
 
-	if (code[idx] != '.') // We only want to take the next token if it's a period
+	if (code[idx] != '.') { // We only want to take the next token if it's a period
 		return OK;
+	}
 
 	tk = get_token();
 
@@ -369,15 +374,17 @@ Error ScriptClassParser::_parse_class_base(Vector<String> &r_base) {
 	String name;
 
 	Error err = _parse_type_full_name(name);
-	if (err)
+	if (err) {
 		return err;
+	}
 
 	Token tk = get_token();
 
 	if (tk == TK_COMMA) {
 		err = _parse_class_base(r_base);
-		if (err)
+		if (err) {
 			return err;
+		}
 	} else if (tk == TK_IDENTIFIER && String(value) == "where") {
 		err = _parse_type_constraints();
 		if (err) {
@@ -433,8 +440,9 @@ Error ScriptClassParser::_parse_type_constraints() {
 
 					tk = get_token();
 
-					if (tk != TK_PERIOD)
+					if (tk != TK_PERIOD) {
 						break;
+					}
 				}
 			}
 		}
@@ -452,8 +460,9 @@ Error ScriptClassParser::_parse_type_constraints() {
 			}
 		} else if (tk == TK_OP_LESS) {
 			Error err = _skip_generic_type_params();
-			if (err)
+			if (err) {
 				return err;
+			}
 		} else if (tk == TK_CURLY_BRACKET_OPEN) {
 			return OK;
 		} else {
@@ -522,8 +531,9 @@ Error ScriptClassParser::parse(const String &p_code) {
 					const NameDecl &name_decl = E->value();
 
 					if (name_decl.type == NameDecl::NAMESPACE_DECL) {
-						if (E != name_stack.front())
+						if (E != name_stack.front()) {
 							class_decl.namespace_ += ".";
+						}
 						class_decl.namespace_ += name_decl.name;
 					} else {
 						class_decl.name += name_decl.name + ".";
@@ -540,8 +550,9 @@ Error ScriptClassParser::parse(const String &p_code) {
 
 					if (tk == TK_COLON) {
 						Error err = _parse_class_base(class_decl.base);
-						if (err)
+						if (err) {
 							return err;
+						}
 
 						curly_stack++;
 						type_curly_stack++;
@@ -555,8 +566,9 @@ Error ScriptClassParser::parse(const String &p_code) {
 						generic = true;
 
 						Error err = _skip_generic_type_params();
-						if (err)
+						if (err) {
 							return err;
+						}
 					} else if (tk == TK_IDENTIFIER && String(value) == "where") {
 						Error err = _parse_type_constraints();
 						if (err) {
@@ -584,8 +596,9 @@ Error ScriptClassParser::parse(const String &p_code) {
 						classes.push_back(class_decl);
 					} else if (OS::get_singleton()->is_stdout_verbose()) {
 						String full_name = class_decl.namespace_;
-						if (full_name.length())
+						if (full_name.length()) {
 							full_name += ".";
+						}
 						full_name += class_decl.name;
 						OS::get_singleton()->print("Ignoring generic class declaration: %s\n", full_name.utf8().get_data());
 					}
@@ -602,8 +615,9 @@ Error ScriptClassParser::parse(const String &p_code) {
 			int at_level = curly_stack;
 
 			Error err = _parse_namespace_name(name, curly_stack);
-			if (err)
+			if (err) {
 				return err;
+			}
 
 			NameDecl name_decl;
 			name_decl.name = name;
@@ -614,8 +628,9 @@ Error ScriptClassParser::parse(const String &p_code) {
 		} else if (tk == TK_CURLY_BRACKET_CLOSE) {
 			curly_stack--;
 			if (name_stack.has(curly_stack)) {
-				if (name_stack[curly_stack].type != NameDecl::NAMESPACE_DECL)
+				if (name_stack[curly_stack].type != NameDecl::NAMESPACE_DECL) {
 					type_curly_stack--;
+				}
 				name_stack.erase(curly_stack);
 			}
 		}
@@ -628,8 +643,9 @@ Error ScriptClassParser::parse(const String &p_code) {
 		error = true;
 	}
 
-	if (error)
+	if (error) {
 		return ERR_PARSE_ERROR;
+	}
 
 	return OK;
 }
@@ -702,8 +718,9 @@ static void run_dummy_preprocessor(String &r_source, const String &p_filepath) {
 
 	// Custom join ignoring lines removed by the preprocessor
 	for (int i = 0; i < lines.size(); i++) {
-		if (i > 0 && include_lines[i - 1])
+		if (i > 0 && include_lines[i - 1]) {
 			r_source += '\n';
+		}
 
 		if (include_lines[i]) {
 			r_source += lines[i];

+ 0 - 1
modules/mono/editor/script_class_parser.h

@@ -53,7 +53,6 @@ public:
 		String namespace_;
 		Vector<String> base;
 		bool nested;
-		bool has_script_attr;
 	};
 
 private:

+ 2 - 2
modules/mono/glue/arguments_vector.h

@@ -40,8 +40,8 @@ private:
 	T *_ptr;
 	int size;
 
-	ArgumentsVector();
-	ArgumentsVector(const ArgumentsVector &);
+	ArgumentsVector() = delete;
+	ArgumentsVector(const ArgumentsVector &) = delete;
 
 public:
 	T *ptr() { return _ptr; }

+ 8 - 4
modules/mono/glue/base_object_glue.cpp

@@ -28,10 +28,10 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 
-#include "base_object_glue.h"
-
 #ifdef MONO_GLUE_ENABLED
 
+#include "core/class_db.h"
+#include "core/object.h"
 #include "core/reference.h"
 #include "core/string_name.h"
 
@@ -39,6 +39,7 @@
 #include "../mono_gd/gd_mono_cache.h"
 #include "../mono_gd/gd_mono_class.h"
 #include "../mono_gd/gd_mono_internals.h"
+#include "../mono_gd/gd_mono_marshal.h"
 #include "../mono_gd/gd_mono_utils.h"
 #include "../signal_awaiter_utils.h"
 #include "arguments_vector.h"
@@ -140,16 +141,18 @@ MethodBind *godot_icall_Object_ClassDB_get_method(StringName *p_type, MonoString
 }
 
 MonoObject *godot_icall_Object_weakref(Object *p_ptr) {
-	if (!p_ptr)
+	if (!p_ptr) {
 		return nullptr;
+	}
 
 	Ref<WeakRef> wref;
 	Reference *ref = Object::cast_to<Reference>(p_ptr);
 
 	if (ref) {
 		REF r = ref;
-		if (!r.is_valid())
+		if (!r.is_valid()) {
 			return nullptr;
+		}
 
 		wref.instance();
 		wref->set_ref(r);
@@ -241,6 +244,7 @@ void godot_register_object_icalls() {
 	mono_add_internal_call("Godot.Object::godot_icall_Object_Ctor", (void *)godot_icall_Object_Ctor);
 	mono_add_internal_call("Godot.Object::godot_icall_Object_Disposed", (void *)godot_icall_Object_Disposed);
 	mono_add_internal_call("Godot.Object::godot_icall_Reference_Disposed", (void *)godot_icall_Reference_Disposed);
+	mono_add_internal_call("Godot.Object::godot_icall_Object_ConnectEventSignals", (void *)godot_icall_Object_ConnectEventSignals);
 	mono_add_internal_call("Godot.Object::godot_icall_Object_ClassDB_get_method", (void *)godot_icall_Object_ClassDB_get_method);
 	mono_add_internal_call("Godot.Object::godot_icall_Object_ToString", (void *)godot_icall_Object_ToString);
 	mono_add_internal_call("Godot.Object::godot_icall_Object_weakref", (void *)godot_icall_Object_weakref);

+ 0 - 73
modules/mono/glue/base_object_glue.h

@@ -1,73 +0,0 @@
-/*************************************************************************/
-/*  base_object_glue.h                                                   */
-/*************************************************************************/
-/*                       This file is part of:                           */
-/*                           GODOT ENGINE                                */
-/*                      https://godotengine.org                          */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */
-/*                                                                       */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the       */
-/* "Software"), to deal in the Software without restriction, including   */
-/* without limitation the rights to use, copy, modify, merge, publish,   */
-/* distribute, sublicense, and/or sell copies of the Software, and to    */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions:                                             */
-/*                                                                       */
-/* The above copyright notice and this permission notice shall be        */
-/* included in all copies or substantial portions of the Software.       */
-/*                                                                       */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
-/*************************************************************************/
-
-#ifndef BASE_OBJECT_GLUE_H
-#define BASE_OBJECT_GLUE_H
-
-#ifdef MONO_GLUE_ENABLED
-
-#include "core/class_db.h"
-#include "core/object.h"
-
-#include "../mono_gd/gd_mono_marshal.h"
-
-Object *godot_icall_Object_Ctor(MonoObject *p_obj);
-
-void godot_icall_Object_Disposed(MonoObject *p_obj, Object *p_ptr);
-
-void godot_icall_Reference_Disposed(MonoObject *p_obj, Object *p_ptr, MonoBoolean p_is_finalizer);
-
-void godot_icall_Object_ConnectEventSignals(Object *p_ptr);
-
-MethodBind *godot_icall_Object_ClassDB_get_method(StringName *p_type, MonoString *p_method);
-
-MonoObject *godot_icall_Object_weakref(Object *p_ptr);
-
-Error godot_icall_SignalAwaiter_connect(Object *p_source, StringName *p_signal, Object *p_target, MonoObject *p_awaiter);
-
-// DynamicGodotObject
-
-MonoArray *godot_icall_DynamicGodotObject_SetMemberList(Object *p_ptr);
-
-MonoBoolean godot_icall_DynamicGodotObject_InvokeMember(Object *p_ptr, MonoString *p_name, MonoArray *p_args, MonoObject **r_result);
-
-MonoBoolean godot_icall_DynamicGodotObject_GetMember(Object *p_ptr, MonoString *p_name, MonoObject **r_result);
-
-MonoBoolean godot_icall_DynamicGodotObject_SetMember(Object *p_ptr, MonoString *p_name, MonoObject *p_value);
-
-MonoString *godot_icall_Object_ToString(Object *p_ptr);
-
-// Register internal calls
-
-void godot_register_object_icalls();
-
-#endif // MONO_GLUE_ENABLED
-
-#endif // BASE_OBJECT_GLUE_H

+ 3 - 2
modules/mono/glue/collections_glue.cpp

@@ -28,14 +28,15 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 
-#include "collections_glue.h"
-
 #ifdef MONO_GLUE_ENABLED
 
 #include <mono/metadata/exception.h>
 
+#include "core/array.h"
+
 #include "../mono_gd/gd_mono_cache.h"
 #include "../mono_gd/gd_mono_class.h"
+#include "../mono_gd/gd_mono_marshal.h"
 #include "../mono_gd/gd_mono_utils.h"
 
 Array *godot_icall_Array_Ctor() {

+ 0 - 124
modules/mono/glue/collections_glue.h

@@ -1,124 +0,0 @@
-/*************************************************************************/
-/*  collections_glue.h                                                   */
-/*************************************************************************/
-/*                       This file is part of:                           */
-/*                           GODOT ENGINE                                */
-/*                      https://godotengine.org                          */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */
-/*                                                                       */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the       */
-/* "Software"), to deal in the Software without restriction, including   */
-/* without limitation the rights to use, copy, modify, merge, publish,   */
-/* distribute, sublicense, and/or sell copies of the Software, and to    */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions:                                             */
-/*                                                                       */
-/* The above copyright notice and this permission notice shall be        */
-/* included in all copies or substantial portions of the Software.       */
-/*                                                                       */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
-/*************************************************************************/
-
-#ifndef COLLECTIONS_GLUE_H
-#define COLLECTIONS_GLUE_H
-
-#ifdef MONO_GLUE_ENABLED
-
-#include "core/array.h"
-
-#include "../mono_gd/gd_mono_marshal.h"
-
-// Array
-
-Array *godot_icall_Array_Ctor();
-
-void godot_icall_Array_Dtor(Array *ptr);
-
-MonoObject *godot_icall_Array_At(Array *ptr, int index);
-
-MonoObject *godot_icall_Array_At_Generic(Array *ptr, int index, uint32_t type_encoding, GDMonoClass *type_class);
-
-void godot_icall_Array_SetAt(Array *ptr, int index, MonoObject *value);
-
-int godot_icall_Array_Count(Array *ptr);
-
-int godot_icall_Array_Add(Array *ptr, MonoObject *item);
-
-void godot_icall_Array_Clear(Array *ptr);
-
-MonoBoolean godot_icall_Array_Contains(Array *ptr, MonoObject *item);
-
-void godot_icall_Array_CopyTo(Array *ptr, MonoArray *array, int array_index);
-
-Array *godot_icall_Array_Duplicate(Array *ptr, MonoBoolean deep);
-
-int godot_icall_Array_IndexOf(Array *ptr, MonoObject *item);
-
-void godot_icall_Array_Insert(Array *ptr, int index, MonoObject *item);
-
-MonoBoolean godot_icall_Array_Remove(Array *ptr, MonoObject *item);
-
-void godot_icall_Array_RemoveAt(Array *ptr, int index);
-
-Error godot_icall_Array_Resize(Array *ptr, int new_size);
-
-void godot_icall_Array_Generic_GetElementTypeInfo(MonoReflectionType *refltype, uint32_t *type_encoding, GDMonoClass **type_class);
-
-MonoString *godot_icall_Array_ToString(Array *ptr);
-
-// Dictionary
-
-Dictionary *godot_icall_Dictionary_Ctor();
-
-void godot_icall_Dictionary_Dtor(Dictionary *ptr);
-
-MonoObject *godot_icall_Dictionary_GetValue(Dictionary *ptr, MonoObject *key);
-
-MonoObject *godot_icall_Dictionary_GetValue_Generic(Dictionary *ptr, MonoObject *key, uint32_t type_encoding, GDMonoClass *type_class);
-
-void godot_icall_Dictionary_SetValue(Dictionary *ptr, MonoObject *key, MonoObject *value);
-
-Array *godot_icall_Dictionary_Keys(Dictionary *ptr);
-
-Array *godot_icall_Dictionary_Values(Dictionary *ptr);
-
-int godot_icall_Dictionary_Count(Dictionary *ptr);
-
-void godot_icall_Dictionary_Add(Dictionary *ptr, MonoObject *key, MonoObject *value);
-
-void godot_icall_Dictionary_Clear(Dictionary *ptr);
-
-MonoBoolean godot_icall_Dictionary_Contains(Dictionary *ptr, MonoObject *key, MonoObject *value);
-
-MonoBoolean godot_icall_Dictionary_ContainsKey(Dictionary *ptr, MonoObject *key);
-
-Dictionary *godot_icall_Dictionary_Duplicate(Dictionary *ptr, MonoBoolean deep);
-
-MonoBoolean godot_icall_Dictionary_RemoveKey(Dictionary *ptr, MonoObject *key);
-
-MonoBoolean godot_icall_Dictionary_Remove(Dictionary *ptr, MonoObject *key, MonoObject *value);
-
-MonoBoolean godot_icall_Dictionary_TryGetValue(Dictionary *ptr, MonoObject *key, MonoObject **value);
-
-MonoBoolean godot_icall_Dictionary_TryGetValue_Generic(Dictionary *ptr, MonoObject *key, MonoObject **value, uint32_t type_encoding, GDMonoClass *type_class);
-
-void godot_icall_Dictionary_Generic_GetValueTypeInfo(MonoReflectionType *refltype, uint32_t *type_encoding, GDMonoClass **type_class);
-
-MonoString *godot_icall_Dictionary_ToString(Dictionary *ptr);
-
-// Register internal calls
-
-void godot_register_collections_icalls();
-
-#endif // MONO_GLUE_ENABLED
-
-#endif // COLLECTIONS_GLUE_H

+ 9 - 7
modules/mono/glue/gd_glue.cpp

@@ -28,8 +28,6 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 
-#include "gd_glue.h"
-
 #ifdef MONO_GLUE_ENABLED
 
 #include "core/array.h"
@@ -40,6 +38,7 @@
 #include "core/variant_parser.h"
 
 #include "../mono_gd/gd_mono_cache.h"
+#include "../mono_gd/gd_mono_marshal.h"
 #include "../mono_gd/gd_mono_utils.h"
 
 MonoObject *godot_icall_GD_bytes2var(MonoArray *p_bytes, MonoBoolean p_allow_objects) {
@@ -147,8 +146,9 @@ void godot_icall_GD_prints(MonoArray *p_what) {
 			return;
 		}
 
-		if (i)
+		if (i) {
 			str += " ";
+		}
 
 		str += elem_str;
 	}
@@ -171,8 +171,9 @@ void godot_icall_GD_printt(MonoArray *p_what) {
 			return;
 		}
 
-		if (i)
+		if (i) {
 			str += "\t";
+		}
 
 		str += elem_str;
 	}
@@ -197,7 +198,7 @@ double godot_icall_GD_rand_range(double from, double to) {
 }
 
 uint32_t godot_icall_GD_rand_seed(uint64_t seed, uint64_t *newSeed) {
-	int ret = Math::rand_from_seed(&seed);
+	uint32_t ret = Math::rand_from_seed(&seed);
 	*newSeed = seed;
 	return ret;
 }
@@ -213,10 +214,11 @@ MonoString *godot_icall_GD_str(MonoArray *p_what) {
 	for (int i = 0; i < what.size(); i++) {
 		String os = what[i].operator String();
 
-		if (i == 0)
+		if (i == 0) {
 			str = os;
-		else
+		} else {
 			str += os;
+		}
 	}
 
 	return GDMonoMarshal::mono_string_from_godot(str);

+ 0 - 86
modules/mono/glue/gd_glue.h

@@ -1,86 +0,0 @@
-/*************************************************************************/
-/*  gd_glue.h                                                            */
-/*************************************************************************/
-/*                       This file is part of:                           */
-/*                           GODOT ENGINE                                */
-/*                      https://godotengine.org                          */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */
-/*                                                                       */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the       */
-/* "Software"), to deal in the Software without restriction, including   */
-/* without limitation the rights to use, copy, modify, merge, publish,   */
-/* distribute, sublicense, and/or sell copies of the Software, and to    */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions:                                             */
-/*                                                                       */
-/* The above copyright notice and this permission notice shall be        */
-/* included in all copies or substantial portions of the Software.       */
-/*                                                                       */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
-/*************************************************************************/
-
-#ifndef GD_GLUE_H
-#define GD_GLUE_H
-
-#ifdef MONO_GLUE_ENABLED
-
-#include "../mono_gd/gd_mono_marshal.h"
-
-MonoObject *godot_icall_GD_bytes2var(MonoArray *p_bytes, MonoBoolean p_allow_objects);
-
-MonoObject *godot_icall_GD_convert(MonoObject *p_what, int32_t p_type);
-
-int godot_icall_GD_hash(MonoObject *p_var);
-
-MonoObject *godot_icall_GD_instance_from_id(uint64_t p_instance_id);
-
-void godot_icall_GD_print(MonoArray *p_what);
-
-void godot_icall_GD_printerr(MonoArray *p_what);
-
-void godot_icall_GD_printraw(MonoArray *p_what);
-
-void godot_icall_GD_prints(MonoArray *p_what);
-
-void godot_icall_GD_printt(MonoArray *p_what);
-
-float godot_icall_GD_randf();
-
-uint32_t godot_icall_GD_randi();
-
-void godot_icall_GD_randomize();
-
-double godot_icall_GD_rand_range(double from, double to);
-
-uint32_t godot_icall_GD_rand_seed(uint64_t seed, uint64_t *newSeed);
-
-void godot_icall_GD_seed(uint64_t p_seed);
-
-MonoString *godot_icall_GD_str(MonoArray *p_what);
-
-MonoObject *godot_icall_GD_str2var(MonoString *p_str);
-
-MonoBoolean godot_icall_GD_type_exists(StringName *p_type);
-
-MonoArray *godot_icall_GD_var2bytes(MonoObject *p_var, MonoBoolean p_full_objects);
-
-MonoString *godot_icall_GD_var2str(MonoObject *p_var);
-
-MonoObject *godot_icall_DefaultGodotTaskScheduler();
-
-// Register internal calls
-
-void godot_register_gd_icalls();
-
-#endif // MONO_GLUE_ENABLED
-
-#endif // GD_GLUE_H

+ 10 - 8
modules/mono/glue/glue_header.h

@@ -30,14 +30,16 @@
 
 #ifdef MONO_GLUE_ENABLED
 
-#include "base_object_glue.h"
-#include "collections_glue.h"
-#include "gd_glue.h"
-#include "nodepath_glue.h"
-#include "rid_glue.h"
-#include "scene_tree_glue.h"
-#include "string_glue.h"
-#include "string_name_glue.h"
+#include "../mono_gd/gd_mono_marshal.h"
+
+void godot_register_collections_icalls();
+void godot_register_gd_icalls();
+void godot_register_string_name_icalls();
+void godot_register_nodepath_icalls();
+void godot_register_object_icalls();
+void godot_register_rid_icalls();
+void godot_register_string_icalls();
+void godot_register_scene_tree_icalls();
 
 /**
  * Registers internal calls that were not generated. This function is called

+ 5 - 4
modules/mono/glue/nodepath_glue.cpp

@@ -28,12 +28,13 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 
-#include "nodepath_glue.h"
-
 #ifdef MONO_GLUE_ENABLED
 
+#include "core/node_path.h"
 #include "core/ustring.h"
 
+#include "../mono_gd/gd_mono_marshal.h"
+
 NodePath *godot_icall_NodePath_Ctor(MonoString *p_path) {
 	return memnew(NodePath(GDMonoMarshal::mono_string_to_godot(p_path)));
 }
@@ -51,7 +52,7 @@ MonoBoolean godot_icall_NodePath_is_absolute(NodePath *p_ptr) {
 	return (MonoBoolean)p_ptr->is_absolute();
 }
 
-uint32_t godot_icall_NodePath_get_name_count(NodePath *p_ptr) {
+int32_t godot_icall_NodePath_get_name_count(NodePath *p_ptr) {
 	return p_ptr->get_name_count();
 }
 
@@ -59,7 +60,7 @@ MonoString *godot_icall_NodePath_get_name(NodePath *p_ptr, uint32_t p_idx) {
 	return GDMonoMarshal::mono_string_from_godot(p_ptr->get_name(p_idx));
 }
 
-uint32_t godot_icall_NodePath_get_subname_count(NodePath *p_ptr) {
+int32_t godot_icall_NodePath_get_subname_count(NodePath *p_ptr) {
 	return p_ptr->get_subname_count();
 }
 

+ 0 - 68
modules/mono/glue/nodepath_glue.h

@@ -1,68 +0,0 @@
-/*************************************************************************/
-/*  nodepath_glue.h                                                      */
-/*************************************************************************/
-/*                       This file is part of:                           */
-/*                           GODOT ENGINE                                */
-/*                      https://godotengine.org                          */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */
-/*                                                                       */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the       */
-/* "Software"), to deal in the Software without restriction, including   */
-/* without limitation the rights to use, copy, modify, merge, publish,   */
-/* distribute, sublicense, and/or sell copies of the Software, and to    */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions:                                             */
-/*                                                                       */
-/* The above copyright notice and this permission notice shall be        */
-/* included in all copies or substantial portions of the Software.       */
-/*                                                                       */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
-/*************************************************************************/
-
-#ifndef NODEPATH_GLUE_H
-#define NODEPATH_GLUE_H
-
-#ifdef MONO_GLUE_ENABLED
-
-#include "core/node_path.h"
-
-#include "../mono_gd/gd_mono_marshal.h"
-
-NodePath *godot_icall_NodePath_Ctor(MonoString *p_path);
-
-void godot_icall_NodePath_Dtor(NodePath *p_ptr);
-
-MonoString *godot_icall_NodePath_operator_String(NodePath *p_np);
-
-MonoBoolean godot_icall_NodePath_is_absolute(NodePath *p_ptr);
-
-uint32_t godot_icall_NodePath_get_name_count(NodePath *p_ptr);
-
-MonoString *godot_icall_NodePath_get_name(NodePath *p_ptr, uint32_t p_idx);
-
-uint32_t godot_icall_NodePath_get_subname_count(NodePath *p_ptr);
-
-MonoString *godot_icall_NodePath_get_subname(NodePath *p_ptr, uint32_t p_idx);
-
-MonoString *godot_icall_NodePath_get_concatenated_subnames(NodePath *p_ptr);
-
-NodePath *godot_icall_NodePath_get_as_property_path(NodePath *p_ptr);
-
-MonoBoolean godot_icall_NodePath_is_empty(NodePath *p_ptr);
-
-// Register internal calls
-
-void godot_register_nodepath_icalls();
-
-#endif // MONO_GLUE_ENABLED
-
-#endif // NODEPATH_GLUE_H

+ 6 - 3
modules/mono/glue/rid_glue.cpp

@@ -28,17 +28,20 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 
-#include "rid_glue.h"
-
 #ifdef MONO_GLUE_ENABLED
 
+#include "core/object.h"
 #include "core/resource.h"
+#include "core/rid.h"
+
+#include "../mono_gd/gd_mono_marshal.h"
 
 RID *godot_icall_RID_Ctor(Object *p_from) {
 	Resource *res_from = Object::cast_to<Resource>(p_from);
 
-	if (res_from)
+	if (res_from) {
 		return memnew(RID(res_from->get_rid()));
+	}
 
 	return memnew(RID);
 }

+ 0 - 53
modules/mono/glue/rid_glue.h

@@ -1,53 +0,0 @@
-/*************************************************************************/
-/*  rid_glue.h                                                           */
-/*************************************************************************/
-/*                       This file is part of:                           */
-/*                           GODOT ENGINE                                */
-/*                      https://godotengine.org                          */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */
-/*                                                                       */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the       */
-/* "Software"), to deal in the Software without restriction, including   */
-/* without limitation the rights to use, copy, modify, merge, publish,   */
-/* distribute, sublicense, and/or sell copies of the Software, and to    */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions:                                             */
-/*                                                                       */
-/* The above copyright notice and this permission notice shall be        */
-/* included in all copies or substantial portions of the Software.       */
-/*                                                                       */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
-/*************************************************************************/
-
-#ifndef RID_GLUE_H
-#define RID_GLUE_H
-
-#ifdef MONO_GLUE_ENABLED
-
-#include "core/object.h"
-#include "core/rid.h"
-
-#include "../mono_gd/gd_mono_marshal.h"
-
-RID *godot_icall_RID_Ctor(Object *p_from);
-
-void godot_icall_RID_Dtor(RID *p_ptr);
-
-uint32_t godot_icall_RID_get_id(RID *p_ptr);
-
-// Register internal calls
-
-void godot_register_rid_icalls();
-
-#endif // MONO_GLUE_ENABLED
-
-#endif // RID_GLUE_H

+ 9 - 5
modules/mono/glue/scene_tree_glue.cpp

@@ -28,14 +28,17 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 
-#include "scene_tree_glue.h"
-
 #ifdef MONO_GLUE_ENABLED
 
+#include "core/array.h"
 #include "core/class_db.h"
-#include "modules/mono/csharp_script.h"
-#include "modules/mono/mono_gd/gd_mono_utils.h"
+#include "core/string_name.h"
 #include "scene/main/node.h"
+#include "scene/main/scene_tree.h"
+
+#include "../csharp_script.h"
+#include "../mono_gd/gd_mono_marshal.h"
+#include "../mono_gd/gd_mono_utils.h"
 
 Array *godot_icall_SceneTree_get_nodes_in_group_Generic(SceneTree *ptr, StringName *group, MonoReflectionType *refltype) {
 	List<Node *> nodes;
@@ -54,8 +57,9 @@ Array *godot_icall_SceneTree_get_nodes_in_group_Generic(SceneTree *ptr, StringNa
 			// If we're trying to get native objects, just check the inheritance list
 			StringName native_class_name = GDMonoUtils::get_native_godot_class_name(klass);
 			for (int i = 0; i < nodes.size(); ++i) {
-				if (ClassDB::is_parent_class(nodes[i]->get_class(), native_class_name))
+				if (ClassDB::is_parent_class(nodes[i]->get_class(), native_class_name)) {
 					ret.push_back(nodes[i]);
+				}
 			}
 		} else {
 			// If we're trying to get csharpscript instances, get the mono object and compare the classes

+ 0 - 50
modules/mono/glue/scene_tree_glue.h

@@ -1,50 +0,0 @@
-/*************************************************************************/
-/*  scene_tree_glue.h                                                    */
-/*************************************************************************/
-/*                       This file is part of:                           */
-/*                           GODOT ENGINE                                */
-/*                      https://godotengine.org                          */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */
-/*                                                                       */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the       */
-/* "Software"), to deal in the Software without restriction, including   */
-/* without limitation the rights to use, copy, modify, merge, publish,   */
-/* distribute, sublicense, and/or sell copies of the Software, and to    */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions:                                             */
-/*                                                                       */
-/* The above copyright notice and this permission notice shall be        */
-/* included in all copies or substantial portions of the Software.       */
-/*                                                                       */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
-/*************************************************************************/
-
-#ifndef SCENE_TREE_GLUE_H
-#define SCENE_TREE_GLUE_H
-
-#ifdef MONO_GLUE_ENABLED
-
-#include "core/array.h"
-#include "core/string_name.h"
-#include "scene/main/scene_tree.h"
-
-#include "../mono_gd/gd_mono_marshal.h"
-
-Array *godot_icall_SceneTree_get_nodes_in_group_Generic(SceneTree *ptr, StringName *group, MonoReflectionType *refltype);
-
-// Register internal calls
-
-void godot_register_scene_tree_icalls();
-
-#endif // MONO_GLUE_ENABLED
-
-#endif // SCENE_TREE_GLUE_H

+ 2 - 2
modules/mono/glue/string_glue.cpp

@@ -28,14 +28,14 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 
-#include "string_glue.h"
-
 #ifdef MONO_GLUE_ENABLED
 
 #include "core/ustring.h"
 #include "core/variant.h"
 #include "core/vector.h"
 
+#include "../mono_gd/gd_mono_marshal.h"
+
 MonoArray *godot_icall_String_md5_buffer(MonoString *p_str) {
 	Vector<uint8_t> ret = GDMonoMarshal::mono_string_to_godot(p_str).md5_buffer();
 	// TODO Check possible Array/Vector<uint8_t> problem?

+ 0 - 56
modules/mono/glue/string_glue.h

@@ -1,56 +0,0 @@
-/*************************************************************************/
-/*  string_glue.h                                                        */
-/*************************************************************************/
-/*                       This file is part of:                           */
-/*                           GODOT ENGINE                                */
-/*                      https://godotengine.org                          */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */
-/*                                                                       */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the       */
-/* "Software"), to deal in the Software without restriction, including   */
-/* without limitation the rights to use, copy, modify, merge, publish,   */
-/* distribute, sublicense, and/or sell copies of the Software, and to    */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions:                                             */
-/*                                                                       */
-/* The above copyright notice and this permission notice shall be        */
-/* included in all copies or substantial portions of the Software.       */
-/*                                                                       */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
-/*************************************************************************/
-
-#ifndef STRING_GLUE_H
-#define STRING_GLUE_H
-
-#ifdef MONO_GLUE_ENABLED
-
-#include "../mono_gd/gd_mono_marshal.h"
-
-MonoArray *godot_icall_String_md5_buffer(MonoString *p_str);
-
-MonoString *godot_icall_String_md5_text(MonoString *p_str);
-
-int godot_icall_String_rfind(MonoString *p_str, MonoString *p_what, int p_from);
-
-int godot_icall_String_rfindn(MonoString *p_str, MonoString *p_what, int p_from);
-
-MonoArray *godot_icall_String_sha256_buffer(MonoString *p_str);
-
-MonoString *godot_icall_String_sha256_text(MonoString *p_str);
-
-// Register internal calls
-
-void godot_register_string_icalls();
-
-#endif // MONO_GLUE_ENABLED
-
-#endif // STRING_GLUE_H

+ 4 - 3
modules/mono/glue/string_name_glue.cpp

@@ -28,12 +28,13 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 
-#include "string_name_glue.h"
-
 #ifdef MONO_GLUE_ENABLED
 
+#include "core/string_name.h"
 #include "core/ustring.h"
 
+#include "../mono_gd/gd_mono_marshal.h"
+
 StringName *godot_icall_StringName_Ctor(MonoString *p_path) {
 	return memnew(StringName(GDMonoMarshal::mono_string_to_godot(p_path)));
 }
@@ -48,7 +49,7 @@ MonoString *godot_icall_StringName_operator_String(StringName *p_np) {
 }
 
 MonoBoolean godot_icall_StringName_is_empty(StringName *p_ptr) {
-	return (MonoBoolean)(p_ptr == StringName());
+	return (MonoBoolean)(*p_ptr == StringName());
 }
 
 void godot_register_string_name_icalls() {

+ 0 - 54
modules/mono/glue/string_name_glue.h

@@ -1,54 +0,0 @@
-/*************************************************************************/
-/*  string_name_glue.h                                                   */
-/*************************************************************************/
-/*                       This file is part of:                           */
-/*                           GODOT ENGINE                                */
-/*                      https://godotengine.org                          */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */
-/*                                                                       */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the       */
-/* "Software"), to deal in the Software without restriction, including   */
-/* without limitation the rights to use, copy, modify, merge, publish,   */
-/* distribute, sublicense, and/or sell copies of the Software, and to    */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions:                                             */
-/*                                                                       */
-/* The above copyright notice and this permission notice shall be        */
-/* included in all copies or substantial portions of the Software.       */
-/*                                                                       */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
-/*************************************************************************/
-
-#ifndef STRING_NAME_GLUE_H
-#define STRING_NAME_GLUE_H
-
-#ifdef MONO_GLUE_ENABLED
-
-#include "core/string_name.h"
-
-#include "../mono_gd/gd_mono_marshal.h"
-
-StringName *godot_icall_StringName_Ctor(MonoString *p_path);
-
-void godot_icall_StringName_Dtor(StringName *p_ptr);
-
-MonoString *godot_icall_StringName_operator_String(StringName *p_np);
-
-MonoBoolean godot_icall_StringName_is_empty(StringName *p_ptr);
-
-// Register internal calls
-
-void godot_register_string_name_icalls();
-
-#endif // MONO_GLUE_ENABLED
-
-#endif // STRING_NAME_GLUE_H

+ 4 - 2
modules/mono/managed_callable.cpp

@@ -48,8 +48,9 @@ bool ManagedCallable::compare_equal(const CallableCustom *p_a, const CallableCus
 	MonoDelegate *delegate_b = (MonoDelegate *)b->delegate_handle.get_target();
 
 	if (!delegate_a || !delegate_b) {
-		if (!delegate_a && !delegate_b)
+		if (!delegate_a && !delegate_b) {
 			return true;
+		}
 		return false;
 	}
 
@@ -58,8 +59,9 @@ bool ManagedCallable::compare_equal(const CallableCustom *p_a, const CallableCus
 }
 
 bool ManagedCallable::compare_less(const CallableCustom *p_a, const CallableCustom *p_b) {
-	if (compare_equal(p_a, p_b))
+	if (compare_equal(p_a, p_b)) {
 		return false;
+	}
 	return p_a < p_b;
 }
 

+ 97 - 54
modules/mono/mono_gd/gd_mono.cpp

@@ -144,8 +144,9 @@ void gd_mono_debug_init() {
 	if (Engine::get_singleton()->is_editor_hint() ||
 			ProjectSettings::get_singleton()->get_resource_path().empty() ||
 			Main::is_project_manager()) {
-		if (da_args.size() == 0)
+		if (da_args.size() == 0) {
 			return;
+		}
 	}
 
 	if (da_args.length() == 0) {
@@ -423,24 +424,27 @@ void GDMono::initialize_load_assemblies() {
 	bool tool_assemblies_loaded = _load_tools_assemblies();
 	CRASH_COND_MSG(!tool_assemblies_loaded, "Mono: Failed to load '" TOOLS_ASM_NAME "' assemblies.");
 
-	if (Main::is_project_manager())
+	if (Main::is_project_manager()) {
 		return;
+	}
 #endif
 
 	// Load the project's main assembly. This doesn't necessarily need to succeed.
 	// The game may not be using .NET at all, or if the project does use .NET and
 	// we're running in the editor, it may just happen to be it wasn't built yet.
 	if (!_load_project_assembly()) {
-		if (OS::get_singleton()->is_stdout_verbose())
+		if (OS::get_singleton()->is_stdout_verbose()) {
 			print_error("Mono: Failed to load project assembly");
+		}
 	}
 }
 
 bool GDMono::_are_api_assemblies_out_of_sync() {
 	bool out_of_sync = core_api_assembly.assembly && (core_api_assembly.out_of_sync || !GDMonoCache::cached_data.godot_api_cache_updated);
 #ifdef TOOLS_ENABLED
-	if (!out_of_sync)
+	if (!out_of_sync) {
 		out_of_sync = editor_api_assembly.assembly && editor_api_assembly.out_of_sync;
+	}
 #endif
 	return out_of_sync;
 }
@@ -512,16 +516,17 @@ void GDMono::_init_exception_policy() {
 	}
 }
 
-void GDMono::add_assembly(uint32_t p_domain_id, GDMonoAssembly *p_assembly) {
+void GDMono::add_assembly(int32_t p_domain_id, GDMonoAssembly *p_assembly) {
 	assemblies[p_domain_id][p_assembly->get_name()] = p_assembly;
 }
 
 GDMonoAssembly *GDMono::get_loaded_assembly(const String &p_name) {
-	if (p_name == "mscorlib" && corlib_assembly)
+	if (p_name == "mscorlib" && corlib_assembly) {
 		return corlib_assembly;
+	}
 
 	MonoDomain *domain = mono_domain_get();
-	uint32_t domain_id = domain ? mono_domain_get_id(domain) : 0;
+	int32_t domain_id = domain ? mono_domain_get_id(domain) : 0;
 	GDMonoAssembly **result = assemblies[domain_id].getptr(p_name);
 	return result ? *result : nullptr;
 }
@@ -556,8 +561,9 @@ bool GDMono::load_assembly(const String &p_name, MonoAssemblyName *p_aname, GDMo
 
 	GDMonoAssembly *assembly = GDMonoAssembly::load(p_name, p_aname, p_refonly, p_search_dirs);
 
-	if (!assembly)
+	if (!assembly) {
 		return false;
+	}
 
 	*r_assembly = assembly;
 
@@ -573,8 +579,9 @@ bool GDMono::load_assembly_from(const String &p_name, const String &p_path, GDMo
 
 	GDMonoAssembly *assembly = GDMonoAssembly::load_from(p_name, p_path, p_refonly);
 
-	if (!assembly)
+	if (!assembly) {
 		return false;
+	}
 
 	*r_assembly = assembly;
 
@@ -594,16 +601,19 @@ ApiAssemblyInfo::Version ApiAssemblyInfo::Version::get_from_loaded_assembly(GDMo
 
 	if (nativecalls_klass) {
 		GDMonoField *api_hash_field = nativecalls_klass->get_field("godot_api_hash");
-		if (api_hash_field)
+		if (api_hash_field) {
 			api_assembly_version.godot_api_hash = GDMonoMarshal::unbox<uint64_t>(api_hash_field->get_value(nullptr));
+		}
 
 		GDMonoField *binds_ver_field = nativecalls_klass->get_field("bindings_version");
-		if (binds_ver_field)
+		if (binds_ver_field) {
 			api_assembly_version.bindings_version = GDMonoMarshal::unbox<uint32_t>(binds_ver_field->get_value(nullptr));
+		}
 
 		GDMonoField *cs_glue_ver_field = nativecalls_klass->get_field("cs_glue_version");
-		if (cs_glue_ver_field)
+		if (cs_glue_ver_field) {
 			api_assembly_version.cs_glue_version = GDMonoMarshal::unbox<uint32_t>(cs_glue_ver_field->get_value(nullptr));
+		}
 	}
 
 	return api_assembly_version;
@@ -614,13 +624,15 @@ String ApiAssemblyInfo::to_string(ApiAssemblyInfo::Type p_type) {
 }
 
 bool GDMono::_load_corlib_assembly() {
-	if (corlib_assembly)
+	if (corlib_assembly) {
 		return true;
+	}
 
 	bool success = load_assembly("mscorlib", &corlib_assembly);
 
-	if (success)
+	if (success) {
 		GDMonoCache::update_corlib_cache();
+	}
 
 	return success;
 }
@@ -647,12 +659,14 @@ bool GDMono::copy_prebuilt_api_assembly(ApiAssemblyInfo::Type p_api_type, const
 	DirAccessRef da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
 
 	String xml_file = assembly_name + ".xml";
-	if (da->copy(src_dir.plus_file(xml_file), dst_dir.plus_file(xml_file)) != OK)
+	if (da->copy(src_dir.plus_file(xml_file), dst_dir.plus_file(xml_file)) != OK) {
 		WARN_PRINT("Failed to copy '" + xml_file + "'.");
+	}
 
 	String pdb_file = assembly_name + ".pdb";
-	if (da->copy(src_dir.plus_file(pdb_file), dst_dir.plus_file(pdb_file)) != OK)
+	if (da->copy(src_dir.plus_file(pdb_file), dst_dir.plus_file(pdb_file)) != OK) {
 		WARN_PRINT("Failed to copy '" + pdb_file + "'.");
+	}
 
 	String assembly_file = assembly_name + ".dll";
 	if (da->copy(src_dir.plus_file(assembly_file), dst_dir.plus_file(assembly_file)) != OK) {
@@ -667,13 +681,15 @@ static bool try_get_cached_api_hash_for(const String &p_api_assemblies_dir, bool
 	String core_api_assembly_path = p_api_assemblies_dir.plus_file(CORE_API_ASSEMBLY_NAME ".dll");
 	String editor_api_assembly_path = p_api_assemblies_dir.plus_file(EDITOR_API_ASSEMBLY_NAME ".dll");
 
-	if (!FileAccess::exists(core_api_assembly_path) || !FileAccess::exists(editor_api_assembly_path))
+	if (!FileAccess::exists(core_api_assembly_path) || !FileAccess::exists(editor_api_assembly_path)) {
 		return false;
+	}
 
 	String cached_api_hash_path = p_api_assemblies_dir.plus_file("api_hash_cache.cfg");
 
-	if (!FileAccess::exists(cached_api_hash_path))
+	if (!FileAccess::exists(cached_api_hash_path)) {
 		return false;
+	}
 
 	Ref<ConfigFile> cfg;
 	cfg.instance();
@@ -766,8 +782,9 @@ String GDMono::update_api_assemblies_from_prebuilt(const String &p_config, const
 
 	// Note: Even if only one of the assemblies if missing or out of sync, we update both
 
-	if (!api_assemblies_out_of_sync && FileAccess::exists(core_assembly_path) && FileAccess::exists(editor_assembly_path))
+	if (!api_assemblies_out_of_sync && FileAccess::exists(core_assembly_path) && FileAccess::exists(editor_assembly_path)) {
 		return String(); // No update needed
+	}
 
 	print_verbose("Updating '" + p_config + "' API assemblies");
 
@@ -795,8 +812,9 @@ String GDMono::update_api_assemblies_from_prebuilt(const String &p_config, const
 #endif
 
 bool GDMono::_load_core_api_assembly(LoadedApiAssembly &r_loaded_api_assembly, const String &p_config, bool p_refonly) {
-	if (r_loaded_api_assembly.assembly)
+	if (r_loaded_api_assembly.assembly) {
 		return true;
+	}
 
 #ifdef TOOLS_ENABLED
 	// For the editor and the editor player we want to load it from a specific path to make sure we can keep it up to date
@@ -828,8 +846,9 @@ bool GDMono::_load_core_api_assembly(LoadedApiAssembly &r_loaded_api_assembly, c
 
 #ifdef TOOLS_ENABLED
 bool GDMono::_load_editor_api_assembly(LoadedApiAssembly &r_loaded_api_assembly, const String &p_config, bool p_refonly) {
-	if (r_loaded_api_assembly.assembly)
+	if (r_loaded_api_assembly.assembly) {
 		return true;
+	}
 
 	// For the editor and the editor player we want to load it from a specific path to make sure we can keep it up to date
 
@@ -859,30 +878,35 @@ bool GDMono::_load_editor_api_assembly(LoadedApiAssembly &r_loaded_api_assembly,
 bool GDMono::_try_load_api_assemblies(LoadedApiAssembly &r_core_api_assembly, LoadedApiAssembly &r_editor_api_assembly,
 		const String &p_config, bool p_refonly, CoreApiAssemblyLoadedCallback p_callback) {
 	if (!_load_core_api_assembly(r_core_api_assembly, p_config, p_refonly)) {
-		if (OS::get_singleton()->is_stdout_verbose())
+		if (OS::get_singleton()->is_stdout_verbose()) {
 			print_error("Mono: Failed to load Core API assembly");
+		}
 		return false;
 	}
 
 #ifdef TOOLS_ENABLED
 	if (!_load_editor_api_assembly(r_editor_api_assembly, p_config, p_refonly)) {
-		if (OS::get_singleton()->is_stdout_verbose())
+		if (OS::get_singleton()->is_stdout_verbose()) {
 			print_error("Mono: Failed to load Editor API assembly");
+		}
 		return false;
 	}
 
-	if (r_editor_api_assembly.out_of_sync)
+	if (r_editor_api_assembly.out_of_sync) {
 		return false;
+	}
 #endif
 
 	// Check if the core API assembly is out of sync only after trying to load the
 	// editor API assembly. Otherwise, if both assemblies are out of sync, we would
 	// only update the former as we won't know the latter also needs to be updated.
-	if (r_core_api_assembly.out_of_sync)
+	if (r_core_api_assembly.out_of_sync) {
 		return false;
+	}
 
-	if (p_callback)
+	if (p_callback) {
 		return p_callback();
+	}
 
 	return true;
 }
@@ -890,8 +914,9 @@ bool GDMono::_try_load_api_assemblies(LoadedApiAssembly &r_core_api_assembly, Lo
 bool GDMono::_on_core_api_assembly_loaded() {
 	GDMonoCache::update_godot_api_cache();
 
-	if (!GDMonoCache::cached_data.godot_api_cache_updated)
+	if (!GDMonoCache::cached_data.godot_api_cache_updated) {
 		return false;
+	}
 
 	get_singleton()->_install_trace_listener();
 
@@ -956,8 +981,9 @@ void GDMono::_load_api_assemblies() {
 
 #ifdef TOOLS_ENABLED
 bool GDMono::_load_tools_assemblies() {
-	if (tools_assembly && tools_project_editor_assembly)
+	if (tools_assembly && tools_project_editor_assembly) {
 		return true;
+	}
 
 	bool success = load_assembly(TOOLS_ASM_NAME, &tools_assembly) &&
 				   load_assembly(TOOLS_PROJECT_EDITOR_ASM_NAME, &tools_project_editor_assembly);
@@ -967,8 +993,9 @@ bool GDMono::_load_tools_assemblies() {
 #endif
 
 bool GDMono::_load_project_assembly() {
-	if (project_assembly)
+	if (project_assembly) {
 		return true;
+	}
 
 	String appname = ProjectSettings::get_singleton()->get("application/config/name");
 	String appname_safe = OS::get_singleton()->get_safe_dir_name(appname);
@@ -1020,8 +1047,9 @@ Error GDMono::_unload_scripts_domain() {
 
 	print_verbose("Mono: Finalizing scripts domain...");
 
-	if (mono_domain_get() != root_domain)
+	if (mono_domain_get() != root_domain) {
 		mono_domain_set(root_domain, true);
+	}
 
 	finalizing_scripts_domain = true;
 
@@ -1111,8 +1139,9 @@ Error GDMono::finalize_and_unload_domain(MonoDomain *p_domain) {
 
 	print_verbose("Mono: Unloading domain '" + domain_name + "'...");
 
-	if (mono_domain_get() == p_domain)
+	if (mono_domain_get() == p_domain) {
 		mono_domain_set(root_domain, true);
+	}
 
 	if (!mono_domain_finalize(p_domain, 2000)) {
 		ERR_PRINT("Mono: Domain finalization timeout.");
@@ -1138,10 +1167,11 @@ Error GDMono::finalize_and_unload_domain(MonoDomain *p_domain) {
 GDMonoClass *GDMono::get_class(MonoClass *p_raw_class) {
 	MonoImage *image = mono_class_get_image(p_raw_class);
 
-	if (image == corlib_assembly->get_image())
+	if (image == corlib_assembly->get_image()) {
 		return corlib_assembly->get_class(p_raw_class);
+	}
 
-	uint32_t domain_id = mono_domain_get_id(mono_domain_get());
+	int32_t domain_id = mono_domain_get_id(mono_domain_get());
 	HashMap<String, GDMonoAssembly *> &domain_assemblies = assemblies[domain_id];
 
 	const String *k = nullptr;
@@ -1149,9 +1179,9 @@ GDMonoClass *GDMono::get_class(MonoClass *p_raw_class) {
 		GDMonoAssembly *assembly = domain_assemblies.get(*k);
 		if (assembly->get_image() == image) {
 			GDMonoClass *klass = assembly->get_class(p_raw_class);
-
-			if (klass)
+			if (klass) {
 				return klass;
+			}
 		}
 	}
 
@@ -1160,24 +1190,26 @@ GDMonoClass *GDMono::get_class(MonoClass *p_raw_class) {
 
 GDMonoClass *GDMono::get_class(const StringName &p_namespace, const StringName &p_name) {
 	GDMonoClass *klass = corlib_assembly->get_class(p_namespace, p_name);
-	if (klass)
+	if (klass) {
 		return klass;
+	}
 
-	uint32_t domain_id = mono_domain_get_id(mono_domain_get());
+	int32_t domain_id = mono_domain_get_id(mono_domain_get());
 	HashMap<String, GDMonoAssembly *> &domain_assemblies = assemblies[domain_id];
 
 	const String *k = nullptr;
 	while ((k = domain_assemblies.next(k))) {
 		GDMonoAssembly *assembly = domain_assemblies.get(*k);
 		klass = assembly->get_class(p_namespace, p_name);
-		if (klass)
+		if (klass) {
 			return klass;
+		}
 	}
 
 	return nullptr;
 }
 
-void GDMono::_domain_assemblies_cleanup(uint32_t p_domain_id) {
+void GDMono::_domain_assemblies_cleanup(int32_t p_domain_id) {
 	HashMap<String, GDMonoAssembly *> &domain_assemblies = assemblies[p_domain_id];
 
 	const String *k = nullptr;
@@ -1195,8 +1227,9 @@ void GDMono::unhandled_exception_hook(MonoObject *p_exc, void *) {
 
 #ifdef DEBUG_ENABLED
 	GDMonoUtils::debug_send_unhandled_exception_error((MonoException *)p_exc);
-	if (EngineDebugger::is_active())
+	if (EngineDebugger::is_active()) {
 		EngineDebugger::get_singleton()->poll_events(false);
+	}
 #endif
 
 	exit(mono_environment_exitcode_get());
@@ -1271,7 +1304,7 @@ GDMono::~GDMono() {
 		// Leave the rest to 'mono_jit_cleanup'
 #endif
 
-		const uint32_t *k = nullptr;
+		const int32_t *k = nullptr;
 		while ((k = assemblies.next(k))) {
 			HashMap<String, GDMonoAssembly *> &domain_assemblies = assemblies.get(*k);
 
@@ -1295,8 +1328,9 @@ GDMono::~GDMono() {
 	gdmono::android::support::cleanup();
 #endif
 
-	if (gdmono_log)
+	if (gdmono_log) {
 		memdelete(gdmono_log);
+	}
 
 	singleton = nullptr;
 }
@@ -1313,37 +1347,44 @@ void _GodotSharp::detach_thread() {
 
 int32_t _GodotSharp::get_domain_id() {
 	MonoDomain *domain = mono_domain_get();
-	CRASH_COND(!domain); // User must check if runtime is initialized before calling this method
+	ERR_FAIL_NULL_V(domain, -1);
 	return mono_domain_get_id(domain);
 }
 
 int32_t _GodotSharp::get_scripts_domain_id() {
+	ERR_FAIL_NULL_V_MSG(GDMono::get_singleton(),
+			-1, "The Mono runtime is not initialized");
 	MonoDomain *domain = GDMono::get_singleton()->get_scripts_domain();
-	CRASH_COND(!domain); // User must check if scripts domain is loaded before calling this method
+	ERR_FAIL_NULL_V(domain, -1);
 	return mono_domain_get_id(domain);
 }
 
 bool _GodotSharp::is_scripts_domain_loaded() {
-	return GDMono::get_singleton()->is_runtime_initialized() && GDMono::get_singleton()->get_scripts_domain() != nullptr;
+	return GDMono::get_singleton() != nullptr &&
+		   GDMono::get_singleton()->is_runtime_initialized() &&
+		   GDMono::get_singleton()->get_scripts_domain() != nullptr;
 }
 
 bool _GodotSharp::_is_domain_finalizing_for_unload(int32_t p_domain_id) {
 	return is_domain_finalizing_for_unload(p_domain_id);
 }
 
-bool _GodotSharp::is_domain_finalizing_for_unload() {
-	return is_domain_finalizing_for_unload(mono_domain_get());
-}
-
 bool _GodotSharp::is_domain_finalizing_for_unload(int32_t p_domain_id) {
 	return is_domain_finalizing_for_unload(mono_domain_get_by_id(p_domain_id));
 }
 
 bool _GodotSharp::is_domain_finalizing_for_unload(MonoDomain *p_domain) {
-	if (!p_domain)
-		return true;
-	if (p_domain == GDMono::get_singleton()->get_scripts_domain() && GDMono::get_singleton()->is_finalizing_scripts_domain())
+	GDMono *gd_mono = GDMono::get_singleton();
+
+	ERR_FAIL_COND_V_MSG(!gd_mono || !gd_mono->is_runtime_initialized(),
+			false, "The Mono runtime is not initialized");
+
+	ERR_FAIL_NULL_V(p_domain, true);
+
+	if (p_domain == gd_mono->get_scripts_domain() && gd_mono->is_finalizing_scripts_domain()) {
 		return true;
+	}
+
 	return mono_domain_is_unloading(p_domain);
 }
 
@@ -1352,15 +1393,17 @@ bool _GodotSharp::is_runtime_shutting_down() {
 }
 
 bool _GodotSharp::is_runtime_initialized() {
-	return GDMono::get_singleton()->is_runtime_initialized();
+	return GDMono::get_singleton() != nullptr && GDMono::get_singleton()->is_runtime_initialized();
 }
 
 void _GodotSharp::_reload_assemblies(bool p_soft_reload) {
 #ifdef GD_MONO_HOT_RELOAD
+	CRASH_COND(CSharpLanguage::get_singleton() == nullptr);
 	// This method may be called more than once with `call_deferred`, so we need to check
 	// again if reloading is needed to avoid reloading multiple times unnecessarily.
-	if (CSharpLanguage::get_singleton()->is_assembly_reloading_needed())
+	if (CSharpLanguage::get_singleton()->is_assembly_reloading_needed()) {
 		CSharpLanguage::get_singleton()->reload_assemblies(p_soft_reload);
+	}
 #endif
 }
 

+ 13 - 14
modules/mono/mono_gd/gd_mono.h

@@ -97,7 +97,7 @@ private:
 	MonoDomain *root_domain;
 	MonoDomain *scripts_domain;
 
-	HashMap<uint32_t, HashMap<String, GDMonoAssembly *>> assemblies;
+	HashMap<int32_t, HashMap<String, GDMonoAssembly *>> assemblies;
 
 	GDMonoAssembly *corlib_assembly;
 	GDMonoAssembly *project_assembly;
@@ -141,7 +141,7 @@ private:
 	Error _unload_scripts_domain();
 #endif
 
-	void _domain_assemblies_cleanup(uint32_t p_domain_id);
+	void _domain_assemblies_cleanup(int32_t p_domain_id);
 
 	uint64_t api_core_hash;
 #ifdef TOOLS_ENABLED
@@ -165,14 +165,16 @@ protected:
 public:
 #ifdef DEBUG_METHODS_ENABLED
 	uint64_t get_api_core_hash() {
-		if (api_core_hash == 0)
+		if (api_core_hash == 0) {
 			api_core_hash = ClassDB::get_api_hash(ClassDB::API_CORE);
+		}
 		return api_core_hash;
 	}
 #ifdef TOOLS_ENABLED
 	uint64_t get_api_editor_hash() {
-		if (api_editor_hash == 0)
+		if (api_editor_hash == 0) {
 			api_editor_hash = ClassDB::get_api_hash(ClassDB::API_EDITOR);
+		}
 		return api_editor_hash;
 	}
 #endif // TOOLS_ENABLED
@@ -202,7 +204,7 @@ public:
 	UnhandledExceptionPolicy get_unhandled_exception_policy() const { return unhandled_exception_policy; }
 
 	// Do not use these, unless you know what you're doing
-	void add_assembly(uint32_t p_domain_id, GDMonoAssembly *p_assembly);
+	void add_assembly(int32_t p_domain_id, GDMonoAssembly *p_assembly);
 	GDMonoAssembly *get_loaded_assembly(const String &p_name);
 
 	_FORCE_INLINE_ bool is_runtime_initialized() const { return runtime_initialized && !mono_runtime_is_shutting_down() /* stays true after shutdown finished */; }
@@ -252,18 +254,18 @@ class ScopeDomain {
 
 public:
 	ScopeDomain(MonoDomain *p_domain) {
-		MonoDomain *prev_domain = mono_domain_get();
+		prev_domain = mono_domain_get();
 		if (prev_domain != p_domain) {
-			this->prev_domain = prev_domain;
 			mono_domain_set(p_domain, false);
 		} else {
-			this->prev_domain = nullptr;
+			prev_domain = nullptr;
 		}
 	}
 
 	~ScopeDomain() {
-		if (prev_domain)
+		if (prev_domain) {
 			mono_domain_set(prev_domain, false);
+		}
 	}
 };
 
@@ -276,8 +278,9 @@ public:
 	}
 
 	~ScopeExitDomainUnload() {
-		if (domain)
+		if (domain) {
 			GDMono::get_singleton()->finalize_and_unload_domain(domain);
+		}
 	}
 };
 
@@ -298,9 +301,6 @@ class _GodotSharp : public Object {
 
 	bool _is_domain_finalizing_for_unload(int32_t p_domain_id);
 
-	List<NodePath *> np_delete_queue;
-	List<RID *> rid_delete_queue;
-
 	void _reload_assemblies(bool p_soft_reload);
 
 protected:
@@ -318,7 +318,6 @@ public:
 
 	bool is_scripts_domain_loaded();
 
-	bool is_domain_finalizing_for_unload();
 	bool is_domain_finalizing_for_unload(int32_t p_domain_id);
 	bool is_domain_finalizing_for_unload(MonoDomain *p_domain);
 

+ 42 - 21
modules/mono/mono_gd/gd_mono_assembly.cpp

@@ -108,8 +108,9 @@ void GDMonoAssembly::assembly_load_hook(MonoAssembly *assembly, [[maybe_unused]]
 
 #ifdef GD_MONO_HOT_RELOAD
 	const char *path = mono_image_get_filename(image);
-	if (FileAccess::exists(path))
+	if (FileAccess::exists(path)) {
 		gdassembly->modified_time = FileAccess::get_modified_time(path);
+	}
 #endif
 
 	MonoDomain *domain = mono_domain_get();
@@ -137,8 +138,9 @@ MonoAssembly *GDMonoAssembly::_search_hook(MonoAssemblyName *aname, [[maybe_unus
 	bool has_extension = name.ends_with(".dll") || name.ends_with(".exe");
 
 	GDMonoAssembly *loaded_asm = GDMono::get_singleton()->get_loaded_assembly(has_extension ? name.get_basename() : name);
-	if (loaded_asm)
+	if (loaded_asm) {
 		return loaded_asm->get_assembly();
+	}
 
 	return nullptr;
 }
@@ -161,22 +163,25 @@ MonoAssembly *GDMonoAssembly::_load_assembly_search(const String &p_name, MonoAs
 			path = search_dir.plus_file(p_name);
 			if (FileAccess::exists(path)) {
 				res = _real_load_assembly_from(path, p_refonly, p_aname);
-				if (res != nullptr)
+				if (res != nullptr) {
 					return res;
+				}
 			}
 		} else {
 			path = search_dir.plus_file(p_name + ".dll");
 			if (FileAccess::exists(path)) {
 				res = _real_load_assembly_from(path, p_refonly, p_aname);
-				if (res != nullptr)
+				if (res != nullptr) {
 					return res;
+				}
 			}
 
 			path = search_dir.plus_file(p_name + ".exe");
 			if (FileAccess::exists(path)) {
 				res = _real_load_assembly_from(path, p_refonly, p_aname);
-				if (res != nullptr)
+				if (res != nullptr) {
 					return res;
+				}
 			}
 		}
 	}
@@ -194,16 +199,19 @@ String GDMonoAssembly::find_assembly(const String &p_name) {
 
 		if (has_extension) {
 			path = search_dir.plus_file(p_name);
-			if (FileAccess::exists(path))
+			if (FileAccess::exists(path)) {
 				return path;
+			}
 		} else {
 			path = search_dir.plus_file(p_name + ".dll");
-			if (FileAccess::exists(path))
+			if (FileAccess::exists(path)) {
 				return path;
+			}
 
 			path = search_dir.plus_file(p_name + ".exe");
-			if (FileAccess::exists(path))
+			if (FileAccess::exists(path)) {
 				return path;
+			}
 		}
 	}
 
@@ -279,8 +287,9 @@ MonoAssembly *GDMonoAssembly::_real_load_assembly_from(const String &p_path, boo
 	if (!FileAccess::exists(pdb_path)) {
 		pdb_path = p_path.get_basename() + ".pdb"; // without .dll
 
-		if (!FileAccess::exists(pdb_path))
+		if (!FileAccess::exists(pdb_path)) {
 			goto no_pdb;
+		}
 	}
 
 	pdb_data = FileAccess::get_file_as_array(pdb_path);
@@ -307,8 +316,9 @@ no_pdb:
 		String name = String::utf8(mono_assembly_name_get_name(mono_assembly_get_name(assembly)));
 		bool has_extension = name.ends_with(".dll") || name.ends_with(".exe");
 		GDMonoAssembly *loaded_asm = GDMono::get_singleton()->get_loaded_assembly(has_extension ? name.get_basename() : name);
-		if (!loaded_asm)
+		if (!loaded_asm) {
 			assembly_load_hook(assembly, nullptr);
+		}
 	}
 
 	// Decrement refcount which was previously incremented by mono_image_open_from_data_with_name
@@ -342,13 +352,15 @@ GDMonoClass *GDMonoAssembly::get_class(const StringName &p_namespace, const Stri
 
 	GDMonoClass **match = cached_classes.getptr(key);
 
-	if (match)
+	if (match) {
 		return *match;
+	}
 
 	MonoClass *mono_class = mono_class_from_name(image, String(p_namespace).utf8(), String(p_name).utf8());
 
-	if (!mono_class)
+	if (!mono_class) {
 		return nullptr;
+	}
 
 	GDMonoClass *wrapped_class = memnew(GDMonoClass(p_namespace, p_name, mono_class, this));
 
@@ -363,8 +375,9 @@ GDMonoClass *GDMonoAssembly::get_class(MonoClass *p_mono_class) {
 
 	Map<MonoClass *, GDMonoClass *>::Element *match = cached_raw.find(p_mono_class);
 
-	if (match)
+	if (match) {
 		return match->value();
+	}
 
 	StringName namespace_name = mono_class_get_namespace(p_mono_class);
 	StringName class_name = mono_class_get_name(p_mono_class);
@@ -383,8 +396,9 @@ GDMonoClass *GDMonoAssembly::get_object_derived_class(const StringName &p_class)
 	if (gdobject_class_cache_updated) {
 		Map<StringName, GDMonoClass *>::Element *result = gdobject_class_cache.find(p_class);
 
-		if (result)
+		if (result) {
 			match = result->get();
+		}
 	} else {
 		List<GDMonoClass *> nested_classes;
 
@@ -393,18 +407,21 @@ GDMonoClass *GDMonoAssembly::get_object_derived_class(const StringName &p_class)
 		for (int i = 1; i < rows; i++) {
 			MonoClass *mono_class = mono_class_get(image, (i + 1) | MONO_TOKEN_TYPE_DEF);
 
-			if (!mono_class_is_assignable_from(CACHED_CLASS_RAW(GodotObject), mono_class))
+			if (!mono_class_is_assignable_from(CACHED_CLASS_RAW(GodotObject), mono_class)) {
 				continue;
+			}
 
 			GDMonoClass *current = get_class(mono_class);
 
-			if (!current)
+			if (!current) {
 				continue;
+			}
 
 			nested_classes.push_back(current);
 
-			if (!match && current->get_name() == p_class)
+			if (!match && current->get_name() == p_class) {
 				match = current;
+			}
 
 			while (!nested_classes.empty()) {
 				GDMonoClass *current_nested = nested_classes.front()->get();
@@ -415,8 +432,9 @@ GDMonoClass *GDMonoAssembly::get_object_derived_class(const StringName &p_class)
 				while (true) {
 					MonoClass *raw_nested = mono_class_get_nested_types(current_nested->get_mono_ptr(), &iter);
 
-					if (!raw_nested)
+					if (!raw_nested) {
 						break;
+					}
 
 					GDMonoClass *nested_class = get_class(raw_nested);
 
@@ -437,8 +455,9 @@ GDMonoClass *GDMonoAssembly::get_object_derived_class(const StringName &p_class)
 }
 
 GDMonoAssembly *GDMonoAssembly::load(const String &p_name, MonoAssemblyName *p_aname, bool p_refonly, const Vector<String> &p_search_dirs) {
-	if (GDMono::get_singleton()->get_corlib_assembly() && (p_name == "mscorlib" || p_name == "mscorlib.dll"))
+	if (GDMono::get_singleton()->get_corlib_assembly() && (p_name == "mscorlib" || p_name == "mscorlib.dll")) {
 		return GDMono::get_singleton()->get_corlib_assembly();
+	}
 
 	// We need to manually call the search hook in this case, as it won't be called in the next step
 	MonoAssembly *assembly = mono_assembly_invoke_search_hook(p_aname);
@@ -456,8 +475,9 @@ GDMonoAssembly *GDMonoAssembly::load(const String &p_name, MonoAssemblyName *p_a
 }
 
 GDMonoAssembly *GDMonoAssembly::load_from(const String &p_name, const String &p_path, bool p_refonly) {
-	if (p_name == "mscorlib" || p_name == "mscorlib.dll")
+	if (p_name == "mscorlib" || p_name == "mscorlib.dll") {
 		return GDMono::get_singleton()->get_corlib_assembly();
+	}
 
 	// We need to manually call the search hook in this case, as it won't be called in the next step
 	MonoAssemblyName *aname = mono_assembly_name_new(p_name.utf8());
@@ -477,6 +497,7 @@ GDMonoAssembly *GDMonoAssembly::load_from(const String &p_name, const String &p_
 }
 
 GDMonoAssembly::~GDMonoAssembly() {
-	if (image)
+	if (image) {
 		unload();
+	}
 }

+ 1 - 1
modules/mono/mono_gd/gd_mono_cache.cpp

@@ -217,7 +217,7 @@ void update_corlib_cache() {
 	CACHE_METHOD_AND_CHECK(System_Diagnostics_StackTrace, ctor_Exception_bool, CACHED_CLASS(System_Diagnostics_StackTrace)->get_method_with_desc("System.Diagnostics.StackTrace:.ctor(System.Exception,bool)", true));
 #endif
 
-	CACHE_METHOD_THUNK_AND_CHECK(Delegate, Equals, GDMono::get_singleton()->get_corlib_assembly()->get_class("System", "Delegate")->get_method_with_desc("System.Delegate:Equals(object)", 1));
+	CACHE_METHOD_THUNK_AND_CHECK(Delegate, Equals, GDMono::get_singleton()->get_corlib_assembly()->get_class("System", "Delegate")->get_method_with_desc("System.Delegate:Equals(object)", true));
 
 	CACHE_CLASS_AND_CHECK(KeyNotFoundException, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Collections.Generic", "KeyNotFoundException"));
 

+ 46 - 23
modules/mono/mono_gd/gd_mono_class.cpp

@@ -81,15 +81,17 @@ bool GDMonoClass::is_assignable_from(GDMonoClass *p_from) const {
 
 StringName GDMonoClass::get_namespace() const {
 	GDMonoClass *nesting_class = get_nesting_class();
-	if (!nesting_class)
+	if (!nesting_class) {
 		return namespace_name;
+	}
 	return nesting_class->get_namespace();
 }
 
 String GDMonoClass::get_name_for_lookup() const {
 	GDMonoClass *nesting_class = get_nesting_class();
-	if (!nesting_class)
+	if (!nesting_class) {
 		return class_name;
+	}
 	return nesting_class->get_name_for_lookup() + "/" + class_name;
 }
 
@@ -131,11 +133,13 @@ bool GDMonoClass::has_attribute(GDMonoClass *p_attr_class) {
 	ERR_FAIL_NULL_V(p_attr_class, false);
 #endif
 
-	if (!attrs_fetched)
+	if (!attrs_fetched) {
 		fetch_attributes();
+	}
 
-	if (!attributes)
+	if (!attributes) {
 		return false;
+	}
 
 	return mono_custom_attrs_has_attr(attributes, p_attr_class->get_mono_ptr());
 }
@@ -145,11 +149,13 @@ MonoObject *GDMonoClass::get_attribute(GDMonoClass *p_attr_class) {
 	ERR_FAIL_NULL_V(p_attr_class, nullptr);
 #endif
 
-	if (!attrs_fetched)
+	if (!attrs_fetched) {
 		fetch_attributes();
+	}
 
-	if (!attributes)
+	if (!attributes) {
 		return nullptr;
+	}
 
 	return mono_custom_attrs_get_attr(attributes, p_attr_class->get_mono_ptr());
 }
@@ -164,8 +170,9 @@ void GDMonoClass::fetch_attributes() {
 void GDMonoClass::fetch_methods_with_godot_api_checks(GDMonoClass *p_native_base) {
 	CRASH_COND(!CACHED_CLASS(GodotObject)->is_assignable_from(this));
 
-	if (methods_fetched)
+	if (methods_fetched) {
 		return;
+	}
 
 	void *iter = nullptr;
 	MonoMethod *raw_method = nullptr;
@@ -202,8 +209,9 @@ void GDMonoClass::fetch_methods_with_godot_api_checks(GDMonoClass *p_native_base
 					break;
 				}
 
-				if (native_top == CACHED_CLASS(GodotObject))
+				if (native_top == CACHED_CLASS(GodotObject)) {
 					break;
+				}
 
 				native_top = native_top->get_parent_class();
 			}
@@ -212,8 +220,9 @@ void GDMonoClass::fetch_methods_with_godot_api_checks(GDMonoClass *p_native_base
 
 		uint32_t flags = mono_method_get_flags(method->mono_method, nullptr);
 
-		if (!(flags & MONO_METHOD_ATTR_VIRTUAL))
+		if (!(flags & MONO_METHOD_ATTR_VIRTUAL)) {
 			continue;
+		}
 
 		// Virtual method of Godot Object derived type, let's try to find GodotMethod attribute
 
@@ -235,15 +244,17 @@ void GDMonoClass::fetch_methods_with_godot_api_checks(GDMonoClass *p_native_base
 #endif
 				MethodKey key = MethodKey(godot_method_name, method->get_parameters_count());
 				GDMonoMethod **existing_method = methods.getptr(key);
-				if (existing_method)
+				if (existing_method) {
 					memdelete(*existing_method); // Must delete old one
+				}
 				methods.set(key, method);
 
 				break;
 			}
 
-			if (top == CACHED_CLASS(GodotObject))
+			if (top == CACHED_CLASS(GodotObject)) {
 				break;
+			}
 
 			top = top->get_parent_class();
 		}
@@ -258,8 +269,9 @@ GDMonoMethod *GDMonoClass::get_fetched_method_unknown_params(const StringName &p
 	const MethodKey *k = nullptr;
 
 	while ((k = methods.next(k))) {
-		if (k->name == p_name)
+		if (k->name == p_name) {
 			return methods.get(*k);
+		}
 	}
 
 	return nullptr;
@@ -283,11 +295,13 @@ GDMonoMethod *GDMonoClass::get_method(const StringName &p_name, int p_params_cou
 
 	GDMonoMethod **match = methods.getptr(key);
 
-	if (match)
+	if (match) {
 		return *match;
+	}
 
-	if (methods_fetched)
+	if (methods_fetched) {
 		return nullptr;
+	}
 
 	MonoMethod *raw_method = mono_class_get_method_from_name(mono_class, String(p_name).utf8().get_data(), p_params_count);
 
@@ -323,8 +337,9 @@ GDMonoMethod *GDMonoClass::get_method(MonoMethod *p_raw_method, const StringName
 
 	GDMonoMethod **match = methods.getptr(key);
 
-	if (match)
+	if (match) {
 		return *match;
+	}
 
 	GDMonoMethod *method = memnew(GDMonoMethod(p_name, p_raw_method));
 	methods.set(key, method);
@@ -337,8 +352,9 @@ GDMonoMethod *GDMonoClass::get_method_with_desc(const String &p_description, boo
 	MonoMethod *method = mono_method_desc_search_in_class(desc, mono_class);
 	mono_method_desc_free(desc);
 
-	if (!method)
+	if (!method) {
 		return nullptr;
+	}
 
 	ERR_FAIL_COND_V(mono_method_get_class(method) != mono_class, nullptr);
 
@@ -348,11 +364,13 @@ GDMonoMethod *GDMonoClass::get_method_with_desc(const String &p_description, boo
 GDMonoField *GDMonoClass::get_field(const StringName &p_name) {
 	Map<StringName, GDMonoField *>::Element *result = fields.find(p_name);
 
-	if (result)
+	if (result) {
 		return result->value();
+	}
 
-	if (fields_fetched)
+	if (fields_fetched) {
 		return nullptr;
+	}
 
 	MonoClassField *raw_field = mono_class_get_field_from_name(mono_class, String(p_name).utf8().get_data());
 
@@ -367,8 +385,9 @@ GDMonoField *GDMonoClass::get_field(const StringName &p_name) {
 }
 
 const Vector<GDMonoField *> &GDMonoClass::get_all_fields() {
-	if (fields_fetched)
+	if (fields_fetched) {
 		return fields_list;
+	}
 
 	void *iter = nullptr;
 	MonoClassField *raw_field = nullptr;
@@ -394,11 +413,13 @@ const Vector<GDMonoField *> &GDMonoClass::get_all_fields() {
 GDMonoProperty *GDMonoClass::get_property(const StringName &p_name) {
 	Map<StringName, GDMonoProperty *>::Element *result = properties.find(p_name);
 
-	if (result)
+	if (result) {
 		return result->value();
+	}
 
-	if (properties_fetched)
+	if (properties_fetched) {
 		return nullptr;
+	}
 
 	MonoProperty *raw_property = mono_class_get_property_from_name(mono_class, String(p_name).utf8().get_data());
 
@@ -413,8 +434,9 @@ GDMonoProperty *GDMonoClass::get_property(const StringName &p_name) {
 }
 
 const Vector<GDMonoProperty *> &GDMonoClass::get_all_properties() {
-	if (properties_fetched)
+	if (properties_fetched) {
 		return properties_list;
+	}
 
 	void *iter = nullptr;
 	MonoProperty *raw_property = nullptr;
@@ -438,8 +460,9 @@ const Vector<GDMonoProperty *> &GDMonoClass::get_all_properties() {
 }
 
 const Vector<GDMonoClass *> &GDMonoClass::get_all_delegates() {
-	if (delegates_fetched)
+	if (delegates_fetched) {
 		return delegates_list;
+	}
 
 	void *iter = nullptr;
 	MonoClass *raw_class = nullptr;

+ 8 - 4
modules/mono/mono_gd/gd_mono_field.cpp

@@ -597,11 +597,13 @@ String GDMonoField::get_string_value(MonoObject *p_object) {
 bool GDMonoField::has_attribute(GDMonoClass *p_attr_class) {
 	ERR_FAIL_NULL_V(p_attr_class, false);
 
-	if (!attrs_fetched)
+	if (!attrs_fetched) {
 		fetch_attributes();
+	}
 
-	if (!attributes)
+	if (!attributes) {
 		return false;
+	}
 
 	return mono_custom_attrs_has_attr(attributes, p_attr_class->get_mono_ptr());
 }
@@ -609,11 +611,13 @@ bool GDMonoField::has_attribute(GDMonoClass *p_attr_class) {
 MonoObject *GDMonoField::get_attribute(GDMonoClass *p_attr_class) {
 	ERR_FAIL_NULL_V(p_attr_class, nullptr);
 
-	if (!attrs_fetched)
+	if (!attrs_fetched) {
 		fetch_attributes();
+	}
 
-	if (!attributes)
+	if (!attributes) {
 		return nullptr;
+	}
 
 	return mono_custom_attrs_get_attr(attributes, p_attr_class->get_mono_ptr());
 }

+ 3 - 2
modules/mono/mono_gd/gd_mono_internals.cpp

@@ -122,9 +122,10 @@ void unhandled_exception(MonoException *p_exc) {
 		GD_UNREACHABLE();
 	} else {
 #ifdef DEBUG_ENABLED
-		GDMonoUtils::debug_send_unhandled_exception_error((MonoException *)p_exc);
-		if (EngineDebugger::is_active())
+		GDMonoUtils::debug_send_unhandled_exception_error(p_exc);
+		if (EngineDebugger::is_active()) {
 			EngineDebugger::get_singleton()->poll_events(false);
+		}
 #endif
 	}
 }

+ 6 - 3
modules/mono/mono_gd/gd_mono_log.cpp

@@ -55,8 +55,9 @@ static int get_log_level_id(const char *p_log_level) {
 
 	int i = 0;
 	while (valid_log_levels[i]) {
-		if (!strcmp(valid_log_levels[i], p_log_level))
+		if (!strcmp(valid_log_levels[i], p_log_level)) {
 			return i;
+		}
 		i++;
 	}
 
@@ -115,10 +116,12 @@ void GDMonoLog::_delete_old_log_files(const String &p_logs_dir) {
 
 	String current;
 	while ((current = da->get_next()).length()) {
-		if (da->current_is_dir())
+		if (da->current_is_dir()) {
 			continue;
-		if (!current.ends_with(".txt"))
+		}
+		if (!current.ends_with(".txt")) {
 			continue;
+		}
 
 		uint64_t modified_time = FileAccess::get_modified_time(da->get_current_dir().plus_file(current));
 

+ 184 - 125
modules/mono/mono_gd/gd_mono_marshal.cpp

@@ -72,92 +72,119 @@ Variant::Type managed_to_variant_type(const ManagedType &p_type, bool *r_nil_is_
 		case MONO_TYPE_VALUETYPE: {
 			GDMonoClass *vtclass = p_type.type_class;
 
-			if (vtclass == CACHED_CLASS(Vector2))
+			if (vtclass == CACHED_CLASS(Vector2)) {
 				return Variant::VECTOR2;
+			}
 
-			if (vtclass == CACHED_CLASS(Vector2i))
+			if (vtclass == CACHED_CLASS(Vector2i)) {
 				return Variant::VECTOR2I;
+			}
 
-			if (vtclass == CACHED_CLASS(Rect2))
+			if (vtclass == CACHED_CLASS(Rect2)) {
 				return Variant::RECT2;
+			}
 
-			if (vtclass == CACHED_CLASS(Rect2i))
+			if (vtclass == CACHED_CLASS(Rect2i)) {
 				return Variant::RECT2I;
+			}
 
-			if (vtclass == CACHED_CLASS(Transform2D))
+			if (vtclass == CACHED_CLASS(Transform2D)) {
 				return Variant::TRANSFORM2D;
+			}
 
-			if (vtclass == CACHED_CLASS(Vector3))
+			if (vtclass == CACHED_CLASS(Vector3)) {
 				return Variant::VECTOR3;
+			}
 
-			if (vtclass == CACHED_CLASS(Vector3i))
+			if (vtclass == CACHED_CLASS(Vector3i)) {
 				return Variant::VECTOR3I;
+			}
 
-			if (vtclass == CACHED_CLASS(Basis))
+			if (vtclass == CACHED_CLASS(Basis)) {
 				return Variant::BASIS;
+			}
 
-			if (vtclass == CACHED_CLASS(Quat))
+			if (vtclass == CACHED_CLASS(Quat)) {
 				return Variant::QUAT;
+			}
 
-			if (vtclass == CACHED_CLASS(Transform))
+			if (vtclass == CACHED_CLASS(Transform)) {
 				return Variant::TRANSFORM;
+			}
 
-			if (vtclass == CACHED_CLASS(AABB))
+			if (vtclass == CACHED_CLASS(AABB)) {
 				return Variant::AABB;
+			}
 
-			if (vtclass == CACHED_CLASS(Color))
+			if (vtclass == CACHED_CLASS(Color)) {
 				return Variant::COLOR;
+			}
 
-			if (vtclass == CACHED_CLASS(Plane))
+			if (vtclass == CACHED_CLASS(Plane)) {
 				return Variant::PLANE;
+			}
 
-			if (vtclass == CACHED_CLASS(Callable))
+			if (vtclass == CACHED_CLASS(Callable)) {
 				return Variant::CALLABLE;
+			}
 
-			if (vtclass == CACHED_CLASS(SignalInfo))
+			if (vtclass == CACHED_CLASS(SignalInfo)) {
 				return Variant::SIGNAL;
+			}
 
-			if (mono_class_is_enum(vtclass->get_mono_ptr()))
+			if (mono_class_is_enum(vtclass->get_mono_ptr())) {
 				return Variant::INT;
+			}
 		} break;
 
 		case MONO_TYPE_ARRAY:
 		case MONO_TYPE_SZARRAY: {
 			MonoArrayType *array_type = mono_type_get_array_type(p_type.type_class->get_mono_type());
 
-			if (array_type->eklass == CACHED_CLASS_RAW(MonoObject))
+			if (array_type->eklass == CACHED_CLASS_RAW(MonoObject)) {
 				return Variant::ARRAY;
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(uint8_t))
+			if (array_type->eklass == CACHED_CLASS_RAW(uint8_t)) {
 				return Variant::PACKED_BYTE_ARRAY;
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(int32_t))
+			if (array_type->eklass == CACHED_CLASS_RAW(int32_t)) {
 				return Variant::PACKED_INT32_ARRAY;
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(int64_t))
+			if (array_type->eklass == CACHED_CLASS_RAW(int64_t)) {
 				return Variant::PACKED_INT64_ARRAY;
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(float))
+			if (array_type->eklass == CACHED_CLASS_RAW(float)) {
 				return Variant::PACKED_FLOAT32_ARRAY;
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(double))
+			if (array_type->eklass == CACHED_CLASS_RAW(double)) {
 				return Variant::PACKED_FLOAT64_ARRAY;
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(String))
+			if (array_type->eklass == CACHED_CLASS_RAW(String)) {
 				return Variant::PACKED_STRING_ARRAY;
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(Vector2))
+			if (array_type->eklass == CACHED_CLASS_RAW(Vector2)) {
 				return Variant::PACKED_VECTOR2_ARRAY;
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(Vector3))
+			if (array_type->eklass == CACHED_CLASS_RAW(Vector3)) {
 				return Variant::PACKED_VECTOR3_ARRAY;
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(Color))
+			if (array_type->eklass == CACHED_CLASS_RAW(Color)) {
 				return Variant::PACKED_COLOR_ARRAY;
+			}
 
 			GDMonoClass *array_type_class = GDMono::get_singleton()->get_class(array_type->eklass);
-			if (CACHED_CLASS(GodotObject)->is_assignable_from(array_type_class))
+			if (CACHED_CLASS(GodotObject)->is_assignable_from(array_type_class)) {
 				return Variant::ARRAY;
+			}
 		} break;
 
 		case MONO_TYPE_CLASS: {
@@ -201,8 +228,9 @@ Variant::Type managed_to_variant_type(const ManagedType &p_type, bool *r_nil_is_
 		} break;
 
 		case MONO_TYPE_OBJECT: {
-			if (r_nil_is_variant)
+			if (r_nil_is_variant) {
 				*r_nil_is_variant = true;
+			}
 			return Variant::NIL;
 		} break;
 
@@ -244,8 +272,9 @@ Variant::Type managed_to_variant_type(const ManagedType &p_type, bool *r_nil_is_
 		} break;
 	}
 
-	if (r_nil_is_variant)
+	if (r_nil_is_variant) {
 		*r_nil_is_variant = false;
+	}
 
 	// Unknown
 	return Variant::NIL;
@@ -282,31 +311,6 @@ bool try_get_array_element_type(const ManagedType &p_array_type, ManagedType &r_
 	return false;
 }
 
-bool try_get_dictionary_key_value_types(const ManagedType &p_dictionary_type, ManagedType &r_key_type, ManagedType &r_value_type) {
-	switch (p_dictionary_type.type_encoding) {
-		case MONO_TYPE_GENERICINST: {
-			MonoReflectionType *dict_reftype = mono_type_get_object(mono_domain_get(), p_dictionary_type.type_class->get_mono_type());
-
-			if (GDMonoUtils::Marshal::type_is_generic_dictionary(dict_reftype) ||
-					GDMonoUtils::Marshal::type_is_system_generic_dictionary(dict_reftype) ||
-					GDMonoUtils::Marshal::type_is_generic_idictionary(dict_reftype)) {
-				MonoReflectionType *key_reftype;
-				MonoReflectionType *value_reftype;
-
-				GDMonoUtils::Marshal::dictionary_get_key_value_types(dict_reftype, &key_reftype, &value_reftype);
-
-				r_key_type = ManagedType::from_reftype(key_reftype);
-				r_value_type = ManagedType::from_reftype(value_reftype);
-				return true;
-			}
-		} break;
-		default: {
-		} break;
-	}
-
-	return false;
-}
-
 String mono_to_utf8_string(MonoString *p_mono_string) {
 	MonoError error;
 	char *utf8 = mono_string_to_utf8_checked(p_mono_string, &error);
@@ -328,8 +332,9 @@ String mono_to_utf16_string(MonoString *p_mono_string) {
 	int len = mono_string_length(p_mono_string);
 	String ret;
 
-	if (len == 0)
+	if (len == 0) {
 		return ret;
+	}
 
 	ret.resize(len + 1);
 	ret.set(len, 0);
@@ -409,8 +414,9 @@ MonoObject *variant_to_mono_object(const Variant *p_var, const ManagedType &p_ty
 		}
 
 		case MONO_TYPE_STRING: {
-			if (p_var->get_type() == Variant::NIL)
+			if (p_var->get_type() == Variant::NIL) {
 				return nullptr; // Otherwise, Variant -> String would return the string "Null"
+			}
 			return (MonoObject *)mono_string_from_godot(p_var->operator String());
 		} break;
 
@@ -547,39 +553,50 @@ MonoObject *variant_to_mono_object(const Variant *p_var, const ManagedType &p_ty
 		case MONO_TYPE_SZARRAY: {
 			MonoArrayType *array_type = mono_type_get_array_type(p_type.type_class->get_mono_type());
 
-			if (array_type->eklass == CACHED_CLASS_RAW(MonoObject))
+			if (array_type->eklass == CACHED_CLASS_RAW(MonoObject)) {
 				return (MonoObject *)Array_to_mono_array(p_var->operator Array());
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(uint8_t))
+			if (array_type->eklass == CACHED_CLASS_RAW(uint8_t)) {
 				return (MonoObject *)PackedByteArray_to_mono_array(p_var->operator PackedByteArray());
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(int32_t))
+			if (array_type->eklass == CACHED_CLASS_RAW(int32_t)) {
 				return (MonoObject *)PackedInt32Array_to_mono_array(p_var->operator PackedInt32Array());
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(int64_t))
+			if (array_type->eklass == CACHED_CLASS_RAW(int64_t)) {
 				return (MonoObject *)PackedInt64Array_to_mono_array(p_var->operator PackedInt64Array());
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(float))
+			if (array_type->eklass == CACHED_CLASS_RAW(float)) {
 				return (MonoObject *)PackedFloat32Array_to_mono_array(p_var->operator PackedFloat32Array());
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(double))
+			if (array_type->eklass == CACHED_CLASS_RAW(double)) {
 				return (MonoObject *)PackedFloat64Array_to_mono_array(p_var->operator PackedFloat64Array());
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(String))
+			if (array_type->eklass == CACHED_CLASS_RAW(String)) {
 				return (MonoObject *)PackedStringArray_to_mono_array(p_var->operator PackedStringArray());
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(Vector2))
+			if (array_type->eklass == CACHED_CLASS_RAW(Vector2)) {
 				return (MonoObject *)PackedVector2Array_to_mono_array(p_var->operator PackedVector2Array());
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(Vector3))
+			if (array_type->eklass == CACHED_CLASS_RAW(Vector3)) {
 				return (MonoObject *)PackedVector3Array_to_mono_array(p_var->operator PackedVector3Array());
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(Color))
+			if (array_type->eklass == CACHED_CLASS_RAW(Color)) {
 				return (MonoObject *)PackedColorArray_to_mono_array(p_var->operator PackedColorArray());
+			}
 
 			GDMonoClass *array_type_class = GDMono::get_singleton()->get_class(array_type->eklass);
-			if (CACHED_CLASS(GodotObject)->is_assignable_from(array_type_class))
+			if (CACHED_CLASS(GodotObject)->is_assignable_from(array_type_class)) {
 				return (MonoObject *)Array_to_mono_array(p_var->operator Array(), array_type_class);
+			}
 
 			ERR_FAIL_V_MSG(nullptr, "Attempted to convert Variant to a managed array of unmarshallable element type.");
 		} break;
@@ -820,100 +837,128 @@ Variant mono_object_to_variant_impl(MonoObject *p_obj, const ManagedType &p_type
 			return unbox<double>(p_obj);
 
 		case MONO_TYPE_STRING: {
-			if (p_obj == nullptr)
+			if (p_obj == nullptr) {
 				return Variant(); // NIL
+			}
 			return mono_string_to_godot_not_null((MonoString *)p_obj);
 		} break;
 
 		case MONO_TYPE_VALUETYPE: {
 			GDMonoClass *vtclass = p_type.type_class;
 
-			if (vtclass == CACHED_CLASS(Vector2))
+			if (vtclass == CACHED_CLASS(Vector2)) {
 				return MARSHALLED_IN(Vector2, unbox_addr<GDMonoMarshal::M_Vector2>(p_obj));
+			}
 
-			if (vtclass == CACHED_CLASS(Vector2i))
+			if (vtclass == CACHED_CLASS(Vector2i)) {
 				return MARSHALLED_IN(Vector2i, unbox_addr<GDMonoMarshal::M_Vector2i>(p_obj));
+			}
 
-			if (vtclass == CACHED_CLASS(Rect2))
+			if (vtclass == CACHED_CLASS(Rect2)) {
 				return MARSHALLED_IN(Rect2, unbox_addr<GDMonoMarshal::M_Rect2>(p_obj));
+			}
 
-			if (vtclass == CACHED_CLASS(Rect2i))
+			if (vtclass == CACHED_CLASS(Rect2i)) {
 				return MARSHALLED_IN(Rect2i, unbox_addr<GDMonoMarshal::M_Rect2i>(p_obj));
+			}
 
-			if (vtclass == CACHED_CLASS(Transform2D))
+			if (vtclass == CACHED_CLASS(Transform2D)) {
 				return MARSHALLED_IN(Transform2D, unbox_addr<GDMonoMarshal::M_Transform2D>(p_obj));
+			}
 
-			if (vtclass == CACHED_CLASS(Vector3))
+			if (vtclass == CACHED_CLASS(Vector3)) {
 				return MARSHALLED_IN(Vector3, unbox_addr<GDMonoMarshal::M_Vector3>(p_obj));
+			}
 
-			if (vtclass == CACHED_CLASS(Vector3i))
+			if (vtclass == CACHED_CLASS(Vector3i)) {
 				return MARSHALLED_IN(Vector3i, unbox_addr<GDMonoMarshal::M_Vector3i>(p_obj));
+			}
 
-			if (vtclass == CACHED_CLASS(Basis))
+			if (vtclass == CACHED_CLASS(Basis)) {
 				return MARSHALLED_IN(Basis, unbox_addr<GDMonoMarshal::M_Basis>(p_obj));
+			}
 
-			if (vtclass == CACHED_CLASS(Quat))
+			if (vtclass == CACHED_CLASS(Quat)) {
 				return MARSHALLED_IN(Quat, unbox_addr<GDMonoMarshal::M_Quat>(p_obj));
+			}
 
-			if (vtclass == CACHED_CLASS(Transform))
+			if (vtclass == CACHED_CLASS(Transform)) {
 				return MARSHALLED_IN(Transform, unbox_addr<GDMonoMarshal::M_Transform>(p_obj));
+			}
 
-			if (vtclass == CACHED_CLASS(AABB))
+			if (vtclass == CACHED_CLASS(AABB)) {
 				return MARSHALLED_IN(AABB, unbox_addr<GDMonoMarshal::M_AABB>(p_obj));
+			}
 
-			if (vtclass == CACHED_CLASS(Color))
+			if (vtclass == CACHED_CLASS(Color)) {
 				return MARSHALLED_IN(Color, unbox_addr<GDMonoMarshal::M_Color>(p_obj));
+			}
 
-			if (vtclass == CACHED_CLASS(Plane))
+			if (vtclass == CACHED_CLASS(Plane)) {
 				return MARSHALLED_IN(Plane, unbox_addr<GDMonoMarshal::M_Plane>(p_obj));
+			}
 
-			if (vtclass == CACHED_CLASS(Callable))
+			if (vtclass == CACHED_CLASS(Callable)) {
 				return managed_to_callable(unbox<GDMonoMarshal::M_Callable>(p_obj));
+			}
 
-			if (vtclass == CACHED_CLASS(SignalInfo))
+			if (vtclass == CACHED_CLASS(SignalInfo)) {
 				return managed_to_signal_info(unbox<GDMonoMarshal::M_SignalInfo>(p_obj));
+			}
 
-			if (mono_class_is_enum(vtclass->get_mono_ptr()))
+			if (mono_class_is_enum(vtclass->get_mono_ptr())) {
 				return unbox<int32_t>(p_obj);
+			}
 		} break;
 
 		case MONO_TYPE_ARRAY:
 		case MONO_TYPE_SZARRAY: {
 			MonoArrayType *array_type = mono_type_get_array_type(p_type.type_class->get_mono_type());
 
-			if (array_type->eklass == CACHED_CLASS_RAW(MonoObject))
+			if (array_type->eklass == CACHED_CLASS_RAW(MonoObject)) {
 				return mono_array_to_Array((MonoArray *)p_obj);
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(uint8_t))
+			if (array_type->eklass == CACHED_CLASS_RAW(uint8_t)) {
 				return mono_array_to_PackedByteArray((MonoArray *)p_obj);
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(int32_t))
+			if (array_type->eklass == CACHED_CLASS_RAW(int32_t)) {
 				return mono_array_to_PackedInt32Array((MonoArray *)p_obj);
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(int64_t))
+			if (array_type->eklass == CACHED_CLASS_RAW(int64_t)) {
 				return mono_array_to_PackedInt64Array((MonoArray *)p_obj);
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(float))
+			if (array_type->eklass == CACHED_CLASS_RAW(float)) {
 				return mono_array_to_PackedFloat32Array((MonoArray *)p_obj);
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(double))
+			if (array_type->eklass == CACHED_CLASS_RAW(double)) {
 				return mono_array_to_PackedFloat64Array((MonoArray *)p_obj);
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(String))
+			if (array_type->eklass == CACHED_CLASS_RAW(String)) {
 				return mono_array_to_PackedStringArray((MonoArray *)p_obj);
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(Vector2))
+			if (array_type->eklass == CACHED_CLASS_RAW(Vector2)) {
 				return mono_array_to_PackedVector2Array((MonoArray *)p_obj);
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(Vector3))
+			if (array_type->eklass == CACHED_CLASS_RAW(Vector3)) {
 				return mono_array_to_PackedVector3Array((MonoArray *)p_obj);
+			}
 
-			if (array_type->eklass == CACHED_CLASS_RAW(Color))
+			if (array_type->eklass == CACHED_CLASS_RAW(Color)) {
 				return mono_array_to_PackedColorArray((MonoArray *)p_obj);
+			}
 
 			GDMonoClass *array_type_class = GDMono::get_singleton()->get_class(array_type->eklass);
-			if (CACHED_CLASS(GodotObject)->is_assignable_from(array_type_class))
+			if (CACHED_CLASS(GodotObject)->is_assignable_from(array_type_class)) {
 				return mono_array_to_Array((MonoArray *)p_obj);
+			}
 
 			if (p_fail_with_err) {
 				ERR_FAIL_V_MSG(Variant(), "Attempted to convert a managed array of unmarshallable element type to Variant.");
@@ -1012,8 +1057,9 @@ Variant mono_object_to_variant_impl(MonoObject *p_obj, const ManagedType &p_type
 }
 
 Variant mono_object_to_variant(MonoObject *p_obj) {
-	if (!p_obj)
+	if (!p_obj) {
 		return Variant();
+	}
 
 	ManagedType type = ManagedType::from_class(mono_object_get_class(p_obj));
 
@@ -1021,15 +1067,17 @@ Variant mono_object_to_variant(MonoObject *p_obj) {
 }
 
 Variant mono_object_to_variant(MonoObject *p_obj, const ManagedType &p_type) {
-	if (!p_obj)
+	if (!p_obj) {
 		return Variant();
+	}
 
 	return mono_object_to_variant_impl(p_obj, p_type);
 }
 
 Variant mono_object_to_variant_no_err(MonoObject *p_obj, const ManagedType &p_type) {
-	if (!p_obj)
+	if (!p_obj) {
 		return Variant();
+	}
 
 	return mono_object_to_variant_impl(p_obj, p_type, /* fail_with_err: */ false);
 }
@@ -1044,8 +1092,9 @@ String mono_object_to_variant_string(MonoObject *p_obj, MonoException **r_exc) {
 		MonoString *mono_str = GDMonoUtils::object_to_string(p_obj, &exc);
 
 		if (exc) {
-			if (r_exc)
+			if (r_exc) {
 				*r_exc = exc;
+			}
 			return String();
 		}
 
@@ -1155,8 +1204,9 @@ MonoArray *Array_to_mono_array(const Array &p_array, GDMonoClass *p_array_type_c
 
 Array mono_array_to_Array(MonoArray *p_array) {
 	Array ret;
-	if (!p_array)
+	if (!p_array) {
 		return ret;
+	}
 	int length = mono_array_length(p_array);
 	ret.resize(length);
 
@@ -1174,7 +1224,7 @@ MonoArray *PackedInt32Array_to_mono_array(const PackedInt32Array &p_array) {
 
 	MonoArray *ret = mono_array_new(mono_domain_get(), CACHED_CLASS_RAW(int32_t), length);
 
-	int32_t *dst = (int32_t *)mono_array_addr(ret, int32_t, 0);
+	int32_t *dst = mono_array_addr(ret, int32_t, 0);
 	memcpy(dst, src, length);
 
 	return ret;
@@ -1182,13 +1232,14 @@ MonoArray *PackedInt32Array_to_mono_array(const PackedInt32Array &p_array) {
 
 PackedInt32Array mono_array_to_PackedInt32Array(MonoArray *p_array) {
 	PackedInt32Array ret;
-	if (!p_array)
+	if (!p_array) {
 		return ret;
+	}
 	int length = mono_array_length(p_array);
 	ret.resize(length);
 	int32_t *dst = ret.ptrw();
 
-	const int32_t *src = (const int32_t *)mono_array_addr(p_array, int32_t, 0);
+	const int32_t *src = mono_array_addr(p_array, int32_t, 0);
 	memcpy(dst, src, length);
 
 	return ret;
@@ -1200,7 +1251,7 @@ MonoArray *PackedInt64Array_to_mono_array(const PackedInt64Array &p_array) {
 
 	MonoArray *ret = mono_array_new(mono_domain_get(), CACHED_CLASS_RAW(int64_t), length);
 
-	int64_t *dst = (int64_t *)mono_array_addr(ret, int64_t, 0);
+	int64_t *dst = mono_array_addr(ret, int64_t, 0);
 	memcpy(dst, src, length);
 
 	return ret;
@@ -1208,13 +1259,14 @@ MonoArray *PackedInt64Array_to_mono_array(const PackedInt64Array &p_array) {
 
 PackedInt64Array mono_array_to_PackedInt64Array(MonoArray *p_array) {
 	PackedInt64Array ret;
-	if (!p_array)
+	if (!p_array) {
 		return ret;
+	}
 	int length = mono_array_length(p_array);
 	ret.resize(length);
 	int64_t *dst = ret.ptrw();
 
-	const int64_t *src = (const int64_t *)mono_array_addr(p_array, int64_t, 0);
+	const int64_t *src = mono_array_addr(p_array, int64_t, 0);
 	memcpy(dst, src, length);
 
 	return ret;
@@ -1226,7 +1278,7 @@ MonoArray *PackedByteArray_to_mono_array(const PackedByteArray &p_array) {
 
 	MonoArray *ret = mono_array_new(mono_domain_get(), CACHED_CLASS_RAW(uint8_t), length);
 
-	uint8_t *dst = (uint8_t *)mono_array_addr(ret, uint8_t, 0);
+	uint8_t *dst = mono_array_addr(ret, uint8_t, 0);
 	memcpy(dst, src, length);
 
 	return ret;
@@ -1234,13 +1286,14 @@ MonoArray *PackedByteArray_to_mono_array(const PackedByteArray &p_array) {
 
 PackedByteArray mono_array_to_PackedByteArray(MonoArray *p_array) {
 	PackedByteArray ret;
-	if (!p_array)
+	if (!p_array) {
 		return ret;
+	}
 	int length = mono_array_length(p_array);
 	ret.resize(length);
 	uint8_t *dst = ret.ptrw();
 
-	const uint8_t *src = (const uint8_t *)mono_array_addr(p_array, uint8_t, 0);
+	const uint8_t *src = mono_array_addr(p_array, uint8_t, 0);
 	memcpy(dst, src, length);
 
 	return ret;
@@ -1252,7 +1305,7 @@ MonoArray *PackedFloat32Array_to_mono_array(const PackedFloat32Array &p_array) {
 
 	MonoArray *ret = mono_array_new(mono_domain_get(), CACHED_CLASS_RAW(float), length);
 
-	float *dst = (float *)mono_array_addr(ret, float, 0);
+	float *dst = mono_array_addr(ret, float, 0);
 	memcpy(dst, src, length);
 
 	return ret;
@@ -1260,13 +1313,14 @@ MonoArray *PackedFloat32Array_to_mono_array(const PackedFloat32Array &p_array) {
 
 PackedFloat32Array mono_array_to_PackedFloat32Array(MonoArray *p_array) {
 	PackedFloat32Array ret;
-	if (!p_array)
+	if (!p_array) {
 		return ret;
+	}
 	int length = mono_array_length(p_array);
 	ret.resize(length);
 	float *dst = ret.ptrw();
 
-	const float *src = (const float *)mono_array_addr(p_array, float, 0);
+	const float *src = mono_array_addr(p_array, float, 0);
 	memcpy(dst, src, length);
 
 	return ret;
@@ -1278,7 +1332,7 @@ MonoArray *PackedFloat64Array_to_mono_array(const PackedFloat64Array &p_array) {
 
 	MonoArray *ret = mono_array_new(mono_domain_get(), CACHED_CLASS_RAW(double), length);
 
-	double *dst = (double *)mono_array_addr(ret, double, 0);
+	double *dst = mono_array_addr(ret, double, 0);
 	memcpy(dst, src, length);
 
 	return ret;
@@ -1286,13 +1340,14 @@ MonoArray *PackedFloat64Array_to_mono_array(const PackedFloat64Array &p_array) {
 
 PackedFloat64Array mono_array_to_PackedFloat64Array(MonoArray *p_array) {
 	PackedFloat64Array ret;
-	if (!p_array)
+	if (!p_array) {
 		return ret;
+	}
 	int length = mono_array_length(p_array);
 	ret.resize(length);
 	double *dst = ret.ptrw();
 
-	const double *src = (const double *)mono_array_addr(p_array, double, 0);
+	const double *src = mono_array_addr(p_array, double, 0);
 	memcpy(dst, src, length);
 
 	return ret;
@@ -1314,8 +1369,9 @@ MonoArray *PackedStringArray_to_mono_array(const PackedStringArray &p_array) {
 
 PackedStringArray mono_array_to_PackedStringArray(MonoArray *p_array) {
 	PackedStringArray ret;
-	if (!p_array)
+	if (!p_array) {
 		return ret;
+	}
 	int length = mono_array_length(p_array);
 	ret.resize(length);
 	String *w = ret.ptrw();
@@ -1335,7 +1391,7 @@ MonoArray *PackedColorArray_to_mono_array(const PackedColorArray &p_array) {
 	MonoArray *ret = mono_array_new(mono_domain_get(), CACHED_CLASS_RAW(Color), length);
 
 	if constexpr (InteropLayout::MATCHES_Color) {
-		Color *dst = (Color *)mono_array_addr(ret, Color, 0);
+		Color *dst = mono_array_addr(ret, Color, 0);
 		memcpy(dst, src, length);
 	} else {
 		for (int i = 0; i < length; i++) {
@@ -1349,14 +1405,15 @@ MonoArray *PackedColorArray_to_mono_array(const PackedColorArray &p_array) {
 
 PackedColorArray mono_array_to_PackedColorArray(MonoArray *p_array) {
 	PackedColorArray ret;
-	if (!p_array)
+	if (!p_array) {
 		return ret;
+	}
 	int length = mono_array_length(p_array);
 	ret.resize(length);
 	Color *dst = ret.ptrw();
 
 	if constexpr (InteropLayout::MATCHES_Color) {
-		const Color *src = (const Color *)mono_array_addr(p_array, Color, 0);
+		const Color *src = mono_array_addr(p_array, Color, 0);
 		memcpy(dst, src, length);
 	} else {
 		for (int i = 0; i < length; i++) {
@@ -1374,7 +1431,7 @@ MonoArray *PackedVector2Array_to_mono_array(const PackedVector2Array &p_array) {
 	MonoArray *ret = mono_array_new(mono_domain_get(), CACHED_CLASS_RAW(Vector2), length);
 
 	if constexpr (InteropLayout::MATCHES_Vector2) {
-		Vector2 *dst = (Vector2 *)mono_array_addr(ret, Vector2, 0);
+		Vector2 *dst = mono_array_addr(ret, Vector2, 0);
 		memcpy(dst, src, length);
 	} else {
 		for (int i = 0; i < length; i++) {
@@ -1388,14 +1445,15 @@ MonoArray *PackedVector2Array_to_mono_array(const PackedVector2Array &p_array) {
 
 PackedVector2Array mono_array_to_PackedVector2Array(MonoArray *p_array) {
 	PackedVector2Array ret;
-	if (!p_array)
+	if (!p_array) {
 		return ret;
+	}
 	int length = mono_array_length(p_array);
 	ret.resize(length);
 	Vector2 *dst = ret.ptrw();
 
 	if constexpr (InteropLayout::MATCHES_Vector2) {
-		const Vector2 *src = (const Vector2 *)mono_array_addr(p_array, Vector2, 0);
+		const Vector2 *src = mono_array_addr(p_array, Vector2, 0);
 		memcpy(dst, src, length);
 	} else {
 		for (int i = 0; i < length; i++) {
@@ -1413,7 +1471,7 @@ MonoArray *PackedVector3Array_to_mono_array(const PackedVector3Array &p_array) {
 	MonoArray *ret = mono_array_new(mono_domain_get(), CACHED_CLASS_RAW(Vector3), length);
 
 	if constexpr (InteropLayout::MATCHES_Vector3) {
-		Vector3 *dst = (Vector3 *)mono_array_addr(ret, Vector3, 0);
+		Vector3 *dst = mono_array_addr(ret, Vector3, 0);
 		memcpy(dst, src, length);
 	} else {
 		for (int i = 0; i < length; i++) {
@@ -1427,14 +1485,15 @@ MonoArray *PackedVector3Array_to_mono_array(const PackedVector3Array &p_array) {
 
 PackedVector3Array mono_array_to_PackedVector3Array(MonoArray *p_array) {
 	PackedVector3Array ret;
-	if (!p_array)
+	if (!p_array) {
 		return ret;
+	}
 	int length = mono_array_length(p_array);
 	ret.resize(length);
 	Vector3 *dst = ret.ptrw();
 
 	if constexpr (InteropLayout::MATCHES_Vector3) {
-		const Vector3 *src = (const Vector3 *)mono_array_addr(p_array, Vector3, 0);
+		const Vector3 *src = mono_array_addr(p_array, Vector3, 0);
 		memcpy(dst, src, length);
 	} else {
 		for (int i = 0; i < length; i++) {

+ 6 - 4
modules/mono/mono_gd/gd_mono_marshal.h

@@ -66,7 +66,6 @@ T *unbox_addr(MonoObject *p_obj) {
 Variant::Type managed_to_variant_type(const ManagedType &p_type, bool *r_nil_is_variant = nullptr);
 
 bool try_get_array_element_type(const ManagedType &p_array_type, ManagedType &r_elem_type);
-bool try_get_dictionary_key_value_types(const ManagedType &p_dictionary_type, ManagedType &r_key_type, ManagedType &r_value_type);
 
 // String
 
@@ -74,15 +73,17 @@ String mono_to_utf8_string(MonoString *p_mono_string);
 String mono_to_utf16_string(MonoString *p_mono_string);
 
 _FORCE_INLINE_ String mono_string_to_godot_not_null(MonoString *p_mono_string) {
-	if (sizeof(CharType) == 2)
+	if constexpr (sizeof(CharType) == 2) {
 		return mono_to_utf16_string(p_mono_string);
+	}
 
 	return mono_to_utf8_string(p_mono_string);
 }
 
 _FORCE_INLINE_ String mono_string_to_godot(MonoString *p_mono_string) {
-	if (p_mono_string == nullptr)
+	if (p_mono_string == nullptr) {
 		return String();
+	}
 
 	return mono_string_to_godot_not_null(p_mono_string);
 }
@@ -96,8 +97,9 @@ _FORCE_INLINE_ MonoString *mono_from_utf16_string(const String &p_string) {
 }
 
 _FORCE_INLINE_ MonoString *mono_string_from_godot(const String &p_string) {
-	if (sizeof(CharType) == 2)
+	if constexpr (sizeof(CharType) == 2) {
 		return mono_from_utf16_string(p_string);
+	}
 
 	return mono_from_utf8_string(p_string);
 }

+ 12 - 6
modules/mono/mono_gd/gd_mono_method.cpp

@@ -155,11 +155,13 @@ MonoObject *GDMonoMethod::invoke_raw(MonoObject *p_object, void **p_params, Mono
 bool GDMonoMethod::has_attribute(GDMonoClass *p_attr_class) {
 	ERR_FAIL_NULL_V(p_attr_class, false);
 
-	if (!attrs_fetched)
+	if (!attrs_fetched) {
 		fetch_attributes();
+	}
 
-	if (!attributes)
+	if (!attributes) {
 		return false;
+	}
 
 	return mono_custom_attrs_has_attr(attributes, p_attr_class->get_mono_ptr());
 }
@@ -167,11 +169,13 @@ bool GDMonoMethod::has_attribute(GDMonoClass *p_attr_class) {
 MonoObject *GDMonoMethod::get_attribute(GDMonoClass *p_attr_class) {
 	ERR_FAIL_NULL_V(p_attr_class, nullptr);
 
-	if (!attrs_fetched)
+	if (!attrs_fetched) {
 		fetch_attributes();
+	}
 
-	if (!attributes)
+	if (!attributes) {
 		return nullptr;
+	}
 
 	return mono_custom_attrs_get_attr(attributes, p_attr_class->get_mono_ptr());
 }
@@ -250,8 +254,9 @@ const MethodInfo &GDMonoMethod::get_method_info() {
 
 		bool nil_is_variant = false;
 		method_info.return_val = PropertyInfo(GDMonoMarshal::managed_to_variant_type(return_type, &nil_is_variant), "");
-		if (method_info.return_val.type == Variant::NIL && nil_is_variant)
+		if (method_info.return_val.type == Variant::NIL && nil_is_variant) {
 			method_info.return_val.usage |= PROPERTY_USAGE_NIL_IS_VARIANT;
+		}
 
 		Vector<StringName> names;
 		get_parameter_names(names);
@@ -259,8 +264,9 @@ const MethodInfo &GDMonoMethod::get_method_info() {
 		for (int i = 0; i < params_count; ++i) {
 			nil_is_variant = false;
 			PropertyInfo arg_info = PropertyInfo(GDMonoMarshal::managed_to_variant_type(param_types[i], &nil_is_variant), names[i]);
-			if (arg_info.type == Variant::NIL && nil_is_variant)
+			if (arg_info.type == Variant::NIL && nil_is_variant) {
 				arg_info.usage |= PROPERTY_USAGE_NIL_IS_VARIANT;
+			}
 
 			method_info.arguments.push_back(arg_info);
 		}

+ 12 - 6
modules/mono/mono_gd/gd_mono_property.cpp

@@ -77,15 +77,17 @@ GDMonoProperty::~GDMonoProperty() {
 
 bool GDMonoProperty::is_static() {
 	MonoMethod *prop_method = mono_property_get_get_method(mono_property);
-	if (prop_method == nullptr)
+	if (prop_method == nullptr) {
 		prop_method = mono_property_get_set_method(mono_property);
+	}
 	return mono_method_get_flags(prop_method, nullptr) & MONO_METHOD_ATTR_STATIC;
 }
 
 IMonoClassMember::Visibility GDMonoProperty::get_visibility() {
 	MonoMethod *prop_method = mono_property_get_get_method(mono_property);
-	if (prop_method == nullptr)
+	if (prop_method == nullptr) {
 		prop_method = mono_property_get_set_method(mono_property);
+	}
 
 	switch (mono_method_get_flags(prop_method, nullptr) & MONO_METHOD_ATTR_ACCESS_MASK) {
 		case MONO_METHOD_ATTR_PRIVATE:
@@ -106,11 +108,13 @@ IMonoClassMember::Visibility GDMonoProperty::get_visibility() {
 bool GDMonoProperty::has_attribute(GDMonoClass *p_attr_class) {
 	ERR_FAIL_NULL_V(p_attr_class, false);
 
-	if (!attrs_fetched)
+	if (!attrs_fetched) {
 		fetch_attributes();
+	}
 
-	if (!attributes)
+	if (!attributes) {
 		return false;
+	}
 
 	return mono_custom_attrs_has_attr(attributes, p_attr_class->get_mono_ptr());
 }
@@ -118,11 +122,13 @@ bool GDMonoProperty::has_attribute(GDMonoClass *p_attr_class) {
 MonoObject *GDMonoProperty::get_attribute(GDMonoClass *p_attr_class) {
 	ERR_FAIL_NULL_V(p_attr_class, nullptr);
 
-	if (!attrs_fetched)
+	if (!attrs_fetched) {
 		fetch_attributes();
+	}
 
-	if (!attributes)
+	if (!attributes) {
 		return nullptr;
+	}
 
 	return mono_custom_attrs_get_attr(attributes, p_attr_class->get_mono_ptr());
 }

+ 17 - 18
modules/mono/mono_gd/gd_mono_utils.cpp

@@ -38,7 +38,6 @@
 #include "core/os/dir_access.h"
 #include "core/os/mutex.h"
 #include "core/os/os.h"
-#include "core/project_settings.h"
 #include "core/reference.h"
 
 #ifdef TOOLS_ENABLED
@@ -51,13 +50,13 @@
 #include "gd_mono_cache.h"
 #include "gd_mono_class.h"
 #include "gd_mono_marshal.h"
-#include "gd_mono_method_thunk.h"
 
 namespace GDMonoUtils {
 
 MonoObject *unmanaged_get_managed(Object *unmanaged) {
-	if (!unmanaged)
+	if (!unmanaged) {
 		return nullptr;
+	}
 
 	if (unmanaged->get_script_instance()) {
 		CSharpInstance *cs_instance = CAST_CSHARP_INSTANCE(unmanaged->get_script_instance());
@@ -90,8 +89,9 @@ MonoObject *unmanaged_get_managed(Object *unmanaged) {
 
 	MonoObject *target = gchandle.get_target();
 
-	if (target)
+	if (target) {
 		return target;
+	}
 
 	CSharpLanguage::get_singleton()->release_script_gchandle(gchandle);
 
@@ -196,8 +196,9 @@ GDMonoClass *get_object_class(MonoObject *p_object) {
 GDMonoClass *type_get_proxy_class(const StringName &p_type) {
 	String class_name = p_type;
 
-	if (class_name[0] == '_')
+	if (class_name[0] == '_') {
 		class_name = class_name.substr(1, class_name.length());
+	}
 
 	GDMonoClass *klass = GDMono::get_singleton()->get_core_api_assembly()->get_class(BINDINGS_NAMESPACE, class_name);
 
@@ -220,11 +221,14 @@ GDMonoClass *get_class_native_base(GDMonoClass *p_class) {
 
 	do {
 		const GDMonoAssembly *assembly = klass->get_assembly();
-		if (assembly == GDMono::get_singleton()->get_core_api_assembly())
+
+		if (assembly == GDMono::get_singleton()->get_core_api_assembly()) {
 			return klass;
+		}
 #ifdef TOOLS_ENABLED
-		if (assembly == GDMono::get_singleton()->get_editor_api_assembly())
+		if (assembly == GDMono::get_singleton()->get_editor_api_assembly()) {
 			return klass;
+		}
 #endif
 	} while ((klass = klass->get_parent_class()) != nullptr);
 
@@ -385,14 +389,6 @@ String get_exception_name_and_message(MonoException *p_exc) {
 	return res;
 }
 
-void set_exception_message(MonoException *p_exc, String message) {
-	MonoClass *klass = mono_object_get_class((MonoObject *)p_exc);
-	MonoProperty *prop = mono_class_get_property_from_name(klass, "Message");
-	MonoString *msg = GDMonoMarshal::mono_string_from_godot(message);
-	void *params[1] = { msg };
-	property_set_value(prop, (MonoObject *)p_exc, params, nullptr);
-}
-
 void debug_print_unhandled_exception(MonoException *p_exc) {
 	print_unhandled_exception(p_exc);
 	debug_send_unhandled_exception_error(p_exc);
@@ -410,8 +406,9 @@ void debug_send_unhandled_exception_error(MonoException *p_exc) {
 	}
 
 	static thread_local bool _recursion_flag_ = false;
-	if (_recursion_flag_)
+	if (_recursion_flag_) {
 		return;
+	}
 	_recursion_flag_ = true;
 	SCOPE_EXIT { _recursion_flag_ = false; };
 
@@ -441,8 +438,9 @@ void debug_send_unhandled_exception_error(MonoException *p_exc) {
 		Vector<ScriptLanguage::StackInfo> _si;
 		if (stack_trace != nullptr) {
 			_si = CSharpLanguage::get_singleton()->stack_trace_get_info(stack_trace);
-			for (int i = _si.size() - 1; i >= 0; i--)
+			for (int i = _si.size() - 1; i >= 0; i--) {
 				si.insert(0, _si[i]);
+			}
 		}
 
 		exc_msg += (exc_msg.length() > 0 ? " ---> " : "") + GDMonoUtils::get_exception_name_and_message(p_exc);
@@ -452,8 +450,9 @@ void debug_send_unhandled_exception_error(MonoException *p_exc) {
 		CRASH_COND(inner_exc_prop == nullptr);
 
 		MonoObject *inner_exc = inner_exc_prop->get_value((MonoObject *)p_exc);
-		if (inner_exc != nullptr)
+		if (inner_exc != nullptr) {
 			si.insert(0, separator);
+		}
 
 		p_exc = (MonoException *)inner_exc;
 	}

+ 0 - 5
modules/mono/mono_gd/gd_mono_utils.h

@@ -84,10 +84,6 @@ void detach_current_thread(MonoThread *p_mono_thread);
 MonoThread *get_current_thread();
 bool is_thread_attached();
 
-_FORCE_INLINE_ bool is_main_thread() {
-	return mono_domain_get() != nullptr && mono_thread_get_main() == mono_thread_current();
-}
-
 uint32_t new_strong_gchandle(MonoObject *p_object);
 uint32_t new_strong_gchandle_pinned(MonoObject *p_object);
 uint32_t new_weak_gchandle(MonoObject *p_object);
@@ -115,7 +111,6 @@ String get_type_desc(MonoType *p_type);
 String get_type_desc(MonoReflectionType *p_reftype);
 
 String get_exception_name_and_message(MonoException *p_exc);
-void set_exception_message(MonoException *p_exc, String message);
 
 void debug_print_unhandled_exception(MonoException *p_exc);
 void debug_send_unhandled_exception_error(MonoException *p_exc);

+ 4 - 2
modules/mono/register_types.cpp

@@ -62,8 +62,9 @@ void register_mono_types() {
 void unregister_mono_types() {
 	ScriptServer::unregister_language(script_language_cs);
 
-	if (script_language_cs)
+	if (script_language_cs) {
 		memdelete(script_language_cs);
+	}
 
 	ResourceLoader::remove_resource_format_loader(resource_loader_cs);
 	resource_loader_cs.unref();
@@ -71,6 +72,7 @@ void unregister_mono_types() {
 	ResourceSaver::remove_resource_format_saver(resource_saver_cs);
 	resource_saver_cs.unref();
 
-	if (_godotsharp)
+	if (_godotsharp) {
 		memdelete(_godotsharp);
+	}
 }

+ 12 - 6
modules/mono/signal_awaiter_utils.cpp

@@ -51,18 +51,21 @@ bool SignalAwaiterCallable::compare_equal(const CallableCustom *p_a, const Calla
 	const SignalAwaiterCallable *a = static_cast<const SignalAwaiterCallable *>(p_a);
 	const SignalAwaiterCallable *b = static_cast<const SignalAwaiterCallable *>(p_b);
 
-	if (a->target_id != b->target_id)
+	if (a->target_id != b->target_id) {
 		return false;
+	}
 
-	if (a->signal != b->signal)
+	if (a->signal != b->signal) {
 		return false;
+	}
 
 	return true;
 }
 
 bool SignalAwaiterCallable::compare_less(const CallableCustom *p_a, const CallableCustom *p_b) {
-	if (compare_equal(p_a, p_b))
+	if (compare_equal(p_a, p_b)) {
 		return false;
+	}
 	return p_a < p_b;
 }
 
@@ -145,18 +148,21 @@ bool EventSignalCallable::compare_equal(const CallableCustom *p_a, const Callabl
 	const EventSignalCallable *a = static_cast<const EventSignalCallable *>(p_a);
 	const EventSignalCallable *b = static_cast<const EventSignalCallable *>(p_b);
 
-	if (a->owner != b->owner)
+	if (a->owner != b->owner) {
 		return false;
+	}
 
-	if (a->event_signal != b->event_signal)
+	if (a->event_signal != b->event_signal) {
 		return false;
+	}
 
 	return true;
 }
 
 bool EventSignalCallable::compare_less(const CallableCustom *p_a, const CallableCustom *p_b) {
-	if (compare_equal(p_a, p_b))
+	if (compare_equal(p_a, p_b)) {
 		return false;
+	}
 	return p_a < p_b;
 }
 

+ 12 - 34
modules/mono/utils/path_utils.cpp

@@ -50,34 +50,6 @@
 
 namespace path {
 
-String find_executable(const String &p_name) {
-#ifdef WINDOWS_ENABLED
-	Vector<String> exts = OS::get_singleton()->get_environment("PATHEXT").split(ENV_PATH_SEP, false);
-#endif
-	Vector<String> env_path = OS::get_singleton()->get_environment("PATH").split(ENV_PATH_SEP, false);
-
-	if (env_path.empty())
-		return String();
-
-	for (int i = 0; i < env_path.size(); i++) {
-		String p = path::join(env_path[i], p_name);
-
-#ifdef WINDOWS_ENABLED
-		for (int j = 0; j < exts.size(); j++) {
-			String p2 = p + exts[j].to_lower(); // lowercase to reduce risk of case mismatch warning
-
-			if (FileAccess::exists(p2))
-				return p2;
-		}
-#else
-		if (FileAccess::exists(p))
-			return p;
-#endif
-	}
-
-	return String();
-}
-
 String cwd() {
 #ifdef WINDOWS_ENABLED
 	const DWORD expected_size = ::GetCurrentDirectoryW(0, nullptr);
@@ -90,12 +62,14 @@ String cwd() {
 	return buffer.simplify_path();
 #else
 	char buffer[PATH_MAX];
-	if (::getcwd(buffer, sizeof(buffer)) == nullptr)
+	if (::getcwd(buffer, sizeof(buffer)) == nullptr) {
 		return ".";
+	}
 
 	String result;
-	if (result.parse_utf8(buffer))
+	if (result.parse_utf8(buffer)) {
 		return ".";
+	}
 
 	return result.simplify_path();
 #endif
@@ -135,23 +109,26 @@ String realpath(const String &p_path) {
 #elif UNIX_ENABLED
 	char *resolved_path = ::realpath(p_path.utf8().get_data(), nullptr);
 
-	if (!resolved_path)
+	if (!resolved_path) {
 		return p_path;
+	}
 
 	String result;
 	bool parse_ok = result.parse_utf8(resolved_path);
 	::free(resolved_path);
 
-	if (parse_ok)
+	if (parse_ok) {
 		return p_path;
+	}
 
 	return result.simplify_path();
 #endif
 }
 
 String join(const String &p_a, const String &p_b) {
-	if (p_a.empty())
+	if (p_a.empty()) {
 		return p_b;
+	}
 
 	const CharType a_last = p_a[p_a.length() - 1];
 	if ((a_last == '/' || a_last == '\\') ||
@@ -178,8 +155,9 @@ String relative_to_impl(const String &p_path, const String &p_relative_to) {
 	} else {
 		String base_dir = p_relative_to.get_base_dir();
 
-		if (base_dir.length() <= 2 && (base_dir.empty() || base_dir.ends_with(":")))
+		if (base_dir.length() <= 2 && (base_dir.empty() || base_dir.ends_with(":"))) {
 			return p_path;
+		}
 
 		return String("..").plus_file(relative_to_impl(p_path, base_dir));
 	}

+ 0 - 2
modules/mono/utils/path_utils.h

@@ -40,8 +40,6 @@ String join(const String &p_a, const String &p_b);
 String join(const String &p_a, const String &p_b, const String &p_c);
 String join(const String &p_a, const String &p_b, const String &p_c, const String &p_d);
 
-String find_executable(const String &p_name);
-
 /// Returns a normalized absolute path to the current working directory
 String cwd();
 

+ 8 - 4
modules/mono/utils/string_utils.cpp

@@ -38,14 +38,16 @@
 namespace {
 
 int sfind(const String &p_text, int p_from) {
-	if (p_from < 0)
+	if (p_from < 0) {
 		return -1;
+	}
 
 	int src_len = 2;
 	int len = p_text.length();
 
-	if (len == 0)
+	if (len == 0) {
 		return -1;
+	}
 
 	const CharType *src = p_text.c_str();
 
@@ -75,8 +77,9 @@ int sfind(const String &p_text, int p_from) {
 			}
 		}
 
-		if (found)
+		if (found) {
 			return i;
+		}
 	}
 
 	return -1;
@@ -85,8 +88,9 @@ int sfind(const String &p_text, int p_from) {
 } // namespace
 
 String sformat(const String &p_text, const Variant &p1, const Variant &p2, const Variant &p3, const Variant &p4, const Variant &p5) {
-	if (p_text.length() < 2)
+	if (p_text.length() < 2) {
 		return p_text;
+	}
 
 	Array args;