Browse Source

Merge pull request #20639 from neikeq/issue-20531-and-cleanup

Mono: Fix property set_value and cleanup
Ignacio Etcheverry 7 years ago
parent
commit
ccce161d0e

+ 1 - 3
modules/mono/mono_gd/gd_mono_class.cpp

@@ -40,9 +40,7 @@ String GDMonoClass::get_full_name(MonoClass *p_mono_class) {
 	MonoReflectionType *type_obj = mono_type_get_object(mono_domain_get(), get_mono_type(p_mono_class));
 	MonoReflectionType *type_obj = mono_type_get_object(mono_domain_get(), get_mono_type(p_mono_class));
 
 
 	MonoException *exc = NULL;
 	MonoException *exc = NULL;
-	GD_MONO_BEGIN_RUNTIME_INVOKE;
-	MonoString *str = mono_object_to_string((MonoObject *)type_obj, (MonoObject **)&exc);
-	GD_MONO_END_RUNTIME_INVOKE;
+	MonoString *str = GDMonoUtils::object_to_string((MonoObject *)type_obj, &exc);
 	UNLIKELY_UNHANDLED_EXCEPTION(exc);
 	UNLIKELY_UNHANDLED_EXCEPTION(exc);
 
 
 	return GDMonoMarshal::mono_string_to_godot(str);
 	return GDMonoMarshal::mono_string_to_godot(str);

+ 3 - 9
modules/mono/mono_gd/gd_mono_method.cpp

@@ -105,9 +105,7 @@ MonoObject *GDMonoMethod::invoke(MonoObject *p_object, const Variant **p_params,
 		}
 		}
 
 
 		MonoException *exc = NULL;
 		MonoException *exc = NULL;
