From 48496bb176b6fa2ad6293baaa9101647686407fe Mon Sep 17 00:00:00 2001 From: Jay Krell Date: Tue, 3 Sep 2019 15:52:41 -0700 Subject: [PATCH] [coop] CustomAttributeBuilder_GetBlob, etc. (mono/mono#16579) mono_reflection_get_custom_attrs_blob_checked ModuleBuilder_WriteToFile ModuleBuilder_build_metadata Commit migrated from https://github.com/mono/mono/commit/1780e1d1f8b01feafe6ddcb2c59d241122a6e61a --- src/mono/mono/metadata/icall-def-netcore.h | 2 +- src/mono/mono/metadata/icall-def.h | 7 +- src/mono/mono/metadata/icall-table.h | 8 +- src/mono/mono/metadata/object-internals.h | 12 --- src/mono/mono/metadata/reflection-internals.h | 2 +- src/mono/mono/metadata/sre.c | 116 ++++++++++++++++++-------- 6 files changed, 93 insertions(+), 54 deletions(-) diff --git a/src/mono/mono/metadata/icall-def-netcore.h b/src/mono/mono/metadata/icall-def-netcore.h index 45b7c43..22a2e8f 100644 --- a/src/mono/mono/metadata/icall-def-netcore.h +++ b/src/mono/mono/metadata/icall-def-netcore.h @@ -201,7 +201,7 @@ HANDLES(ASSEMB_1, "UpdateNativeCustomAttributes", ves_icall_AssemblyBuilder_Upda HANDLES(ASSEMB_2, "basic_init", ves_icall_AssemblyBuilder_basic_init, void, 1, (MonoReflectionAssemblyBuilder)) ICALL_TYPE(CATTRB, "System.Reflection.Emit.CustomAttributeBuilder", CATTRB_1) -ICALL(CATTRB_1, "GetBlob", ves_icall_CustomAttributeBuilder_GetBlob) +HANDLES(CATTRB_1, "GetBlob", ves_icall_CustomAttributeBuilder_GetBlob, MonoArray, 7, (MonoReflectionAssembly, MonoObject, MonoArray, MonoArray, MonoArray, MonoArray, MonoArray)) ICALL_TYPE(DYNM, "System.Reflection.Emit.DynamicMethod", DYNM_1) HANDLES(DYNM_1, "create_dynamic_method", ves_icall_DynamicMethod_create_dynamic_method, void, 1, (MonoReflectionDynamicMethod)) diff --git a/src/mono/mono/metadata/icall-def.h b/src/mono/mono/metadata/icall-def.h index 23ffc77..ac84f11 100644 --- a/src/mono/mono/metadata/icall-def.h +++ b/src/mono/mono/metadata/icall-def.h @@ -610,7 +610,7 @@ HANDLES(ASSEMB_2, "basic_init", ves_icall_AssemblyBuilder_basic_init, void, 1, ( #ifndef DISABLE_REFLECTION_EMIT ICALL_TYPE(CATTRB, "System.Reflection.Emit.CustomAttributeBuilder", CATTRB_1) -ICALL(CATTRB_1, "GetBlob", ves_icall_CustomAttributeBuilder_GetBlob) +HANDLES(CATTRB_1, "GetBlob", ves_icall_CustomAttributeBuilder_GetBlob, MonoArray, 7, (MonoReflectionAssembly, MonoObject, MonoArray, MonoArray, MonoArray, MonoArray, MonoArray)) #endif ICALL_TYPE(DYNM, "System.Reflection.Emit.DynamicMethod", DYNM_1) @@ -622,10 +622,9 @@ HANDLES(ENUMB_1, "setup_enum_type", ves_icall_EnumBuilder_setup_enum_type, void, ICALL_TYPE(MODULEB, "System.Reflection.Emit.ModuleBuilder", MODULEB_10) HANDLES(MODULEB_10, "GetRegisteredToken", ves_icall_ModuleBuilder_GetRegisteredToken, MonoObject, 2, (MonoReflectionModuleBuilder, guint32)) HANDLES(MODULEB_8, "RegisterToken", ves_icall_ModuleBuilder_RegisterToken, void, 3, (MonoReflectionModuleBuilder, MonoObject, guint32)) -ICALL(MODULEB_1, "WriteToFile", ves_icall_ModuleBuilder_WriteToFile) +HANDLES(MODULEB_1, "WriteToFile", ves_icall_ModuleBuilder_WriteToFile, void, 2, (MonoReflectionModuleBuilder, FILE_HANDLE)) HANDLES(MODULEB_2, "basic_init", ves_icall_ModuleBuilder_basic_init, void, 1, (MonoReflectionModuleBuilder)) - -ICALL(MODULEB_3, "build_metadata", ves_icall_ModuleBuilder_build_metadata) +HANDLES(MODULEB_3, "build_metadata", ves_icall_ModuleBuilder_build_metadata, void, 1, (MonoReflectionModuleBuilder)) HANDLES(MODULEB_5, "getMethodToken", ves_icall_ModuleBuilder_getMethodToken, gint32, 3, (MonoReflectionModuleBuilder, MonoReflectionMethod, MonoArray)) HANDLES(MODULEB_6, "getToken", ves_icall_ModuleBuilder_getToken, gint32, 3, (MonoReflectionModuleBuilder, MonoObject, MonoBoolean)) HANDLES(MODULEB_7, "getUSIndex", ves_icall_ModuleBuilder_getUSIndex, guint32, 2, (MonoReflectionModuleBuilder, MonoString)) diff --git a/src/mono/mono/metadata/icall-table.h b/src/mono/mono/metadata/icall-table.h index af253b3..26f6366 100644 --- a/src/mono/mono/metadata/icall-table.h +++ b/src/mono/mono/metadata/icall-table.h @@ -47,7 +47,10 @@ typedef int *int_ptr; typedef int **int_ptr_ref; typedef guint8 **guint8_ptr_ref; typedef GPtrArray *GPtrArray_ptr; +// HANDLE is not used just to avoid duplicate typedef warnings with some compilers. +// gpointer == void* == HANDLE == FILE_HANDLE == PROCESS_HANDLE. typedef gpointer PROCESS_HANDLE; +typedef gpointer FILE_HANDLE; typedef MonoAssemblyName *MonoAssemblyName_ptr; typedef MonoBoolean *MonoBoolean_ptr; typedef MonoClass *MonoClass_ptr; @@ -173,8 +176,11 @@ typedef MonoStringHandle MonoStringOutHandle; #define MONO_HANDLE_TYPE_WRAP_guint8_ptr_ref ICALL_HANDLES_WRAP_VALUETYPE_REF #define MONO_HANDLE_TYPE_WRAP_MonoResolveTokenError_ref ICALL_HANDLES_WRAP_VALUETYPE_REF +// HANDLE is not used just to avoid duplicate typedef warnings with some compilers. +// gpointer == void* == HANDLE == FILE_HANDLE == PROCESS_HANDLE. #define MONO_HANDLE_TYPE_WRAP_char_ptr ICALL_HANDLES_WRAP_NONE #define MONO_HANDLE_TYPE_WRAP_const_char_ptr ICALL_HANDLES_WRAP_NONE +#define MONO_HANDLE_TYPE_WRAP_FILE_HANDLE ICALL_HANDLES_WRAP_NONE #define MONO_HANDLE_TYPE_WRAP_MonoClass_ptr ICALL_HANDLES_WRAP_NONE #define MONO_HANDLE_TYPE_WRAP_MonoEvent_ptr ICALL_HANDLES_WRAP_NONE #define MONO_HANDLE_TYPE_WRAP_MonoGenericParamInfo_ptr ICALL_HANDLES_WRAP_NONE @@ -184,7 +190,7 @@ typedef MonoStringHandle MonoStringOutHandle; #define MONO_HANDLE_TYPE_WRAP_MonoStackCrawlMark_ptr ICALL_HANDLES_WRAP_NONE #define MONO_HANDLE_TYPE_WRAP_gint32_ptr ICALL_HANDLES_WRAP_NONE #define MONO_HANDLE_TYPE_WRAP_gpointer_ptr ICALL_HANDLES_WRAP_NONE -#define MONO_HANDLE_TYPE_WRAP_PROCESS_HANDLE ICALL_HANDLES_WRAP_NONE +#define MONO_HANDLE_TYPE_WRAP_PROCESS_HANDLE ICALL_HANDLES_WRAP_NONE // Please keep this sorted (grep ICALL_HANDLES_WRAP_OBJ$ | sort) #define MONO_HANDLE_TYPE_WRAP_MonoAppContext ICALL_HANDLES_WRAP_OBJ diff --git a/src/mono/mono/metadata/object-internals.h b/src/mono/mono/metadata/object-internals.h index 231dde9..960212c 100644 --- a/src/mono/mono/metadata/object-internals.h +++ b/src/mono/mono/metadata/object-internals.h @@ -2208,18 +2208,6 @@ mono_runtime_exec_main_checked (MonoMethod *method, MonoArray *args, MonoError * int mono_runtime_try_exec_main (MonoMethod *method, MonoArray *args, MonoObject **exc); -ICALL_EXPORT -void -ves_icall_ModuleBuilder_WriteToFile (MonoReflectionModuleBuilder *mb, gpointer file); - -ICALL_EXPORT -void -ves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilder *mb); - -ICALL_EXPORT -MonoArray* -ves_icall_CustomAttributeBuilder_GetBlob (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues); - MonoAssembly* mono_try_assembly_resolve_handle (MonoAssemblyLoadContext *alc, MonoStringHandle fname, MonoAssembly *requesting, gboolean refonly, MonoError *error); diff --git a/src/mono/mono/metadata/reflection-internals.h b/src/mono/mono/metadata/reflection-internals.h index da4e51c..0f1c96a 100644 --- a/src/mono/mono/metadata/reflection-internals.h +++ b/src/mono/mono/metadata/reflection-internals.h @@ -61,7 +61,7 @@ mono_reflection_get_custom_attrs_data_checked (MonoObjectHandle obj, MonoError * MonoArrayHandle mono_reflection_get_custom_attrs_by_type_handle (MonoObjectHandle obj, MonoClass *attr_klass, MonoError *error); -MonoArray* +MonoArrayHandle mono_reflection_get_custom_attrs_blob_checked (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues, MonoError *error); MonoCustomAttrInfo* diff --git a/src/mono/mono/metadata/sre.c b/src/mono/mono/metadata/sre.c index 4add7e2..7e71876 100644 --- a/src/mono/mono/metadata/sre.c +++ b/src/mono/mono/metadata/sre.c @@ -50,7 +50,9 @@ #include "icall-decl.h" static GENERATE_GET_CLASS_WITH_CACHE (marshal_as_attribute, "System.Runtime.InteropServices", "MarshalAsAttribute"); +#ifndef DISABLE_REFLECTION_EMIT static GENERATE_GET_CLASS_WITH_CACHE (module_builder, "System.Reflection.Emit", "ModuleBuilder"); +#endif static char* string_to_utf8_image_raw (MonoImage *image, MonoString *s, MonoError *error); @@ -2428,12 +2430,31 @@ encode_named_val (MonoReflectionAssembly *assembly, char *buffer, char *p, char * \returns a \c Byte array representing the blob of data. */ MonoArray* -mono_reflection_get_custom_attrs_blob (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues) +mono_reflection_get_custom_attrs_blob (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues) { + HANDLE_FUNCTION_ENTER (); + + MonoArrayHandle result; + + MONO_ENTER_GC_UNSAFE; + ERROR_DECL (error); - MonoArray *result = mono_reflection_get_custom_attrs_blob_checked (assembly, ctor, ctorArgs, properties, propValues, fields, fieldValues, error); + + MONO_HANDLE_NEW (MonoReflectionAssembly, assembly); + MONO_HANDLE_NEW (MonoObject, ctor); + MONO_HANDLE_NEW (MonoArray, ctorArgs); + MONO_HANDLE_NEW (MonoArray, properties); + MONO_HANDLE_NEW (MonoArray, propValues); + MONO_HANDLE_NEW (MonoArray, fields); + MONO_HANDLE_NEW (MonoArray, fieldValues); + + result = mono_reflection_get_custom_attrs_blob_checked (assembly, ctor, ctorArgs, properties, propValues, fields, fieldValues, error); + mono_error_cleanup (error); - return result; + + MONO_EXIT_GC_UNSAFE; + + HANDLE_FUNCTION_RETURN_OBJ (result); } /** @@ -2449,18 +2470,21 @@ mono_reflection_get_custom_attrs_blob (MonoReflectionAssembly *assembly, MonoObj * the custom attributed described by \p ctor, \p ctorArgs etc. * \returns a \c Byte array representing the blob of data. On failure returns NULL and sets \p error. */ -MonoArray* -mono_reflection_get_custom_attrs_blob_checked (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues, MonoError *error) +MonoArrayHandle +mono_reflection_get_custom_attrs_blob_checked (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues, MonoError *error) { - MonoArray *result = NULL; + MonoArrayHandle result = NULL_HANDLE_INIT; MonoMethodSignature *sig; MonoMethodSignature *sig_free = NULL; MonoObject *arg; char *buffer = NULL; char *p; guint32 buflen, i; + MonoObjectHandle h1 = NULL_HANDLE_INIT; + MonoObjectHandle h2 = NULL_HANDLE_INIT; + MonoObjectHandle argh = NULL_HANDLE_INIT; - error_init (error); + HANDLE_FUNCTION_ENTER (); if (strcmp (ctor->vtable->klass->name, "RuntimeConstructorInfo")) { /* sig is freed later so allocate it in the heap */ @@ -2477,8 +2501,12 @@ mono_reflection_get_custom_attrs_blob_checked (MonoReflectionAssembly *assembly, /* write the prolog */ *p++ = 1; *p++ = 0; + + argh = MONO_HANDLE_NEW (MonoObject, NULL); + for (i = 0; i < sig->param_count; ++i) { arg = mono_array_get_internal (ctorArgs, MonoObject*, i); + MONO_HANDLE_ASSIGN_RAW (argh, arg); encode_cattr_value (assembly->assembly, buffer, p, &buffer, &p, &buflen, sig->params [i], arg, NULL, error); goto_if_nok (error, leave); } @@ -2489,33 +2517,55 @@ mono_reflection_get_custom_attrs_blob_checked (MonoReflectionAssembly *assembly, i += mono_array_length_internal (fields); *p++ = i & 0xff; *p++ = (i >> 8) & 0xff; + + if (properties || fields) { + h1 = MONO_HANDLE_NEW (MonoObject, NULL); + h2 = MONO_HANDLE_NEW (MonoObject, NULL); + } + if (properties) { + MonoObject *prop; + for (i = 0; i < mono_array_length_internal (properties); ++i) { MonoType *ptype; char *pname; prop = (MonoObject *)mono_array_get_internal (properties, gpointer, i); + MONO_HANDLE_ASSIGN_RAW (h1, prop); + get_prop_name_and_type (prop, &pname, &ptype, error); goto_if_nok (error, leave); *p++ = 0x54; /* PROPERTY signature */ - encode_named_val (assembly, buffer, p, &buffer, &p, &buflen, ptype, pname, (MonoObject*)mono_array_get_internal (propValues, gpointer, i), error); + + prop = (MonoObject*)mono_array_get_internal (propValues, gpointer, i); + MONO_HANDLE_ASSIGN_RAW (h2, prop); + + encode_named_val (assembly, buffer, p, &buffer, &p, &buflen, ptype, pname, prop, error); g_free (pname); goto_if_nok (error, leave); } } if (fields) { + MonoObject *field; + for (i = 0; i < mono_array_length_internal (fields); ++i) { MonoType *ftype; char *fname; field = (MonoObject *)mono_array_get_internal (fields, gpointer, i); + MONO_HANDLE_ASSIGN_RAW (h1, field); + get_field_name_and_type (field, &fname, &ftype, error); goto_if_nok (error, leave); *p++ = 0x53; /* FIELD signature */ - encode_named_val (assembly, buffer, p, &buffer, &p, &buflen, ftype, fname, (MonoObject*)mono_array_get_internal (fieldValues, gpointer, i), error); + + field = (MonoObject*)mono_array_get_internal (fieldValues, gpointer, i); + MONO_HANDLE_ASSIGN_RAW (h2, field); + + encode_named_val (assembly, buffer, p, &buffer, &p, &buflen, ftype, fname, field, error); g_free (fname); goto_if_nok (error, leave); } @@ -2523,14 +2573,15 @@ mono_reflection_get_custom_attrs_blob_checked (MonoReflectionAssembly *assembly, g_assert (p - buffer <= buflen); buflen = p - buffer; - result = mono_array_new_checked (mono_domain_get (), mono_defaults.byte_class, buflen, error); + result = mono_array_new_handle (mono_domain_get (), mono_defaults.byte_class, buflen, error); goto_if_nok (error, leave); - p = mono_array_addr_internal (result, char, 0); + p = mono_array_addr_internal (MONO_HANDLE_RAW (result), char, 0); memcpy (p, buffer, buflen); leave: g_free (buffer); g_free (sig_free); - return result; + + HANDLE_FUNCTION_RETURN_REF (MonoArray, result); } static gboolean @@ -4442,7 +4493,7 @@ mono_reflection_resolve_object_handle (MonoImage *image, MonoObjectHandle obj, M #else /* DISABLE_REFLECTION_EMIT */ MonoArray* -mono_reflection_get_custom_attrs_blob (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues) +mono_reflection_get_custom_attrs_blob (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues) { g_assert_not_reached (); return NULL; @@ -4476,7 +4527,7 @@ mono_image_create_method_token (MonoDynamicImage *assembly, MonoObjectHandle obj } guint32 -mono_image_create_token (MonoDynamicImage *assembly, MonoObjectHandle obj, +mono_image_create_token (MonoDynamicImage *assembly, MonoObjectHandle obj, gboolean create_open_instance, gboolean register_token, MonoError *error) { g_assert_not_reached (); @@ -4498,7 +4549,7 @@ ves_icall_TypeBuilder_create_runtime_class (MonoReflectionTypeBuilderHandle tb, return MONO_HANDLE_CAST (MonoReflectionType, NULL_HANDLE); } -void +void ves_icall_DynamicMethod_create_dynamic_method (MonoReflectionDynamicMethodHandle mb, MonoError *error) { error_init (error); @@ -4535,7 +4586,6 @@ mono_sre_generic_param_table_entry_free (GenericParamTableEntry *entry) gint32 ves_icall_ModuleBuilder_getToken (MonoReflectionModuleBuilderHandle mb, MonoObjectHandle obj, MonoBoolean create_open_instance, MonoError *error) { - error_init (error); if (MONO_HANDLE_IS_NULL (obj)) { mono_error_set_argument_null (error, "obj", ""); return 0; @@ -4549,7 +4599,6 @@ ves_icall_ModuleBuilder_getMethodToken (MonoReflectionModuleBuilderHandle mb, MonoArrayHandle opt_param_types, MonoError *error) { - error_init (error); if (MONO_HANDLE_IS_NULL (method)) { mono_error_set_argument_null (error, "method", ""); return 0; @@ -4560,26 +4609,21 @@ ves_icall_ModuleBuilder_getMethodToken (MonoReflectionModuleBuilderHandle mb, #ifndef ENABLE_NETCORE void -ves_icall_ModuleBuilder_WriteToFile (MonoReflectionModuleBuilder *mb, HANDLE file) +ves_icall_ModuleBuilder_WriteToFile (MonoReflectionModuleBuilderHandle mb, HANDLE file, MonoError* error) { - ERROR_DECL (error); - mono_image_create_pefile (mb, file, error); - mono_error_set_pending_exception (error); + mono_image_create_pefile (MONO_HANDLE_RAW (mb), file, error); } void -ves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilder *mb) +ves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilderHandle mb, MonoError* error) { - ERROR_DECL (error); - mono_image_build_metadata (mb, error); - mono_error_set_pending_exception (error); + mono_image_build_metadata (MONO_HANDLE_RAW (mb), error); } #endif void ves_icall_ModuleBuilder_RegisterToken (MonoReflectionModuleBuilderHandle mb, MonoObjectHandle obj, guint32 token, MonoError *error) { - error_init (error); /* This function may be called by ModuleBuilder.FixupTokens to update * an existing token, so replace is okay here. */ mono_dynamic_image_register_token (MONO_HANDLE_GETVAL (mb, dynamic_image), token, obj, MONO_DYN_IMAGE_TOK_REPLACE); @@ -4593,14 +4637,19 @@ ves_icall_ModuleBuilder_GetRegisteredToken (MonoReflectionModuleBuilderHandle mb } #ifndef DISABLE_REFLECTION_EMIT -MonoArray* -ves_icall_CustomAttributeBuilder_GetBlob (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues) + +MonoArrayHandle +ves_icall_CustomAttributeBuilder_GetBlob (MonoReflectionAssemblyHandle assembly, MonoObjectHandle ctor, + MonoArrayHandle ctorArgs, MonoArrayHandle properties, + MonoArrayHandle propValues, MonoArrayHandle fields, + MonoArrayHandle fieldValues, MonoError* error) { - ERROR_DECL (error); - MonoArray *result = mono_reflection_get_custom_attrs_blob_checked (assembly, ctor, ctorArgs, properties, propValues, fields, fieldValues, error); - mono_error_set_pending_exception (error); - return result; + return mono_reflection_get_custom_attrs_blob_checked (MONO_HANDLE_RAW (assembly), MONO_HANDLE_RAW (ctor), + MONO_HANDLE_RAW (ctorArgs), MONO_HANDLE_RAW (properties), + MONO_HANDLE_RAW (propValues), MONO_HANDLE_RAW (fields), + MONO_HANDLE_RAW (fieldValues), error); } + #endif void @@ -4628,14 +4677,12 @@ ves_icall_EnumBuilder_setup_enum_type (MonoReflectionTypeHandle enumtype, MonoReflectionTypeHandle t, MonoError *error) { - error_init (error); MONO_HANDLE_SETVAL (enumtype, type, MonoType*, MONO_HANDLE_GETVAL (t, type)); } void ves_icall_ModuleBuilder_basic_init (MonoReflectionModuleBuilderHandle moduleb, MonoError *error) { - error_init (error); mono_image_module_basic_init (moduleb, error); } @@ -4648,7 +4695,6 @@ ves_icall_ModuleBuilder_getUSIndex (MonoReflectionModuleBuilderHandle module, Mo void ves_icall_ModuleBuilder_set_wrappers_type (MonoReflectionModuleBuilderHandle moduleb, MonoReflectionTypeHandle ref_type, MonoError *error) { - error_init (error); MonoDynamicImage *image = MONO_HANDLE_GETVAL (moduleb, dynamic_image); MonoType *type = MONO_HANDLE_GETVAL (ref_type, type); -- 2.7.4