From 0db3ee08a67df8ab39df2675a4561c6702dea36d Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Mon, 26 Aug 2019 11:17:15 -0400 Subject: [PATCH] [runtime] Convert mono_reflection_create_custom_attr_data_args () to use handles. Commit migrated from https://github.com/mono/mono/commit/a908b72037d0fd13f2a86208f35e833b62a96e55 --- src/mono/mono/metadata/custom-attrs-internals.h | 3 ++ src/mono/mono/metadata/custom-attrs.c | 49 +++++++++++-------------- src/mono/mono/metadata/icall-def.h | 2 +- src/mono/mono/metadata/object-internals.h | 5 --- src/mono/mono/mini/debugger-agent.c | 15 +++++++- 5 files changed, 39 insertions(+), 35 deletions(-) diff --git a/src/mono/mono/metadata/custom-attrs-internals.h b/src/mono/mono/metadata/custom-attrs-internals.h index 21e36df..c55ece8 100644 --- a/src/mono/mono/metadata/custom-attrs-internals.h +++ b/src/mono/mono/metadata/custom-attrs-internals.h @@ -27,6 +27,9 @@ void mono_assembly_init_weak_fields (MonoImage *image); void +mono_reflection_create_custom_attr_data_args (MonoImage *image, MonoMethod *method, const guchar *data, guint32 len, MonoArrayHandleOut typed_args_out, MonoArrayHandleOut named_args_out, CattrNamedArg **named_arg_info, MonoError *error); + +void mono_reflection_create_custom_attr_data_args_noalloc (MonoImage *image, MonoMethod *method, const guchar *data, guint32 len, gpointer **typed_args_out, gpointer **named_args_out, int *num_named_args, CattrNamedArg **named_arg_info, MonoError *error); diff --git a/src/mono/mono/metadata/custom-attrs.c b/src/mono/mono/metadata/custom-attrs.c index a0db2cd..e01e212 100644 --- a/src/mono/mono/metadata/custom-attrs.c +++ b/src/mono/mono/metadata/custom-attrs.c @@ -25,6 +25,7 @@ #include "mono/metadata/tabledefs.h" #include "mono/metadata/tokentype.h" #include "mono/metadata/verify-internals.h" +#include "mono/metadata/icall-decl.h" #include "mono/utils/checked-build.h" #define CHECK_ADD4_OVERFLOW_UN(a, b) ((guint32)(0xFFFFFFFFU) - (guint32)(b) < (guint32)(a)) @@ -1014,7 +1015,7 @@ create_custom_attr_into_array (MonoImage *image, MonoMethod *method, const gucha * NAMED_ARG_INFO will contain information about the named arguments. */ void -mono_reflection_create_custom_attr_data_args (MonoImage *image, MonoMethod *method, const guchar *data, guint32 len, MonoArray **typed_args_out, MonoArray **named_args_out, CattrNamedArg **named_arg_info, MonoError *error) +mono_reflection_create_custom_attr_data_args (MonoImage *image, MonoMethod *method, const guchar *data, guint32 len, MonoArrayHandleOut typed_args_h, MonoArrayHandleOut named_args_h, CattrNamedArg **named_arg_info, MonoError *error) { MonoArray *typed_args, *named_args; MonoClass *attrklass; @@ -1025,8 +1026,8 @@ mono_reflection_create_custom_attr_data_args (MonoImage *image, MonoMethod *meth guint32 i, j, num_named; CattrNamedArg *arginfo = NULL; - *typed_args_out = NULL; - *named_args_out = NULL; + MONO_HANDLE_ASSIGN_RAW (typed_args_h, NULL); + MONO_HANDLE_ASSIGN_RAW (named_args_h, NULL); *named_arg_info = NULL; typed_args = NULL; @@ -1051,6 +1052,7 @@ mono_reflection_create_custom_attr_data_args (MonoImage *image, MonoMethod *meth */ typed_args = mono_array_new_checked (domain, mono_get_object_class (), mono_method_signature_internal (method)->param_count, error); return_if_nok (error); + MONO_HANDLE_ASSIGN_RAW (typed_args_h, typed_args); for (i = 0; i < mono_method_signature_internal (method)->param_count; ++i) { MonoObject *obj; @@ -1068,6 +1070,7 @@ mono_reflection_create_custom_attr_data_args (MonoImage *image, MonoMethod *meth num_named = read16 (named); named_args = mono_array_new_checked (domain, mono_get_object_class (), num_named, error); return_if_nok (error); + MONO_HANDLE_ASSIGN_RAW (named_args_h, named_args); named += 2; attrklass = method->klass; @@ -1159,8 +1162,6 @@ mono_reflection_create_custom_attr_data_args (MonoImage *image, MonoMethod *meth g_free (name); } - *typed_args_out = typed_args; - *named_args_out = named_args; return; fail: mono_error_set_generic_error (error, "System.Reflection", "CustomAttributeFormatException", "Binary format of the specified custom attribute was invalid."); @@ -1322,26 +1323,26 @@ fail: *named_arg_info = NULL; } -static gboolean -reflection_resolve_custom_attribute_data (MonoReflectionMethod *ref_method, MonoReflectionAssembly *assembly, gpointer data, guint32 len, MonoArray **ctor_args, MonoArray **named_args_out, MonoError *error) +void +ves_icall_System_Reflection_CustomAttributeData_ResolveArgumentsInternal (MonoReflectionMethodHandle ref_method_h, MonoReflectionAssemblyHandle assembly_h, + gpointer data, guint32 len, + MonoArrayHandleOut ctor_args_h, MonoArrayHandleOut named_args_h, + MonoError *error) { MonoDomain *domain; MonoArray *typed_args, *named_args; MonoImage *image; MonoMethod *method; CattrNamedArg *arginfo = NULL; + MonoReflectionMethod *ref_method = MONO_HANDLE_RAW (ref_method_h); + MonoReflectionAssembly *assembly = MONO_HANDLE_RAW (assembly_h); + MonoMethodSignature *sig; int i; error_init (error); - *ctor_args = NULL; - *named_args_out = NULL; - - typed_args = NULL; - named_args = NULL; - if (len == 0) - return TRUE; + return; image = assembly->assembly->image; method = ref_method->method; @@ -1352,13 +1353,17 @@ reflection_resolve_custom_attribute_data (MonoReflectionMethod *ref_method, Mono goto leave; } - mono_reflection_create_custom_attr_data_args (image, method, (const guchar *)data, len, &typed_args, &named_args, &arginfo, error); + // FIXME: Handles + mono_reflection_create_custom_attr_data_args (image, method, (const guchar *)data, len, ctor_args_h, named_args_h, &arginfo, error); goto_if_nok (error, leave); + typed_args = MONO_HANDLE_RAW (ctor_args_h); + named_args = MONO_HANDLE_RAW (named_args_h); if (!typed_args || !named_args) goto leave; - for (i = 0; i < mono_method_signature_internal (method)->param_count; ++i) { + sig = mono_method_signature_internal (method); + for (i = 0; i < sig->param_count; ++i) { MonoObject *obj = mono_array_get_internal (typed_args, MonoObject*, i); MonoObject *typedarg; MonoType *t; @@ -1397,20 +1402,8 @@ reflection_resolve_custom_attribute_data (MonoReflectionMethod *ref_method, Mono mono_array_setref_internal (named_args, i, namedarg); } - *ctor_args = typed_args; - *named_args_out = named_args; - leave: g_free (arginfo); - return is_ok (error); -} - -void -ves_icall_System_Reflection_CustomAttributeData_ResolveArgumentsInternal (MonoReflectionMethod *ref_method, MonoReflectionAssembly *assembly, gpointer data, guint32 len, MonoArray **ctor_args, MonoArray **named_args) -{ - ERROR_DECL (error); - (void) reflection_resolve_custom_attribute_data (ref_method, assembly, data, len, ctor_args, named_args, error); - mono_error_set_pending_exception (error); } static MonoClass* diff --git a/src/mono/mono/metadata/icall-def.h b/src/mono/mono/metadata/icall-def.h index f056cd1..23be6ed 100644 --- a/src/mono/mono/metadata/icall-def.h +++ b/src/mono/mono/metadata/icall-def.h @@ -602,7 +602,7 @@ NOHANDLES(ICALL(ASSEMN_3, "ParseAssemblyName", ves_icall_System_Reflection_Assem NOHANDLES(ICALL(ASSEMN_2, "get_public_token", mono_digest_get_public_token)) ICALL_TYPE(CATTR_DATA, "System.Reflection.CustomAttributeData", CATTR_DATA_1) -ICALL(CATTR_DATA_1, "ResolveArgumentsInternal", ves_icall_System_Reflection_CustomAttributeData_ResolveArgumentsInternal) +HANDLES(CATTR_DATA_1, "ResolveArgumentsInternal", ves_icall_System_Reflection_CustomAttributeData_ResolveArgumentsInternal, void, 6, (MonoReflectionMethod, MonoReflectionAssembly, gpointer, guint32, MonoArrayOut, MonoArrayOut)) ICALL_TYPE(ASSEMB, "System.Reflection.Emit.AssemblyBuilder", ASSEMB_1) HANDLES(ASSEMB_1, "UpdateNativeCustomAttributes", ves_icall_AssemblyBuilder_UpdateNativeCustomAttributes, void, 1, (MonoReflectionAssemblyBuilder)) diff --git a/src/mono/mono/metadata/object-internals.h b/src/mono/mono/metadata/object-internals.h index 629b504..97c63e0 100644 --- a/src/mono/mono/metadata/object-internals.h +++ b/src/mono/mono/metadata/object-internals.h @@ -1710,7 +1710,6 @@ ves_icall_SymbolType_create_unmanaged_type (MonoReflectionType *type); 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_out, MonoArray **named_args_out, CattrNamedArg **named_arg_info, MonoError *error); MonoMethodSignature * mono_reflection_lookup_signature (MonoImage *image, MonoMethod *method, guint32 token, MonoError *error); MonoArrayHandle mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoClass *refclass, MonoError *error); @@ -1735,10 +1734,6 @@ mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token, gboolean gboolean mono_reflection_call_is_assignable_to (MonoClass *klass, MonoClass *oklass, MonoError *error); -ICALL_EXPORT -void -ves_icall_System_Reflection_CustomAttributeData_ResolveArgumentsInternal (MonoReflectionMethod *method, MonoReflectionAssembly *assembly, gpointer data, guint32 data_length, MonoArray **ctor_args, MonoArray ** named_args); - gboolean mono_image_build_metadata (MonoReflectionModuleBuilder *module, MonoError *error); diff --git a/src/mono/mono/mini/debugger-agent.c b/src/mono/mono/mini/debugger-agent.c index c2e0390..ffa09bd 100644 --- a/src/mono/mono/mini/debugger-agent.c +++ b/src/mono/mono/mini/debugger-agent.c @@ -7802,16 +7802,25 @@ buffer_add_cattrs (Buffer *buf, MonoDomain *domain, MonoImage *image, MonoClass MonoCustomAttrEntry *attr = &cinfo->attrs [i]; if (!attr_klass || mono_class_has_parent (attr->ctor->klass, attr_klass)) { MonoArray *typed_args, *named_args; + MonoArrayHandleOut typed_args_h, named_args_h; + MonoObjectHandle val_h; MonoType *t; CattrNamedArg *arginfo = NULL; ERROR_DECL (error); - mono_reflection_create_custom_attr_data_args (image, attr->ctor, attr->data, attr->data_size, &typed_args, &named_args, &arginfo, error); + SETUP_ICALL_FRAME; + typed_args_h = MONO_HANDLE_NEW (MonoArray, NULL); + named_args_h = MONO_HANDLE_NEW (MonoArray, NULL); + val_h = MONO_HANDLE_NEW (MonoObject, NULL); + + mono_reflection_create_custom_attr_data_args (image, attr->ctor, attr->data, attr->data_size, typed_args_h, named_args_h, &arginfo, error); if (!is_ok (error)) { DEBUG_PRINTF (2, "[dbg] mono_reflection_create_custom_attr_data_args () failed with: '%s'\n", mono_error_get_message (error)); mono_error_cleanup (error); return ERR_LOADER_ERROR; } + typed_args = MONO_HANDLE_RAW (typed_args_h); + named_args = MONO_HANDLE_RAW (named_args_h); buffer_add_methodid (buf, domain, attr->ctor); @@ -7820,6 +7829,7 @@ buffer_add_cattrs (Buffer *buf, MonoDomain *domain, MonoImage *image, MonoClass buffer_add_int (buf, mono_array_length_internal (typed_args)); for (j = 0; j < mono_array_length_internal (typed_args); ++j) { MonoObject *val = mono_array_get_internal (typed_args, MonoObject*, j); + MONO_HANDLE_ASSIGN_RAW (val_h, val); t = mono_method_signature_internal (attr->ctor)->params [j]; @@ -7835,6 +7845,7 @@ buffer_add_cattrs (Buffer *buf, MonoDomain *domain, MonoImage *image, MonoClass for (j = 0; j < mono_array_length_internal (named_args); ++j) { MonoObject *val = mono_array_get_internal (named_args, MonoObject*, j); + MONO_HANDLE_ASSIGN_RAW (val_h, val); if (arginfo [j].prop) { buffer_add_byte (buf, 0x54); @@ -7852,6 +7863,8 @@ buffer_add_cattrs (Buffer *buf, MonoDomain *domain, MonoImage *image, MonoClass buffer_add_int (buf, 0); } g_free (arginfo); + + CLEAR_ICALL_FRAME; } } -- 2.7.4