-		GD_MONO_BEGIN_RUNTIME_INVOKE;
-		MonoObject *ret = mono_runtime_invoke_array(mono_method, p_object, params, (MonoObject **)&exc);
-		GD_MONO_END_RUNTIME_INVOKE;
+		MonoObject *ret = GDMonoUtils::runtime_invoke_array(mono_method, p_object, params, &exc);
 
 
 		if (exc) {
 		if (exc) {
 			ret = NULL;
 			ret = NULL;
@@ -121,9 +119,7 @@ MonoObject *GDMonoMethod::invoke(MonoObject *p_object, const Variant **p_params,
 		return ret;
 		return ret;
 	} else {
 	} else {
 		MonoException *exc = NULL;
 		MonoException *exc = NULL;
-		GD_MONO_BEGIN_RUNTIME_INVOKE;
-		mono_runtime_invoke(mono_method, p_object, NULL, (MonoObject **)&exc);
-		GD_MONO_END_RUNTIME_INVOKE;
+		GDMonoUtils::runtime_invoke(mono_method, p_object, NULL, &exc);
 
 
 		if (exc) {
 		if (exc) {
 			if (r_exc) {
 			if (r_exc) {
@@ -144,9 +140,7 @@ MonoObject *GDMonoMethod::invoke(MonoObject *p_object, MonoException **r_exc) {
 
 
 MonoObject *GDMonoMethod::invoke_raw(MonoObject *p_object, void **p_params, MonoException **r_exc) {
 MonoObject *GDMonoMethod::invoke_raw(MonoObject *p_object, void **p_params, MonoException **r_exc) {
 	MonoException *exc = NULL;
 	MonoException *exc = NULL;
-	GD_MONO_BEGIN_RUNTIME_INVOKE;
-	MonoObject *ret = mono_runtime_invoke(mono_method, p_object, p_params, (MonoObject **)&exc);
-	GD_MONO_END_RUNTIME_INVOKE;
+	MonoObject *ret = GDMonoUtils::runtime_invoke(mono_method, p_object, p_params, &exc);
 
 
 	if (exc) {
 	if (exc) {
 		ret = NULL;
 		ret = NULL;

+ 14 - 8
modules/mono/mono_gd/gd_mono_property.cpp

@@ -139,15 +139,23 @@ bool GDMonoProperty::has_setter() {
 }
 }
 
 
 void GDMonoProperty::set_value(MonoObject *p_object, MonoObject *p_value, MonoException **r_exc) {
 void GDMonoProperty::set_value(MonoObject *p_object, MonoObject *p_value, MonoException **r_exc) {
-	void *params[1] = { p_value };
-	set_value(p_object, params, r_exc);
+	MonoMethod *prop_method = mono_property_get_set_method(mono_property);
+	MonoArray *params = mono_array_new(mono_domain_get(), CACHED_CLASS_RAW(MonoObject), 1);
+	mono_array_set(params, MonoObject *, 0, p_value);
+	MonoException *exc = NULL;
+	GDMonoUtils::runtime_invoke_array(prop_method, p_object, params, &exc);
+	if (exc) {
+		if (r_exc) {
+			*r_exc = exc;
+		} else {
+			GDMonoUtils::set_pending_exception(exc);
+		}
+	}
 }
 }
 
 
 void GDMonoProperty::set_value(MonoObject *p_object, void **p_params, MonoException **r_exc) {
 void GDMonoProperty::set_value(MonoObject *p_object, void **p_params, MonoException **r_exc) {
 	MonoException *exc = NULL;
 	MonoException *exc = NULL;
-	GD_MONO_BEGIN_RUNTIME_INVOKE;
-	mono_property_set_value(mono_property, p_object, p_params, (MonoObject **)&exc);
-	GD_MONO_END_RUNTIME_INVOKE;
+	GDMonoUtils::property_set_value(mono_property, p_object, p_params, &exc);
 
 
 	if (exc) {
 	if (exc) {
 		if (r_exc) {
 		if (r_exc) {
@@ -160,9 +168,7 @@ void GDMonoProperty::set_value(MonoObject *p_object, void **p_params, MonoExcept
 
 
 MonoObject *GDMonoProperty::get_value(MonoObject *p_object, MonoException **r_exc) {
 MonoObject *GDMonoProperty::get_value(MonoObject *p_object, MonoException **r_exc) {
 	MonoException *exc = NULL;
 	MonoException *exc = NULL;
-	GD_MONO_BEGIN_RUNTIME_INVOKE;
-	MonoObject *ret = mono_property_get_value(mono_property, p_object, NULL, (MonoObject **)&exc);
-	GD_MONO_END_RUNTIME_INVOKE;
+	MonoObject *ret = GDMonoUtils::property_get_value(mono_property, p_object, NULL, &exc);
 
 
 	if (exc) {
 	if (exc) {
 		ret = NULL;
 		ret = NULL;

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

@@ -414,7 +414,7 @@ MonoObject *create_managed_from(const Array &p_from, GDMonoClass *p_class) {
 	void *args[1] = { &new_array };
 	void *args[1] = { &new_array };
 
 
 	MonoException *exc = NULL;
 	MonoException *exc = NULL;
-	mono_runtime_invoke(m, mono_object, args, (MonoObject **)&exc);
+	GDMonoUtils::runtime_invoke(m, mono_object, args, &exc);
 	UNLIKELY_UNHANDLED_EXCEPTION(exc);
 	UNLIKELY_UNHANDLED_EXCEPTION(exc);
 
 
 	return mono_object;
 	return mono_object;
@@ -444,7 +444,7 @@ MonoObject *create_managed_from(const Dictionary &p_from, GDMonoClass *p_class)
 	void *args[1] = { &new_dict };
 	void *args[1] = { &new_dict };
 
 
 	MonoException *exc = NULL;
 	MonoException *exc = NULL;
-	mono_runtime_invoke(m, mono_object, args, (MonoObject **)&exc);
+	GDMonoUtils::runtime_invoke(m, mono_object, args, &exc);
 	UNLIKELY_UNHANDLED_EXCEPTION(exc);
 	UNLIKELY_UNHANDLED_EXCEPTION(exc);
 
 
 	return mono_object;
 	return mono_object;
@@ -476,9 +476,7 @@ String get_exception_name_and_message(MonoException *p_exc) {
 	res += ": ";
 	res += ": ";
 
 
 	MonoProperty *prop = mono_class_get_property_from_name(klass, "Message");
 	MonoProperty *prop = mono_class_get_property_from_name(klass, "Message");
-	GD_MONO_BEGIN_RUNTIME_INVOKE;
-	MonoString *msg = (MonoString *)mono_property_get_value(prop, (MonoObject *)p_exc, NULL, NULL);
-	GD_MONO_END_RUNTIME_INVOKE;
+	MonoString *msg = (MonoString *)property_get_value(prop, (MonoObject *)p_exc, NULL, NULL);
 	res += GDMonoMarshal::mono_string_to_godot(msg);
 	res += GDMonoMarshal::mono_string_to_godot(msg);
 
 
 	return res;
 	return res;
@@ -489,9 +487,7 @@ void set_exception_message(MonoException *p_exc, String message) {
 	MonoProperty *prop = mono_class_get_property_from_name(klass, "Message");
 	MonoProperty *prop = mono_class_get_property_from_name(klass, "Message");
 	MonoString *msg = GDMonoMarshal::mono_string_from_godot(message);
 	MonoString *msg = GDMonoMarshal::mono_string_from_godot(message);
 	void *params[1] = { msg };
 	void *params[1] = { msg };
-	GD_MONO_BEGIN_RUNTIME_INVOKE;
-	mono_property_set_value(prop, (MonoObject *)p_exc, params, NULL);
-	GD_MONO_END_RUNTIME_INVOKE;
+	property_set_value(prop, (MonoObject *)p_exc, params, NULL);
 }
 }
 
 
 void debug_print_unhandled_exception(MonoException *p_exc) {
 void debug_print_unhandled_exception(MonoException *p_exc) {
@@ -592,4 +588,38 @@ void set_pending_exception(MonoException *p_exc) {
 _THREAD_LOCAL_(int)
 _THREAD_LOCAL_(int)
 current_invoke_count = 0;
 current_invoke_count = 0;
 
 
+MonoObject *runtime_invoke(MonoMethod *p_method, void *p_obj, void **p_params, MonoException **p_exc) {
+	GD_MONO_BEGIN_RUNTIME_INVOKE;
+	MonoObject *ret = mono_runtime_invoke(p_method, p_obj, p_params, (MonoObject **)&p_exc);
+	GD_MONO_END_RUNTIME_INVOKE;
+	return ret;
+}
+
+MonoObject *runtime_invoke_array(MonoMethod *p_method, void *p_obj, MonoArray *p_params, MonoException **p_exc) {
+	GD_MONO_BEGIN_RUNTIME_INVOKE;
+	MonoObject *ret = mono_runtime_invoke_array(p_method, p_obj, p_params, (MonoObject **)&p_exc);
+	GD_MONO_END_RUNTIME_INVOKE;
+	return ret;
+}
+
+MonoString *object_to_string(MonoObject *p_obj, MonoException **p_exc) {
+	GD_MONO_BEGIN_RUNTIME_INVOKE;
+	MonoString *ret = mono_object_to_string(p_obj, (MonoObject **)p_exc);
+	GD_MONO_END_RUNTIME_INVOKE;
+	return ret;
+}
+
+void property_set_value(MonoProperty *p_prop, void *p_obj, void **p_params, MonoException **p_exc) {
+	GD_MONO_BEGIN_RUNTIME_INVOKE;
+	mono_property_set_value(p_prop, p_obj, p_params, (MonoObject **)p_exc);
+	GD_MONO_END_RUNTIME_INVOKE;
+}
+
+MonoObject *property_get_value(MonoProperty *p_prop, void *p_obj, void **p_params, MonoException **p_exc) {
+	GD_MONO_BEGIN_RUNTIME_INVOKE;
+	MonoObject *ret = mono_property_get_value(p_prop, p_obj, p_params, (MonoObject **)p_exc);
+	GD_MONO_END_RUNTIME_INVOKE;
+	return ret;
+}
+
 } // namespace GDMonoUtils
 } // namespace GDMonoUtils

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

@@ -230,6 +230,14 @@ _FORCE_INLINE_ int &get_runtime_invoke_count_ref() {
 	return current_invoke_count;
 	return current_invoke_count;
 }
 }
 
 
+MonoObject *runtime_invoke(MonoMethod *p_method, void *p_obj, void **p_params, MonoException **p_exc);
+MonoObject *runtime_invoke_array(MonoMethod *p_method, void *p_obj, MonoArray *p_params, MonoException **p_exc);
+
+MonoString *object_to_string(MonoObject *p_obj, MonoException **p_exc);
+
+void property_set_value(MonoProperty *p_prop, void *p_obj, void **p_params, MonoException **p_exc);
+MonoObject *property_get_value(MonoProperty *p_prop, void *p_obj, void **p_params, MonoException **p_exc);
+
 } // namespace GDMonoUtils
 } // namespace GDMonoUtils
 
 
 #define NATIVE_GDMONOCLASS_NAME(m_class) (GDMonoMarshal::mono_string_to_godot((MonoString *)m_class->get_field(BINDINGS_NATIVE_NAME_FIELD)->get_value(NULL)))
 #define NATIVE_GDMONOCLASS_NAME(m_class) (GDMonoMarshal::mono_string_to_godot((MonoString *)m_class->get_field(BINDINGS_NATIVE_NAME_FIELD)->get_value(NULL)))