From 753f639a9d690648e06797042fb14bb83d5cb160 Mon Sep 17 00:00:00 2001 From: Aleksey Kliger Date: Fri, 26 Feb 2016 15:47:16 -0500 Subject: [PATCH] [reflection] MonoError in mono_param_get_objects_internal Mark mono_param_get_objects external only. --- mono/metadata/icall.c | 5 ++++- mono/metadata/object-internals.h | 2 +- mono/metadata/reflection.c | 29 ++++++++++++++++------------- mono/metadata/reflection.h | 1 + 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c index d6d0ad2818c..c68df0247e3 100644 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@ -1728,9 +1728,12 @@ ves_icall_get_method_info (MonoMethod *method, MonoMethodInfo *info) ICALL_EXPORT MonoArray* ves_icall_get_parameter_info (MonoMethod *method, MonoReflectionMethod *member) { + MonoError error; MonoDomain *domain = mono_domain_get (); - return mono_param_get_objects_internal (domain, method, member->reftype ? mono_class_from_mono_type (member->reftype->type) : NULL); + MonoArray *result = mono_param_get_objects_internal (domain, method, member->reftype ? mono_class_from_mono_type (member->reftype->type) : NULL, &error); + mono_error_set_pending_exception (&error); + return result; } ICALL_EXPORT MonoReflectionMarshalAsAttribute* diff --git a/mono/metadata/object-internals.h b/mono/metadata/object-internals.h index e2cbf0a068d..e277229d675 100644 --- a/mono/metadata/object-internals.h +++ b/mono/metadata/object-internals.h @@ -1412,7 +1412,7 @@ void mono_reflection_register_with_runtime (MonoReflectionType *type); void mono_reflection_create_custom_attr_data_args (MonoImage *image, MonoMethod *method, const guchar *data, guint32 len, MonoArray **typed_args, MonoArray **named_args, CattrNamedArg **named_arg_info, MonoError *error); MonoMethodSignature * mono_reflection_lookup_signature (MonoImage *image, MonoMethod *method, guint32 token, MonoError *error); -MonoArray* mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoClass *refclass); +MonoArray* mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoClass *refclass, MonoError *error); MonoClass* mono_class_bind_generic_parameters (MonoClass *klass, int type_argc, MonoType **types, gboolean is_dynamic); diff --git a/mono/metadata/reflection.c b/mono/metadata/reflection.c index 687926aa14c..d6bb70057a4 100644 --- a/mono/metadata/reflection.c +++ b/mono/metadata/reflection.c @@ -7359,11 +7359,10 @@ get_reflection_missing (MonoDomain *domain, MonoObject **reflection_missing) * in the method @method. */ MonoArray* -mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoClass *refclass) +mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoClass *refclass, MonoError *error) { static MonoClass *System_Reflection_ParameterInfo; static MonoClass *System_Reflection_ParameterInfo_array; - MonoError error; MonoArray *res = NULL; MonoReflectionMethod *member = NULL; MonoReflectionParameter *param = NULL; @@ -7378,7 +7377,7 @@ mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoCla MonoReflectionType *rt; int i; - mono_error_init (&error); + mono_error_init (error); if (!System_Reflection_ParameterInfo_array) { MonoClass *klass; @@ -7394,12 +7393,12 @@ mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoCla System_Reflection_ParameterInfo_array = klass; } - sig = mono_method_signature_checked (method, &error); - if (!mono_error_ok (&error)) + sig = mono_method_signature_checked (method, error); + if (!mono_error_ok (error)) goto leave; if (!sig->param_count) { - res = mono_array_new_specific_checked (mono_class_vtable (domain, System_Reflection_ParameterInfo_array), 0, &error); + res = mono_array_new_specific_checked (mono_class_vtable (domain, System_Reflection_ParameterInfo_array), 0, error); if (!res) goto leave; @@ -7411,7 +7410,7 @@ mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoCla */ CHECK_OBJECT (MonoArray*, &(method->signature), refclass); - member = mono_method_get_object_checked (domain, method, refclass, &error); + member = mono_method_get_object_checked (domain, method, refclass, error); if (!member) goto leave; names = g_new (char *, sig->param_count); @@ -7420,17 +7419,17 @@ mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoCla mspecs = g_new (MonoMarshalSpec*, sig->param_count + 1); mono_method_get_marshal_info (method, mspecs); - res = mono_array_new_specific_checked (mono_class_vtable (domain, System_Reflection_ParameterInfo_array), sig->param_count, &error); + res = mono_array_new_specific_checked (mono_class_vtable (domain, System_Reflection_ParameterInfo_array), sig->param_count, error); if (!res) goto leave; pinfo_vtable = mono_class_vtable (domain, System_Reflection_ParameterInfo); for (i = 0; i < sig->param_count; ++i) { - param = (MonoReflectionParameter *) mono_object_new_specific_checked (pinfo_vtable, &error); + param = (MonoReflectionParameter *) mono_object_new_specific_checked (pinfo_vtable, error); if (!param) goto leave; - rt = mono_type_get_object_checked (domain, sig->params [i], &error); + rt = mono_type_get_object_checked (domain, sig->params [i], error); if (!rt) goto leave; @@ -7485,7 +7484,7 @@ mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoCla if (mspecs [i + 1]) { MonoReflectionMarshalAsAttribute* mobj; - mobj = mono_reflection_marshal_as_attribute_from_marshal_spec (domain, method->klass, mspecs [i + 1], &error); + mobj = mono_reflection_marshal_as_attribute_from_marshal_spec (domain, method->klass, mspecs [i + 1], error); if (!mobj) goto leave; MONO_OBJECT_SETREF (param, MarshalAsImpl, (MonoObject*)mobj); @@ -7508,7 +7507,8 @@ leave: } g_free (mspecs); - mono_error_raise_exception (&error); /* FIXME don't raise here */ + if (!is_ok (error)) + return NULL; CACHE_OBJECT (MonoArray *, &(method->signature), res, refclass); } @@ -7516,7 +7516,10 @@ leave: MonoArray* mono_param_get_objects (MonoDomain *domain, MonoMethod *method) { - return mono_param_get_objects_internal (domain, method, NULL); + MonoError error; + MonoArray *result = mono_param_get_objects_internal (domain, method, NULL, &error); + mono_error_assert_ok (&error); + return result; } /* diff --git a/mono/metadata/reflection.h b/mono/metadata/reflection.h index a3c52fa7414..52b8689adc1 100644 --- a/mono/metadata/reflection.h +++ b/mono/metadata/reflection.h @@ -63,6 +63,7 @@ MONO_API MonoReflectionProperty* mono_property_get_object (MonoDomain *domain, M MONO_RT_EXTERNAL_ONLY MONO_API MonoReflectionEvent* mono_event_get_object (MonoDomain *domain, MonoClass *klass, MonoEvent *event); /* note: this one is slightly different: we keep the whole array of params in the cache */ +MONO_RT_EXTERNAL_ONLY MONO_API MonoArray* mono_param_get_objects (MonoDomain *domain, MonoMethod *method); MONO_API MonoReflectionMethodBody* mono_method_body_get_object (MonoDomain *domain, MonoMethod *method); -- 2.11.4.GIT