Prechádzať zdrojové kódy

Replace call to 'mono_runtime_object_init' with manual ctor invoking

Ignacio Etcheverry 6 rokov pred
rodič
commit
66b930a266

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

@@ -162,7 +162,7 @@ MonoObject *godot_icall_Dictionary_GetValue(Dictionary *ptr, MonoObject *key) {
 #ifdef DEBUG_ENABLED
 		CRASH_COND(!exc);
 #endif
-		GDMonoUtils::runtime_object_init(exc);
+		GDMonoUtils::runtime_object_init(exc, CACHED_CLASS(KeyNotFoundException));
 		GDMonoUtils::set_pending_exception((MonoException *)exc);
 		return NULL;
 	}
@@ -176,7 +176,7 @@ MonoObject *godot_icall_Dictionary_GetValue_Generic(Dictionary *ptr, MonoObject
 #ifdef DEBUG_ENABLED
 		CRASH_COND(!exc);
 #endif
-		GDMonoUtils::runtime_object_init(exc);
+		GDMonoUtils::runtime_object_init(exc, CACHED_CLASS(KeyNotFoundException));
 		GDMonoUtils::set_pending_exception((MonoException *)exc);
 		return NULL;
 	}

+ 8 - 9
modules/mono/mono_gd/gd_mono_utils.cpp

@@ -300,7 +300,7 @@ void update_godot_api_cache() {
 
 	// TODO Move to CSharpLanguage::init() and do handle disposal
 	MonoObject *task_scheduler = mono_object_new(SCRIPTS_DOMAIN, GODOT_API_CLASS(GodotTaskScheduler)->get_mono_ptr());
-	GDMonoUtils::runtime_object_init(task_scheduler);
+	GDMonoUtils::runtime_object_init(task_scheduler, GODOT_API_CLASS(GodotTaskScheduler));
 	mono_cache.task_scheduler_handle = MonoGCHandle::create_strong(task_scheduler);
 
 	mono_cache.godot_api_cache_updated = true;
@@ -401,11 +401,10 @@ MonoThread *get_current_thread() {
 	return mono_thread_current();
 }
 
-void runtime_object_init(MonoObject *p_this_obj) {
-	GD_MONO_BEGIN_RUNTIME_INVOKE;
-	// FIXME: Do not use mono_runtime_object_init, it aborts if an exception is thrown
-	mono_runtime_object_init(p_this_obj);
-	GD_MONO_END_RUNTIME_INVOKE;
+void runtime_object_init(MonoObject *p_this_obj, GDMonoClass *p_class, MonoException **r_exc) {
+	GDMonoMethod *ctor = p_class->get_method(".ctor", 0);
+	ERR_FAIL_NULL(ctor);
+	ctor->invoke_raw(p_this_obj, NULL, r_exc);
 }
 
 GDMonoClass *get_object_class(MonoObject *p_object) {
@@ -467,7 +466,7 @@ MonoObject *create_managed_for_godot_object(GDMonoClass *p_class, const StringNa
 	CACHED_FIELD(GodotObject, ptr)->set_value_raw(mono_object, p_object);
 
 	// Construct
-	GDMonoUtils::runtime_object_init(mono_object);
+	GDMonoUtils::runtime_object_init(mono_object, p_class);
 
 	return mono_object;
 }
@@ -477,7 +476,7 @@ MonoObject *create_managed_from(const NodePath &p_from) {
 	ERR_FAIL_NULL_V(mono_object, NULL);
 
 	// Construct
-	GDMonoUtils::runtime_object_init(mono_object);
+	GDMonoUtils::runtime_object_init(mono_object, CACHED_CLASS(NodePath));
 
 	CACHED_FIELD(NodePath, ptr)->set_value_raw(mono_object, memnew(NodePath(p_from)));
 
@@ -489,7 +488,7 @@ MonoObject *create_managed_from(const RID &p_from) {
 	ERR_FAIL_NULL_V(mono_object, NULL);
 
 	// Construct
-	GDMonoUtils::runtime_object_init(mono_object);
+	GDMonoUtils::runtime_object_init(mono_object, CACHED_CLASS(RID));
 
 	CACHED_FIELD(RID, ptr)->set_value_raw(mono_object, memnew(RID(p_from)));
 

+ 1 - 1
modules/mono/mono_gd/gd_mono_utils.h

@@ -249,7 +249,7 @@ _FORCE_INLINE_ bool is_main_thread() {
 	return mono_domain_get() != NULL && mono_thread_get_main() == mono_thread_current();
 }
 
-void runtime_object_init(MonoObject *p_this_obj);
+void runtime_object_init(MonoObject *p_this_obj, GDMonoClass *p_class, MonoException **r_exc = NULL);
 
 GDMonoClass *get_object_class(MonoObject *p_object);
 GDMonoClass *type_get_proxy_class(const StringName &p_type);