Mono: Fix property set_value and cleanup
This commit is contained in:
parent
6601502acd
commit
4172fa03b5
5 changed files with 64 additions and 28 deletions
|
@ -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));
|
||||
|
||||
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);
|
||||
|
||||
return GDMonoMarshal::mono_string_to_godot(str);
|
||||
|
|
|
@ -105,9 +105,7 @@ MonoObject *GDMonoMethod::invoke(MonoObject *p_object, const Variant **p_params,
|
|||
}
|
||||
|
||||
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) {
|
||||
ret = NULL;
|
||||
|
@ -121,9 +119,7 @@ MonoObject *GDMonoMethod::invoke(MonoObject *p_object, const Variant **p_params,
|
|||
return ret;
|
||||
} else {
|
||||
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 (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) {
|
||||
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) {
|
||||
ret = NULL;
|
||||
|
|
|
@ -139,15 +139,23 @@ bool GDMonoProperty::has_setter() {
|
|||
}
|
||||
|
||||
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) {
|
||||
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 (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) {
|
||||
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) {
|
||||
ret = NULL;
|
||||
|
|
|
@ -414,7 +414,7 @@ MonoObject *create_managed_from(const Array &p_from, GDMonoClass *p_class) {
|
|||
void *args[1] = { &new_array };
|
||||
|
||||
MonoException *exc = NULL;
|
||||
mono_runtime_invoke(m, mono_object, args, (MonoObject **)&exc);
|
||||
GDMonoUtils::runtime_invoke(m, mono_object, args, &exc);
|
||||
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
||||
|
||||
return mono_object;
|
||||
|
@ -444,7 +444,7 @@ MonoObject *create_managed_from(const Dictionary &p_from, GDMonoClass *p_class)
|
|||
void *args[1] = { &new_dict };
|
||||
|
||||
MonoException *exc = NULL;
|
||||
mono_runtime_invoke(m, mono_object, args, (MonoObject **)&exc);
|
||||
GDMonoUtils::runtime_invoke(m, mono_object, args, &exc);
|
||||
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
||||
|
||||
return mono_object;
|
||||
|
@ -476,9 +476,7 @@ String get_exception_name_and_message(MonoException *p_exc) {
|
|||
res += ": ";
|
||||
|
||||
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);
|
||||
|
||||
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");
|
||||
MonoString *msg = GDMonoMarshal::mono_string_from_godot(message);
|
||||
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) {
|
||||
|
@ -592,4 +588,38 @@ void set_pending_exception(MonoException *p_exc) {
|
|||
_THREAD_LOCAL_(int)
|
||||
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
|
||||
|
|
|
@ -230,6 +230,14 @@ _FORCE_INLINE_ int &get_runtime_invoke_count_ref() {
|
|||
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
|
||||
|
||||
#define NATIVE_GDMONOCLASS_NAME(m_class) (GDMonoMarshal::mono_string_to_godot((MonoString *)m_class->get_field(BINDINGS_NATIVE_NAME_FIELD)->get_value(NULL)))
|
||||
|
|
Loading…
Reference in a new issue