From 7a3e1f67333b005dd8b119c733b81648d57b9bc9 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Sat, 6 Feb 2021 10:49:08 -0500 Subject: [PATCH] Cleanup System.Reflection.Emit code. (#47945) * Remove unused fields from ref.emit classes. * Remove MonoDynamicImage->run/save, they are always TRUE/FALSE. * Remove more code. --- .../System/Reflection/Emit/AssemblyBuilder.Mono.cs | 46 +- .../Reflection/Emit/ConstructorBuilder.Mono.cs | 3 +- .../System/Reflection/Emit/MethodBuilder.Mono.cs | 3 +- .../System/Reflection/Emit/ModuleBuilder.Mono.cs | 7 +- .../src/System/Reflection/Emit/TypeBuilder.Mono.cs | 1 - src/mono/mono/metadata/class.c | 5 - src/mono/mono/metadata/domain.c | 2 - src/mono/mono/metadata/dynamic-image.c | 2 - src/mono/mono/metadata/icall.c | 5 - src/mono/mono/metadata/metadata-internals.h | 5 - src/mono/mono/metadata/object-internals.h | 49 +- src/mono/mono/metadata/sre-encode.c | 502 +-------------------- src/mono/mono/metadata/sre-internals.h | 21 - src/mono/mono/metadata/sre.c | 205 +-------- src/mono/mono/mini/method-to-ir.c | 2 +- src/mono/mono/mini/mini.c | 3 +- 16 files changed, 37 insertions(+), 824 deletions(-) diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.Mono.cs index 34eaf34..32d869b 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.Mono.cs @@ -178,39 +178,18 @@ namespace System.Reflection.Emit // #region Sync with RuntimeAssembly.cs and ReflectionAssembly in object-internals.h internal IntPtr _mono_assembly; - private object? _evidence; private UIntPtr dynamic_assembly; /* GC-tracked */ - private MethodInfo? entry_point; private ModuleBuilder[] modules; private string? name; - private string? dir; private CustomAttributeBuilder[]? cattrs; - private object? resources; - private byte[]? public_key; private string? version; private string? culture; - private uint algid; - private uint flags; - private PEFileKinds pekind = PEFileKinds.Dll; - private bool delay_sign; - private uint access; private Module[]? loaded_modules; - private object? win32_resources; - private object? permissions_minimum; - private object? permissions_optional; - private object? permissions_refused; - private int peKind; - private int machine; - private bool corlib_internal; - private Type[]? type_forwarders; - private byte[]? pktoken; + private uint access; #endregion private AssemblyName aname; - private string? assemblyName; - private bool created; - private string? versioninfo_culture; private ModuleBuilder manifest_module; private bool manifest_module_used; @@ -221,8 +200,8 @@ namespace System.Reflection.Emit [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern void UpdateNativeCustomAttributes(AssemblyBuilder ab); - [DynamicDependency(nameof(pktoken))] // Automatically keeps all previous fields too due to StructLayout - private AssemblyBuilder(AssemblyName n, string? directory, AssemblyBuilderAccess access, bool corlib_internal) + [DynamicDependency(nameof(access))] // Automatically keeps all previous fields too due to StructLayout + private AssemblyBuilder(AssemblyName n, AssemblyBuilderAccess access) { aname = (AssemblyName)n.Clone(); @@ -233,16 +212,10 @@ namespace System.Reflection.Emit name = n.Name; this.access = (uint)access; - flags = (uint)n.Flags; - - dir = directory; /* Set defaults from n */ if (n.CultureInfo != null) - { culture = n.CultureInfo.Name; - versioninfo_culture = n.CultureInfo.Name; - } Version? v = n.Version; if (v != null) { @@ -265,7 +238,7 @@ namespace System.Reflection.Emit { get { - return entry_point; + return null; } } @@ -287,7 +260,7 @@ namespace System.Reflection.Emit if (name == null) throw new ArgumentNullException(nameof(name)); - return new AssemblyBuilder(name, null, access, false); + return new AssemblyBuilder(name, access); } public static AssemblyBuilder DefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access, IEnumerable? assemblyAttributes) @@ -366,6 +339,7 @@ namespace System.Reflection.Emit { throw not_supported(); } + public override Stream? GetManifestResourceStream(Type type, string name) { throw not_supported(); @@ -379,14 +353,6 @@ namespace System.Reflection.Emit } } - internal string? AssemblyDir - { - get - { - return dir; - } - } - public void SetCustomAttribute(CustomAttributeBuilder customBuilder) { if (customBuilder == null) diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorBuilder.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorBuilder.Mono.cs index b3127b9..0afee6f 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorBuilder.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorBuilder.Mono.cs @@ -57,12 +57,11 @@ namespace System.Reflection.Emit private bool init_locals = true; private Type[][]? paramModReq; private Type[][]? paramModOpt; - private object? permissions; #endregion internal bool finished; - [DynamicDependency(nameof(permissions))] // Automatically keeps all previous fields too due to StructLayout + [DynamicDependency(nameof(paramModOpt))] // Automatically keeps all previous fields too due to StructLayout internal ConstructorBuilder(TypeBuilder tb, MethodAttributes attributes, CallingConventions callingConvention, Type[]? parameterTypes, Type[][]? paramModReq, Type[][]? paramModOpt) { attrs = attributes | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName; diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/MethodBuilder.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/MethodBuilder.Mono.cs index 680de9d..be43137 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/MethodBuilder.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/MethodBuilder.Mono.cs @@ -70,12 +70,11 @@ namespace System.Reflection.Emit private Type[]? returnModOpt; private Type[][]? paramModReq; private Type[][]? paramModOpt; - private object? permissions; #endregion private RuntimeMethodInfo? created; - [DynamicDependency(nameof(permissions))] // Automatically keeps all previous fields too due to StructLayout + [DynamicDependency(nameof(paramModOpt))] // Automatically keeps all previous fields too due to StructLayout internal MethodBuilder(TypeBuilder tb, string name, MethodAttributes attributes, CallingConventions callingConvention, Type? returnType, Type[]? returnModReq, Type[]? returnModOpt, Type[]? parameterTypes, Type[][]? paramModReq, Type[][]? paramModOpt) { this.name = name; diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/ModuleBuilder.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/ModuleBuilder.Mono.cs index a8c1de2..fe7643a 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/ModuleBuilder.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/ModuleBuilder.Mono.cs @@ -62,7 +62,6 @@ namespace System.Reflection.Emit private int num_types; private TypeBuilder[]? types; private CustomAttributeBuilder[]? cattrs; - private byte[] guid; private int table_idx; internal AssemblyBuilder assemblyb; private object[]? global_methods; @@ -73,6 +72,7 @@ namespace System.Reflection.Emit private int[]? table_indexes; #endregion + private byte[] guid; private TypeBuilder? global_type; private Type? global_type_created; // name_cache keys are display names @@ -113,11 +113,6 @@ namespace System.Reflection.Emit string fullyQualifiedName = fqname; if (fullyQualifiedName == null) return null!; // FIXME: this should not return null - if (assemblyb.AssemblyDir != null) - { - fullyQualifiedName = Path.Combine(assemblyb.AssemblyDir, fullyQualifiedName); - fullyQualifiedName = Path.GetFullPath(fullyQualifiedName); - } return fullyQualifiedName; } diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs index a5b807d..4aa2fc0 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs @@ -71,7 +71,6 @@ namespace System.Reflection.Emit private PackingSize packing_size; private IntPtr generic_container; private GenericTypeParameterBuilder[]? generic_params; - private object? permissions; [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] private TypeInfo? created; diff --git a/src/mono/mono/metadata/class.c b/src/mono/mono/metadata/class.c index 3f95d66..3a8963c 100644 --- a/src/mono/mono/metadata/class.c +++ b/src/mono/mono/metadata/class.c @@ -5981,9 +5981,6 @@ can_access_type (MonoClass *access_klass, MonoClass *member_klass) MonoAssembly *access_klass_assembly = m_class_get_image (access_klass)->assembly; MonoAssembly *member_klass_assembly = m_class_get_image (member_klass)->assembly; - if (access_klass_assembly && m_class_get_image (access_klass)->assembly->corlib_internal) - return TRUE; - if (m_class_get_element_class (access_klass) && !m_class_is_enumtype (access_klass)) { access_klass = m_class_get_element_class (access_klass); access_klass_assembly = m_class_get_image (access_klass)->assembly; @@ -6046,8 +6043,6 @@ can_access_member (MonoClass *access_klass, MonoClass *member_klass, MonoClass* { MonoClass *member_generic_def; MonoAssembly *access_klass_assembly = m_class_get_image (access_klass)->assembly; - if (access_klass_assembly && access_klass_assembly->corlib_internal) - return TRUE; MonoGenericClass *access_gklass = mono_class_try_get_generic_class (access_klass); if (((access_gklass && access_gklass->container_class) || diff --git a/src/mono/mono/metadata/domain.c b/src/mono/mono/metadata/domain.c index ccc923c..fc1c197 100644 --- a/src/mono/mono/metadata/domain.c +++ b/src/mono/mono/metadata/domain.c @@ -1699,8 +1699,6 @@ mono_domain_get_assemblies (MonoDomain *domain, gboolean refonly) gboolean ass_ref_only = mono_asmctx_get_kind (&ass->context) == MONO_ASMCTX_REFONLY; if (refonly != ass_ref_only) continue; - if (ass->corlib_internal) - continue; g_ptr_array_add (assemblies, ass); } mono_domain_assemblies_unlock (domain); diff --git a/src/mono/mono/metadata/dynamic-image.c b/src/mono/mono/metadata/dynamic-image.c index 3b149cf..d6e31c0 100644 --- a/src/mono/mono/metadata/dynamic-image.c +++ b/src/mono/mono/metadata/dynamic-image.c @@ -395,8 +395,6 @@ mono_dynamic_image_create (MonoDynamicAssembly *assembly, char *assembly_name, c } image->image.assembly = (MonoAssembly*)assembly; - image->run = assembly->run; - image->save = assembly->save; image->pe_kind = 0x1; /* ILOnly */ image->machine = 0x14c; /* I386 */ diff --git a/src/mono/mono/metadata/icall.c b/src/mono/mono/metadata/icall.c index 771119e..eb251e8 100644 --- a/src/mono/mono/metadata/icall.c +++ b/src/mono/mono/metadata/icall.c @@ -3564,11 +3564,6 @@ ves_icall_InternalInvoke (MonoReflectionMethodHandle method_handle, MonoObjectHa exception = mono_get_exception_invalid_operation ("It is illegal to invoke a method on a type loaded using the ReflectionOnly api."); goto return_null; } - - if (image_is_dynamic (image) && !((MonoDynamicImage*)image)->run) { - exception = mono_get_exception_not_supported ("Cannot invoke a method in a dynamic assembly without run access."); - goto return_null; - } if (m_class_get_rank (m->klass) && !strcmp (m->name, ".ctor")) { int i; diff --git a/src/mono/mono/metadata/metadata-internals.h b/src/mono/mono/metadata/metadata-internals.h index e5a1349..71b844f 100644 --- a/src/mono/mono/metadata/metadata-internals.h +++ b/src/mono/mono/metadata/metadata-internals.h @@ -224,7 +224,6 @@ struct _MonoAssembly { guint8 friend_assembly_names_inited; guint8 in_gac; guint8 dynamic; - guint8 corlib_internal; MonoAssemblyContext context; guint8 wrap_non_exception_throws; guint8 wrap_non_exception_throws_inited; @@ -669,8 +668,6 @@ struct _MonoDynamicAssembly { MonoAssembly assembly; char *strong_name; guint32 strong_name_size; - guint8 run; - guint8 save; MonoDomain *domain; }; @@ -709,8 +706,6 @@ struct _MonoDynamicImage { * Maps final token values to the object they describe. */ MonoGHashTable *remapped_tokens; - gboolean run; - gboolean save; gboolean initial_image; guint32 pe_kind, machine; char *strong_name; diff --git a/src/mono/mono/metadata/object-internals.h b/src/mono/mono/metadata/object-internals.h index 186eced..bfcc1a4 100644 --- a/src/mono/mono/metadata/object-internals.h +++ b/src/mono/mono/metadata/object-internals.h @@ -903,8 +903,6 @@ TYPED_HANDLE_DECL (MonoReflectionMethodBody); struct _MonoReflectionAssembly { MonoObject object; MonoAssembly *assembly; - /* CAS related */ - MonoObject *evidence; /* Evidence */ }; typedef struct { @@ -1050,7 +1048,6 @@ typedef struct { MonoBoolean init_locals; MonoArray *param_modreq; MonoArray *param_modopt; - MonoArray *permissions; } MonoReflectionCtorBuilder; /* Safely access System.Reflection.Emit.ConstructorBuilder from native code */ @@ -1084,7 +1081,6 @@ typedef struct { MonoArray *return_modopt; MonoArray *param_modreq; MonoArray *param_modopt; - MonoArray *permissions; } MonoReflectionMethodBuilder; /* Safely access System.Reflection.Emit.MethodBuilder from native code */ @@ -1105,54 +1101,15 @@ typedef struct { TYPED_HANDLE_DECL (MonoReflectionArrayMethod); typedef struct { - MonoArray *data; - MonoString *name; - MonoString *filename; - guint32 attrs; - guint32 offset; - MonoObject *stream; -} MonoReflectionResource; - -typedef struct { - guint32 res_type; - guint32 res_id; - guint32 lang_id; - MonoArray *res_data; -} MonoReflectionWin32Resource; - -typedef struct { - guint32 action; - MonoString *pset; -} MonoReflectionPermissionSet; - -typedef struct { MonoReflectionAssembly assembly; MonoDynamicAssembly *dynamic_assembly; - MonoReflectionMethod *entry_point; MonoArray *modules; MonoString *name; - MonoString *dir; MonoArray *cattrs; - MonoArray *resources; - MonoArray *public_key; MonoString *version; MonoString *culture; - guint32 algid; - guint32 flags; - guint32 pekind; - MonoBoolean delay_sign; - guint32 access; MonoArray *loaded_modules; - MonoArray *win32_resources; - /* CAS related */ - MonoArray *permissions_minimum; - MonoArray *permissions_optional; - MonoArray *permissions_refused; - gint32 pe_kind; - gint32 machine; - MonoBoolean corlib_internal; - MonoArray *type_forwarders; - MonoArray *pktoken; /* as hexadecimal byte[] */ + guint32 access; } MonoReflectionAssemblyBuilder; /* Safely access System.Reflection.Emit.AssemblyBuilder from native code */ @@ -1217,11 +1174,8 @@ typedef struct { gint32 num_types; MonoArray *types; MonoArray *cattrs; - MonoArray *guid; guint32 table_idx; MonoReflectionAssemblyBuilder *assemblyb; - MonoArray *global_methods; - MonoArray *global_fields; gboolean is_main; MonoArray *resources; GHashTable *unparented_classes; @@ -1260,7 +1214,6 @@ struct _MonoReflectionTypeBuilder { gint32 packing_size; MonoGenericContainer *generic_container; MonoArray *generic_params; - MonoArray *permissions; MonoReflectionType *created; gint32 state; }; diff --git a/src/mono/mono/metadata/sre-encode.c b/src/mono/mono/metadata/sre-encode.c index 3478fe9..2858dfb 100644 --- a/src/mono/mono/metadata/sre-encode.c +++ b/src/mono/mono/metadata/sre-encode.c @@ -252,239 +252,6 @@ encode_reflection_type (MonoDynamicImage *assembly, MonoReflectionTypeHandle typ encode_type (assembly, t, buf); } -static void -encode_reflection_type_raw (MonoDynamicImage *assembly, MonoReflectionType* type_raw, SigBuffer *buf, MonoError *error) -{ - HANDLE_FUNCTION_ENTER (); /* FIXME callers of encode_reflection_type_raw should use handles */ - error_init (error); - MONO_HANDLE_DCL (MonoReflectionType, type); - encode_reflection_type (assembly, type, buf, error); - HANDLE_FUNCTION_RETURN (); -} - - -static void -encode_custom_modifiers (MonoDynamicImage *assembly, MonoArrayHandle modreq, MonoArrayHandle modopt, SigBuffer *buf, MonoError *error) -{ - HANDLE_FUNCTION_ENTER (); - MONO_REQ_GC_UNSAFE_MODE; - - int i; - - error_init (error); - - /* Have to follow .NET Framework behavior here. For an IL type spec like: - * int32 modreq(A) modreq(B) modopt(C) modopt(D) - * - * we emit: - * cmod_opt [encoding of D] cmod_opt [encoding of C] cmod_req [encoding of B] cmod_req [encoding of A] I4. - * - * Even though the reflection API specifies required and optional - * modifiers in separate arrays, the .NET Framework creates a typespec - * as above: required mods first, then optional. (And so we emit the - * optional ones first, then required). - */ - - if (!MONO_HANDLE_IS_NULL (modopt)) { - int count = mono_array_handle_length (modopt); - g_assert (count > 0); - for (i = count - 1; i >= 0 ; --i) { - MonoType *mod = mono_type_array_get_and_resolve (modopt, i, error); - goto_if_nok (error, leave); - sigbuffer_add_byte (buf, MONO_TYPE_CMOD_OPT); - sigbuffer_add_value (buf, mono_image_typedef_or_ref (assembly, mod)); - } - } - if (!MONO_HANDLE_IS_NULL (modreq)) { - int count = mono_array_handle_length (modreq); - g_assert (count > 0); - for (i = count - 1; i >= 0 ; --i) { - MonoType *mod = mono_type_array_get_and_resolve (modreq, i, error); - goto_if_nok (error, leave); - sigbuffer_add_byte (buf, MONO_TYPE_CMOD_REQD); - sigbuffer_add_value (buf, mono_image_typedef_or_ref (assembly, mod)); - } - } - -leave: - HANDLE_FUNCTION_RETURN (); -} - -static void -encode_custom_modifiers_raw (MonoDynamicImage *assembly, MonoArray *modreq_raw, MonoArray *modopt_raw, SigBuffer *buf, MonoError *error) -{ - HANDLE_FUNCTION_ENTER (); /* FIXME callers of encode_custom_modifiers_raw should use handles */ - error_init (error); - MONO_HANDLE_DCL (MonoArray, modreq); - MONO_HANDLE_DCL (MonoArray, modopt); - encode_custom_modifiers (assembly, modreq, modopt, buf, error); - HANDLE_FUNCTION_RETURN (); -} - - -#ifndef DISABLE_REFLECTION_EMIT -guint32 -mono_dynimage_encode_method_signature (MonoDynamicImage *assembly, MonoMethodSignature *sig) -{ - MONO_REQ_GC_UNSAFE_MODE; - - SigBuffer buf; - int i; - guint32 nparams = sig->param_count; - guint32 idx; - - if (!assembly->save) - return 0; - - sigbuffer_init (&buf, 32); - /* - * FIXME: vararg, explicit_this, differenc call_conv values... - */ - idx = sig->call_convention; - if (sig->hasthis) - idx |= 0x20; /* hasthis */ - if (sig->generic_param_count) - idx |= 0x10; /* generic */ - sigbuffer_add_byte (&buf, idx); - if (sig->generic_param_count) - sigbuffer_add_value (&buf, sig->generic_param_count); - sigbuffer_add_value (&buf, nparams); - encode_type (assembly, sig->ret, &buf); - for (i = 0; i < nparams; ++i) { - if (i == sig->sentinelpos) - sigbuffer_add_byte (&buf, MONO_TYPE_SENTINEL); - encode_type (assembly, sig->params [i], &buf); - } - idx = sigbuffer_add_to_blob_cached (assembly, &buf); - sigbuffer_free (&buf); - return idx; -} -#else /* DISABLE_REFLECTION_EMIT */ -guint32 -mono_dynimage_encode_method_signature (MonoDynamicImage *assembly, MonoMethodSignature *sig) -{ - g_assert_not_reached (); - return 0; -} -#endif - -guint32 -mono_dynimage_encode_method_builder_signature (MonoDynamicImage *assembly, ReflectionMethodBuilder *mb, MonoError *error) -{ - MONO_REQ_GC_UNSAFE_MODE; - - error_init (error); - - /* - * FIXME: reuse code from method_encode_signature(). - */ - SigBuffer buf; - int i; - guint32 nparams = mb->parameters ? mono_array_length_internal (mb->parameters): 0; - guint32 ngparams = mb->generic_params ? mono_array_length_internal (mb->generic_params): 0; - guint32 notypes = mb->opt_types ? mono_array_length_internal (mb->opt_types): 0; - guint32 idx; - - sigbuffer_init (&buf, 32); - /* LAMESPEC: all the call conv spec is foobared */ - idx = mb->call_conv & 0x60; /* has-this, explicit-this */ - if (mb->call_conv & 2) - idx |= 0x5; /* vararg */ - if (!(mb->attrs & METHOD_ATTRIBUTE_STATIC)) - idx |= 0x20; /* hasthis */ - if (ngparams) - idx |= 0x10; /* generic */ - sigbuffer_add_byte (&buf, idx); - if (ngparams) - sigbuffer_add_value (&buf, ngparams); - sigbuffer_add_value (&buf, nparams + notypes); - encode_custom_modifiers_raw (assembly, mb->return_modreq, mb->return_modopt, &buf, error); - goto_if_nok (error, leave); - encode_reflection_type_raw (assembly, mb->rtype, &buf, error); - goto_if_nok (error, leave); - for (i = 0; i < nparams; ++i) { - MonoArray *modreq = NULL; - MonoArray *modopt = NULL; - MonoReflectionType *pt; - - if (mb->param_modreq && (i < mono_array_length_internal (mb->param_modreq))) - modreq = mono_array_get_internal (mb->param_modreq, MonoArray*, i); - if (mb->param_modopt && (i < mono_array_length_internal (mb->param_modopt))) - modopt = mono_array_get_internal (mb->param_modopt, MonoArray*, i); - encode_custom_modifiers_raw (assembly, modreq, modopt, &buf, error); - goto_if_nok (error, leave); - pt = mono_array_get_internal (mb->parameters, MonoReflectionType*, i); - encode_reflection_type_raw (assembly, pt, &buf, error); - goto_if_nok (error, leave); - } - if (notypes) - sigbuffer_add_byte (&buf, MONO_TYPE_SENTINEL); - for (i = 0; i < notypes; ++i) { - MonoReflectionType *pt; - - pt = mono_array_get_internal (mb->opt_types, MonoReflectionType*, i); - encode_reflection_type_raw (assembly, pt, &buf, error); - goto_if_nok (error, leave); - } - - idx = sigbuffer_add_to_blob_cached (assembly, &buf); -leave: - sigbuffer_free (&buf); - return idx; -} - -guint32 -mono_dynimage_encode_locals (MonoDynamicImage *assembly, MonoReflectionILGen *ilgen, MonoError *error) -{ - MONO_REQ_GC_UNSAFE_MODE; - - error_init (error); - - MonoDynamicTable *table; - guint32 *values; - guint32 idx, sig_idx; - guint nl = mono_array_length_internal (ilgen->locals); - SigBuffer buf; - int i; - - sigbuffer_init (&buf, 32); - sigbuffer_add_value (&buf, 0x07); - sigbuffer_add_value (&buf, nl); - for (i = 0; i < nl; ++i) { - MonoReflectionLocalBuilder *lb = mono_array_get_internal (ilgen->locals, MonoReflectionLocalBuilder*, i); - - if (lb->is_pinned) - sigbuffer_add_value (&buf, MONO_TYPE_PINNED); - - encode_reflection_type_raw (assembly, (MonoReflectionType*)lb->type, &buf, error); - if (!is_ok (error)) { - sigbuffer_free (&buf); - return 0; - } - } - sig_idx = sigbuffer_add_to_blob_cached (assembly, &buf); - sigbuffer_free (&buf); - - if (assembly->standalonesig_cache == NULL) - assembly->standalonesig_cache = g_hash_table_new (NULL, NULL); - idx = GPOINTER_TO_UINT (g_hash_table_lookup (assembly->standalonesig_cache, GUINT_TO_POINTER (sig_idx))); - if (idx) - return idx; - - table = &assembly->tables [MONO_TABLE_STANDALONESIG]; - idx = table->next_idx ++; - table->rows ++; - alloc_table (table, table->rows); - values = table->values + idx * MONO_STAND_ALONE_SIGNATURE_SIZE; - - values [MONO_STAND_ALONE_SIGNATURE] = sig_idx; - - g_hash_table_insert (assembly->standalonesig_cache, GUINT_TO_POINTER (sig_idx), GUINT_TO_POINTER (idx)); - - return idx; -} - - /* * Copy len * nelem bytes from val to dest, swapping bytes to LE if necessary. * dest may be misaligned. @@ -630,150 +397,20 @@ handle_enum: return idx; } -guint32 -mono_dynimage_encode_field_signature (MonoDynamicImage *assembly, MonoReflectionFieldBuilder *fb, MonoError *error) -{ - MONO_REQ_GC_UNSAFE_MODE; - - error_init (error); - - SigBuffer buf; - guint32 idx; - guint32 typespec = 0; - MonoType *type; - MonoClass *klass; - - type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type, error); - return_val_if_nok (error, 0); - klass = mono_class_from_mono_type_internal (type); - - sigbuffer_init (&buf, 32); - - sigbuffer_add_value (&buf, 0x06); - encode_custom_modifiers_raw (assembly, fb->modreq, fb->modopt, &buf, error); - goto_if_nok (error, fail); - /* encode custom attributes before the type */ - - if (mono_class_is_gtd (klass)) - typespec = create_typespec (assembly, type); - - if (typespec) { - MonoGenericClass *gclass; - gclass = mono_metadata_lookup_generic_class (klass, mono_class_get_generic_container (klass)->context.class_inst, TRUE); - encode_generic_class (assembly, gclass, &buf); - } else { - encode_type (assembly, type, &buf); - } - idx = sigbuffer_add_to_blob_cached (assembly, &buf); - sigbuffer_free (&buf); - return idx; -fail: - sigbuffer_free (&buf); - return 0; -} - -#ifndef DISABLE_REFLECTION_EMIT -/*field_image is the image to which the eventual custom mods have been encoded against*/ -guint32 -mono_dynimage_encode_fieldref_signature (MonoDynamicImage *assembly, MonoImage *field_image, MonoType *type) -{ - MONO_REQ_GC_NEUTRAL_MODE; - - SigBuffer buf; - guint32 idx, i, token; - - if (!assembly->save) - return 0; - - sigbuffer_init (&buf, 32); - - sigbuffer_add_value (&buf, 0x06); - /* encode custom attributes before the type */ - if (type->has_cmods) { - MonoCustomModContainer *cmods = mono_type_get_cmods (type); - for (i = 0; i < cmods->count; ++i) { - if (field_image) { - ERROR_DECL (error); - MonoClass *klass = mono_class_get_checked (field_image, cmods->modifiers [i].token, error); - g_assert (is_ok (error)); /* FIXME don't swallow the error */ - - token = mono_image_typedef_or_ref (assembly, m_class_get_byval_arg (klass)); - } else { - token = cmods->modifiers [i].token; - } - - if (cmods->modifiers [i].required) - sigbuffer_add_byte (&buf, MONO_TYPE_CMOD_REQD); - else - sigbuffer_add_byte (&buf, MONO_TYPE_CMOD_OPT); - - sigbuffer_add_value (&buf, token); - } - } - encode_type (assembly, type, &buf); - idx = sigbuffer_add_to_blob_cached (assembly, &buf); - sigbuffer_free (&buf); - return idx; -} -#else /* DISABLE_REFLECTION_EMIT */ -guint32 -mono_dynimage_encode_fieldref_signature (MonoDynamicImage *assembly, MonoImage *field_image, MonoType *type) -{ - g_assert_not_reached (); - return 0; -} -#endif /* DISABLE_REFLECTION_EMIT */ - static guint32 create_typespec (MonoDynamicImage *assembly, MonoType *type) { MONO_REQ_GC_NEUTRAL_MODE; MonoDynamicTable *table; - guint32 *values; guint32 token; - SigBuffer buf; if ((token = GPOINTER_TO_UINT (g_hash_table_lookup (assembly->typespec, type)))) return token; - sigbuffer_init (&buf, 32); - switch (type->type) { - case MONO_TYPE_FNPTR: - case MONO_TYPE_PTR: - case MONO_TYPE_SZARRAY: - case MONO_TYPE_ARRAY: - case MONO_TYPE_VAR: - case MONO_TYPE_MVAR: - case MONO_TYPE_GENERICINST: - encode_type (assembly, type, &buf); - break; - case MONO_TYPE_CLASS: - case MONO_TYPE_VALUETYPE: { - MonoClass *k = mono_class_from_mono_type_internal (type); - if (!k || !mono_class_is_gtd (k)) { - sigbuffer_free (&buf); - return 0; - } - encode_type (assembly, type, &buf); - break; - } - default: - sigbuffer_free (&buf); - return 0; - } - table = &assembly->tables [MONO_TABLE_TYPESPEC]; - if (assembly->save) { - token = sigbuffer_add_to_blob_cached (assembly, &buf); - alloc_table (table, table->rows + 1); - values = table->values + table->next_idx * MONO_TYPESPEC_SIZE; - values [MONO_TYPESPEC_SIGNATURE] = token; - } - sigbuffer_free (&buf); - token = MONO_TYPEDEFORREF_TYPESPEC | (table->next_idx << MONO_TYPEDEFORREF_BITS); - g_hash_table_insert (assembly->typespec, type, GUINT_TO_POINTER(token)); + g_hash_table_insert (assembly->typespec, type, GUINT_TO_POINTER (token)); table->next_idx ++; return token; } @@ -785,7 +422,6 @@ mono_dynimage_encode_typedef_or_ref_full (MonoDynamicImage *assembly, MonoType * HANDLE_FUNCTION_ENTER (); MonoDynamicTable *table; - guint32 *values; guint32 token, scope, enclosing; MonoClass *klass; @@ -819,18 +455,10 @@ mono_dynimage_encode_typedef_or_ref_full (MonoDynamicImage *assembly, MonoType * scope = mono_reflection_resolution_scope_from_image (assembly, m_class_get_image (klass)); } table = &assembly->tables [MONO_TABLE_TYPEREF]; - if (assembly->save) { - alloc_table (table, table->rows + 1); - values = table->values + table->next_idx * MONO_TYPEREF_SIZE; - values [MONO_TYPEREF_SCOPE] = scope; - values [MONO_TYPEREF_NAME] = mono_dynstream_insert_string (&assembly->sheap, m_class_get_name (klass)); - values [MONO_TYPEREF_NAMESPACE] = mono_dynstream_insert_string (&assembly->sheap, m_class_get_name_space (klass)); - } token = MONO_TYPEDEFORREF_TYPEREF | (table->next_idx << MONO_TYPEDEFORREF_BITS); /* typeref */ g_hash_table_insert (assembly->typeref, type, GUINT_TO_POINTER(token)); table->next_idx ++; - if (!MONO_HANDLE_IS_NULL (tb)) { /* This function is called multiple times from sre and sre-save, so same object is okay */ mono_dynamic_image_register_token (assembly, token, MONO_HANDLE_CAST (MonoObject, tb), MONO_DYN_IMAGE_TOK_SAME_OK); @@ -849,126 +477,6 @@ mono_image_typedef_or_ref (MonoDynamicImage *assembly, MonoType *type) return mono_dynimage_encode_typedef_or_ref_full (assembly, type, TRUE); } -guint32 -mono_dynimage_encode_generic_method_sig (MonoDynamicImage *assembly, MonoGenericContext *context) -{ - SigBuffer buf; - int i; - guint32 nparams = context->method_inst->type_argc; - guint32 idx; - - if (!assembly->save) - return 0; - - sigbuffer_init (&buf, 32); - /* - * FIXME: vararg, explicit_this, differenc call_conv values... - */ - sigbuffer_add_value (&buf, 0xa); /* FIXME FIXME FIXME */ - sigbuffer_add_value (&buf, nparams); - - for (i = 0; i < nparams; i++) - encode_type (assembly, context->method_inst->type_argv [i], &buf); - - idx = sigbuffer_add_to_blob_cached (assembly, &buf); - sigbuffer_free (&buf); - return idx; -} - -#ifndef DISABLE_REFLECTION_EMIT -static gboolean -encode_sighelper_arg (MonoDynamicImage *assembly, int i, MonoArrayHandle helper_arguments, MonoArrayHandle helper_modreqs, MonoArrayHandle helper_modopts, SigBuffer* buf, MonoError *error) -{ - HANDLE_FUNCTION_ENTER(); - error_init (error); - MonoArrayHandle modreqs = MONO_HANDLE_NEW (MonoArray, NULL); - MonoArrayHandle modopts = MONO_HANDLE_NEW (MonoArray, NULL); - - if (!MONO_HANDLE_IS_NULL (helper_modreqs) && (i < mono_array_handle_length (helper_modreqs))) - MONO_HANDLE_ARRAY_GETREF (modreqs, helper_modreqs, i); - if (!MONO_HANDLE_IS_NULL (helper_modopts) && (i < mono_array_handle_length (helper_modopts))) - MONO_HANDLE_ARRAY_GETREF (modopts, helper_modopts, i); - - encode_custom_modifiers (assembly, modreqs, modopts, buf, error); - goto_if_nok (error, leave); - MonoReflectionTypeHandle pt; - pt = MONO_HANDLE_NEW (MonoReflectionType, NULL); - MONO_HANDLE_ARRAY_GETREF (pt, helper_arguments, i); - encode_reflection_type (assembly, pt, buf, error); - goto_if_nok (error, leave); -leave: - HANDLE_FUNCTION_RETURN_VAL (is_ok (error)); -} - -guint32 -mono_dynimage_encode_reflection_sighelper (MonoDynamicImage *assembly, MonoReflectionSigHelperHandle helper, MonoError *error) -{ - SigBuffer buf; - guint32 nargs; - guint32 i, idx; - - error_init (error); - - if (!assembly->save) - return 0; - - /* FIXME: this means SignatureHelper.SignatureHelpType.HELPER_METHOD */ - g_assert (MONO_HANDLE_GETVAL (helper, type) == 2); - - MonoArrayHandle arguments = MONO_HANDLE_NEW_GET (MonoArray, helper, arguments); - if (!MONO_HANDLE_IS_NULL (arguments)) - nargs = mono_array_handle_length (arguments); - else - nargs = 0; - - sigbuffer_init (&buf, 32); - - /* Encode calling convention */ - /* Change Any to Standard */ - if ((MONO_HANDLE_GETVAL (helper, call_conv) & 0x03) == 0x03) - MONO_HANDLE_SETVAL (helper, call_conv, guint32, 0x01); - /* explicit_this implies has_this */ - if (MONO_HANDLE_GETVAL (helper, call_conv) & 0x40) - MONO_HANDLE_SETVAL (helper, call_conv, guint32, MONO_HANDLE_GETVAL (helper, call_conv) & 0x20); - - if (MONO_HANDLE_GETVAL (helper, call_conv) == 0) { /* Unmanaged */ - idx = MONO_HANDLE_GETVAL (helper, unmanaged_call_conv) - 1; - } else { - /* Managed */ - idx = MONO_HANDLE_GETVAL (helper, call_conv) & 0x60; /* has_this + explicit_this */ - if (MONO_HANDLE_GETVAL (helper, call_conv) & 0x02) /* varargs */ - idx += 0x05; - } - - sigbuffer_add_byte (&buf, idx); - sigbuffer_add_value (&buf, nargs); - encode_reflection_type (assembly, MONO_HANDLE_NEW_GET (MonoReflectionType, helper, return_type), &buf, error); - goto_if_nok (error, fail); - MonoArrayHandle modreqs; - modreqs = MONO_HANDLE_NEW_GET (MonoArray, helper, modreqs); - MonoArrayHandle modopts; - modopts = MONO_HANDLE_NEW_GET (MonoArray, helper, modopts); - for (i = 0; i < nargs; ++i) { - if (!encode_sighelper_arg (assembly, i, arguments, modreqs, modopts, &buf, error)) - goto fail; - } - idx = sigbuffer_add_to_blob_cached (assembly, &buf); - sigbuffer_free (&buf); - - return idx; -fail: - sigbuffer_free (&buf); - return 0; -} -#else /* DISABLE_REFLECTION_EMIT */ -guint32 -mono_dynimage_encode_reflection_sighelper (MonoDynamicImage *assembly, MonoReflectionSigHelperHandle helper, MonoError *error) -{ - g_assert_not_reached (); - return 0; -} -#endif /* DISABLE_REFLECTION_EMIT */ - static gboolean encode_reflection_types (MonoDynamicImage *assembly, MonoArrayHandle sig_arguments, int i, SigBuffer *buf, MonoError *error) { @@ -1056,14 +564,6 @@ fail: return MONO_HANDLE_CAST (MonoArray, NULL_HANDLE); } -static char* -type_get_fully_qualified_name (MonoType *type) -{ - MONO_REQ_GC_NEUTRAL_MODE; - - return mono_type_get_name_full (type, MONO_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED); -} - #ifndef DISABLE_REFLECTION_EMIT MonoArrayHandle ves_icall_SignatureHelper_get_signature_local (MonoReflectionSigHelperHandle sig, MonoError *error) diff --git a/src/mono/mono/metadata/sre-internals.h b/src/mono/mono/metadata/sre-internals.h index 5aa1919..f492251 100644 --- a/src/mono/mono/metadata/sre-internals.h +++ b/src/mono/mono/metadata/sre-internals.h @@ -45,7 +45,6 @@ typedef struct { MonoArray *return_modopt; MonoArray *param_modreq; MonoArray *param_modopt; - MonoArray *permissions; MonoMethod *mhandle; guint32 nrefs; gpointer *refs; @@ -125,29 +124,9 @@ guint32 mono_dynimage_encode_constant (MonoDynamicImage *assembly, MonoObject *val, MonoTypeEnum *ret_type); guint32 -mono_dynimage_encode_locals (MonoDynamicImage *assembly, MonoReflectionILGen *ilgen, MonoError *error); - -guint32 -mono_dynimage_encode_fieldref_signature (MonoDynamicImage *assembly, MonoImage *field_image, MonoType *type); - -guint32 -mono_dynimage_encode_method_signature (MonoDynamicImage *assembly, MonoMethodSignature *sig); - -guint32 -mono_dynimage_encode_method_builder_signature (MonoDynamicImage *assembly, ReflectionMethodBuilder *mb, - MonoError *error); - -guint32 -mono_dynimage_encode_generic_method_sig (MonoDynamicImage *assembly, MonoGenericContext *context); - -guint32 mono_dynimage_encode_typedef_or_ref_full (MonoDynamicImage *assembly, MonoType *type, gboolean try_typespec); guint32 -mono_dynimage_encode_reflection_sighelper (MonoDynamicImage *assembly, MonoReflectionSigHelperHandle helper, - MonoError *error); - -guint32 mono_image_get_methodref_token (MonoDynamicImage *assembly, MonoMethod *method, gboolean create_typespec); #endif /* __MONO_METADATA_SRE_INTERNALS_H__ */ diff --git a/src/mono/mono/metadata/sre.c b/src/mono/mono/metadata/sre.c index 1e40e4c..3fd5ce5 100644 --- a/src/mono/mono/metadata/sre.c +++ b/src/mono/mono/metadata/sre.c @@ -511,8 +511,6 @@ mono_reflection_methodbuilder_from_method_builder (ReflectionMethodBuilder *rmb, MONO_HANDLE_PIN (rmb->param_modreq); rmb->param_modopt = mb->param_modopt; MONO_HANDLE_PIN (rmb->param_modopt); - rmb->permissions = mb->permissions; - MONO_HANDLE_PIN (rmb->permissions); rmb->mhandle = mb->mhandle; rmb->nrefs = 0; rmb->refs = NULL; @@ -571,8 +569,6 @@ mono_reflection_methodbuilder_from_ctor_builder (ReflectionMethodBuilder *rmb, M MONO_HANDLE_PIN (rmb->param_modreq); rmb->param_modopt = mb->param_modopt; MONO_HANDLE_PIN (rmb->param_modopt); - rmb->permissions = mb->permissions; - MONO_HANDLE_PIN (rmb->permissions); rmb->mhandle = mb->mhandle; rmb->nrefs = 0; rmb->refs = NULL; @@ -612,7 +608,6 @@ reflection_methodbuilder_from_dynamic_method (ReflectionMethodBuilder *rmb, Mono rmb->return_modopt = NULL; rmb->param_modreq = NULL; rmb->param_modopt = NULL; - rmb->permissions = NULL; rmb->mhandle = mb->mhandle; rmb->nrefs = 0; rmb->refs = NULL; @@ -633,41 +628,14 @@ mono_reflection_methodbuilder_from_ctor_builder (ReflectionMethodBuilder *rmb, M #ifndef DISABLE_REFLECTION_EMIT static guint32 -mono_image_add_memberef_row (MonoDynamicImage *assembly, guint32 parent, const char *name, guint32 sig) +mono_image_add_memberef_row (MonoDynamicImage *assembly) { MONO_REQ_GC_NEUTRAL_MODE; MonoDynamicTable *table; - guint32 *values; - guint32 token, pclass; - - switch (parent & MONO_TYPEDEFORREF_MASK) { - case MONO_TYPEDEFORREF_TYPEREF: - pclass = MONO_MEMBERREF_PARENT_TYPEREF; - break; - case MONO_TYPEDEFORREF_TYPESPEC: - pclass = MONO_MEMBERREF_PARENT_TYPESPEC; - break; - case MONO_TYPEDEFORREF_TYPEDEF: - pclass = MONO_MEMBERREF_PARENT_TYPEDEF; - break; - default: - g_warning ("unknown typeref or def token 0x%08x for %s", parent, name); - return 0; - } - /* extract the index */ - parent >>= MONO_TYPEDEFORREF_BITS; + guint32 token; table = &assembly->tables [MONO_TABLE_MEMBERREF]; - - if (assembly->save) { - alloc_table (table, table->rows + 1); - values = table->values + table->next_idx * MONO_MEMBERREF_SIZE; - values [MONO_MEMBERREF_CLASS] = pclass | (parent << MONO_MEMBERREF_PARENT_BITS); - values [MONO_MEMBERREF_NAME] = string_heap_insert (&assembly->sheap, name); - values [MONO_MEMBERREF_SIGNATURE] = sig; - } - token = MONO_TOKEN_MEMBER_REF | table->next_idx; table->next_idx ++; @@ -681,12 +649,12 @@ mono_image_add_memberef_row (MonoDynamicImage *assembly, guint32 parent, const c * The sig param is an index to an already built signature. */ static guint32 -mono_image_get_memberref_token (MonoDynamicImage *assembly, MonoType *type, const char *name, guint32 sig) +mono_image_get_memberref_token (MonoDynamicImage *assembly, MonoType *type) { MONO_REQ_GC_NEUTRAL_MODE; - guint32 parent = mono_image_typedef_or_ref (assembly, type); - return mono_image_add_memberef_row (assembly, parent, name, sig); + mono_image_typedef_or_ref (assembly, type); + return mono_image_add_memberef_row (assembly); } @@ -718,8 +686,7 @@ mono_image_get_methodref_token (MonoDynamicImage *assembly, MonoMethod *method, sig = mono_metadata_signature_dup (mono_method_signature_internal (method)); if ((sig->call_convention != MONO_CALL_DEFAULT) && (sig->call_convention != MONO_CALL_VARARG)) sig->call_convention = MONO_CALL_DEFAULT; - token = mono_image_get_memberref_token (assembly, m_class_get_byval_arg (method->klass), - method->name, mono_dynimage_encode_method_signature (assembly, sig)); + token = mono_image_get_memberref_token (assembly, m_class_get_byval_arg (method->klass)); g_free (sig); g_hash_table_insert (assembly->handleref, method, GUINT_TO_POINTER(token)); } @@ -727,16 +694,6 @@ mono_image_get_methodref_token (MonoDynamicImage *assembly, MonoMethod *method, if (create_typespec) { MonoDynamicTable *table = &assembly->tables [MONO_TABLE_METHODSPEC]; g_assert (mono_metadata_token_table (token) == MONO_TABLE_MEMBERREF); - token = (mono_metadata_token_index (token) << MONO_METHODDEFORREF_BITS) | MONO_METHODDEFORREF_METHODREF; - - if (assembly->save) { - guint32 *values; - - alloc_table (table, table->rows + 1); - values = table->values + table->next_idx * MONO_METHODSPEC_SIZE; - values [MONO_METHODSPEC_METHOD] = token; - values [MONO_METHODSPEC_SIGNATURE] = mono_dynimage_encode_generic_method_sig (assembly, &mono_method_get_generic_container (method)->context); - } token = MONO_TOKEN_METHOD_SPEC | table->next_idx; table->next_idx ++; @@ -753,18 +710,8 @@ mono_image_get_varargs_method_token (MonoDynamicImage *assembly, guint32 origina { MonoDynamicTable *table; guint32 token; - guint32 *values; table = &assembly->tables [MONO_TABLE_MEMBERREF]; - - if (assembly->save) { - alloc_table (table, table->rows + 1); - values = table->values + table->next_idx * MONO_MEMBERREF_SIZE; - values [MONO_MEMBERREF_CLASS] = original; - values [MONO_MEMBERREF_NAME] = string_heap_insert (&assembly->sheap, name); - values [MONO_MEMBERREF_SIGNATURE] = sig; - } - token = MONO_TOKEN_MEMBER_REF | table->next_idx; table->next_idx ++; @@ -813,9 +760,7 @@ mono_image_get_fieldref_token (MonoDynamicImage *assembly, MonoClassField *field } else { type = mono_field_get_type_internal (field); } - token = mono_image_get_memberref_token (assembly, m_class_get_byval_arg (field->parent), - mono_field_get_name (field), - mono_dynimage_encode_fieldref_signature (assembly, field->parent->image, type)); + token = mono_image_get_memberref_token (assembly, m_class_get_byval_arg (field->parent)); g_hash_table_insert (assembly->handleref, field, GUINT_TO_POINTER(token)); return token; } @@ -824,8 +769,7 @@ static guint32 method_encode_methodspec (MonoDynamicImage *assembly, MonoMethod *method) { MonoDynamicTable *table; - guint32 *values; - guint32 token, mtoken = 0, sig; + guint32 token, mtoken; MonoMethodInflated *imethod; MonoMethod *declaring; @@ -835,32 +779,11 @@ method_encode_methodspec (MonoDynamicImage *assembly, MonoMethod *method) imethod = (MonoMethodInflated *) method; declaring = imethod->declaring; - sig = mono_dynimage_encode_method_signature (assembly, mono_method_signature_internal (declaring)); - mtoken = mono_image_get_memberref_token (assembly, m_class_get_byval_arg (method->klass), declaring->name, sig); + mtoken = mono_image_get_memberref_token (assembly, m_class_get_byval_arg (method->klass)); if (!mono_method_signature_internal (declaring)->generic_param_count) return mtoken; - switch (mono_metadata_token_table (mtoken)) { - case MONO_TABLE_MEMBERREF: - mtoken = (mono_metadata_token_index (mtoken) << MONO_METHODDEFORREF_BITS) | MONO_METHODDEFORREF_METHODREF; - break; - case MONO_TABLE_METHOD: - mtoken = (mono_metadata_token_index (mtoken) << MONO_METHODDEFORREF_BITS) | MONO_METHODDEFORREF_METHODDEF; - break; - default: - g_assert_not_reached (); - } - - sig = mono_dynimage_encode_generic_method_sig (assembly, mono_method_get_context (method)); - - if (assembly->save) { - alloc_table (table, table->rows + 1); - values = table->values + table->next_idx * MONO_METHODSPEC_SIZE; - values [MONO_METHODSPEC_METHOD] = mtoken; - values [MONO_METHODSPEC_SIGNATURE] = sig; - } - token = MONO_TOKEN_METHOD_SPEC | table->next_idx; table->next_idx ++; @@ -883,10 +806,7 @@ mono_image_get_methodspec_token (MonoDynamicImage *assembly, MonoMethod *method) if (mono_method_signature_internal (imethod->declaring)->generic_param_count) { token = method_encode_methodspec (assembly, method); } else { - guint32 sig = mono_dynimage_encode_method_signature ( - assembly, mono_method_signature_internal (imethod->declaring)); - token = mono_image_get_memberref_token ( - assembly, m_class_get_byval_arg (method->klass), method->name, sig); + token = mono_image_get_memberref_token (assembly, m_class_get_byval_arg (method->klass)); } g_hash_table_insert (assembly->handleref, method, GUINT_TO_POINTER(token)); @@ -896,14 +816,7 @@ mono_image_get_methodspec_token (MonoDynamicImage *assembly, MonoMethod *method) static guint32 mono_image_get_inflated_method_token (MonoDynamicImage *assembly, MonoMethod *m) { - MonoMethodInflated *imethod = (MonoMethodInflated *) m; - guint32 sig, token; - - sig = mono_dynimage_encode_method_signature (assembly, mono_method_signature_internal (imethod->declaring)); - token = mono_image_get_memberref_token ( - assembly, m_class_get_byval_arg (m->klass), m->name, sig); - - return token; + return mono_image_get_memberref_token (assembly, m_class_get_byval_arg (m->klass)); } static guint32 @@ -911,25 +824,18 @@ mono_image_get_sighelper_token (MonoDynamicImage *assembly, MonoReflectionSigHel { guint32 idx; MonoDynamicTable *table; - guint32 *values; error_init (error); table = &assembly->tables [MONO_TABLE_STANDALONESIG]; idx = table->next_idx ++; table->rows ++; - alloc_table (table, table->rows); - values = table->values + idx * MONO_STAND_ALONE_SIGNATURE_SIZE; - - values [MONO_STAND_ALONE_SIGNATURE] = - mono_dynimage_encode_reflection_sighelper (assembly, helper, error); - return_val_if_nok (error, 0); - return idx; } static int -reflection_cc_to_file (int call_conv) { +reflection_cc_to_file (int call_conv) +{ switch (call_conv & 0x3) { case 0: case 1: return MONO_CALL_DEFAULT; @@ -1012,8 +918,7 @@ mono_image_get_array_token (MonoDynamicImage *assembly, MonoReflectionArrayMetho am->name = name; am->sig = sig; am->parent = mtype; - am->token = mono_image_get_memberref_token (assembly, am->parent, name, - mono_dynimage_encode_method_signature (assembly, sig)); + am->token = mono_image_get_memberref_token (assembly, am->parent); assembly->array_methods = g_list_prepend (assembly->array_methods, am); MONO_HANDLE_SETVAL (m, table_idx, guint32, am->token & 0xffffff); return am->token; @@ -1038,10 +943,7 @@ guint32 mono_image_insert_string (MonoReflectionModuleBuilderHandle ref_module, MonoStringHandle str, MonoError *error) { HANDLE_FUNCTION_ENTER (); - guint32 idx; - char buf [16]; - char *b = buf; - guint32 token = 0; + guint32 idx, token = 0; MonoDynamicImage *assembly = MONO_HANDLE_GETVAL (ref_module, dynamic_image); if (!assembly) { @@ -1052,30 +954,7 @@ mono_image_insert_string (MonoReflectionModuleBuilderHandle ref_module, MonoStri } g_assert (assembly != NULL); - if (assembly->save) { - int32_t length = mono_string_length_internal (MONO_HANDLE_RAW (str)); - mono_metadata_encode_value (1 | (length * 2), b, &b); - idx = mono_image_add_stream_data (&assembly->us, buf, b-buf); - /* pinned */ - MonoGCHandle gchandle = mono_gchandle_from_handle (MONO_HANDLE_CAST (MonoObject, str), TRUE); - const char *p = (const char*)mono_string_chars_internal (MONO_HANDLE_RAW (str)); -#if G_BYTE_ORDER != G_LITTLE_ENDIAN - { - char *swapped = g_malloc (2 * length); - - swap_with_size (swapped, p, 2, length); - mono_image_add_stream_data (&assembly->us, swapped, length * 2); - g_free (swapped); - } -#else - mono_image_add_stream_data (&assembly->us, p, length * 2); -#endif - mono_gchandle_free_internal (gchandle); - mono_image_add_stream_data (&assembly->us, "", 1); - } else { - idx = assembly->us.index ++; - } - + idx = assembly->us.index ++; token = MONO_TOKEN_STRING | idx; mono_dynamic_image_register_token (assembly, token, MONO_HANDLE_CAST (MonoObject, str), MONO_DYN_IMAGE_TOK_NEW); @@ -1086,8 +965,7 @@ leave: static guint32 create_method_token (MonoDynamicImage *assembly, MonoMethod *method, MonoArrayHandle opt_param_types, MonoError *error) { - guint32 sig_token, parent; - + guint32 parent; int nargs = mono_array_handle_length (opt_param_types); MonoMethodSignature *old = mono_method_signature_internal (method); @@ -1118,9 +996,7 @@ create_method_token (MonoDynamicImage *assembly, MonoMethod *method, MonoArrayHa parent <<= MONO_MEMBERREF_PARENT_BITS; parent |= MONO_MEMBERREF_PARENT_TYPEREF; - sig_token = mono_dynimage_encode_method_signature (assembly, sig); - guint32 token; - token = mono_image_get_varargs_method_token (assembly, parent, method->name, sig_token); + guint32 token = mono_image_get_varargs_method_token (assembly, parent, method->name, 0); g_hash_table_insert (assembly->vararg_aux_hash, GUINT_TO_POINTER (token), sig); return token; fail: @@ -1308,25 +1184,6 @@ leave: #ifndef DISABLE_REFLECTION_EMIT -static gboolean -assemblybuilderaccess_can_refonlyload (guint32 access) -{ - return (access & 0x4) != 0; -} - -static gboolean -assemblybuilderaccess_can_run (guint32 access) -{ - return (access & MonoAssemblyBuilderAccess_Run) != 0; -} - -static gboolean -assemblybuilderaccess_can_save (guint32 access) -{ - return (access & MonoAssemblyBuilderAccess_Save) != 0; -} - - /* * mono_reflection_dynimage_basic_init: * @assembly: an assembly builder object @@ -1351,9 +1208,8 @@ mono_reflection_dynimage_basic_init (MonoReflectionAssemblyBuilder *assemblyb, M assembly->assembly.ref_count = 1; assembly->assembly.dynamic = TRUE; - assembly->assembly.corlib_internal = assemblyb->corlib_internal; assemblyb->assembly.assembly = (MonoAssembly*)assembly; - assembly->assembly.basedir = mono_string_to_utf8_checked_internal (assemblyb->dir, error); + assembly->assembly.basedir = NULL; return_if_nok (error); if (assemblyb->culture) { assembly->assembly.aname.culture = mono_string_to_utf8_checked_internal (assemblyb->culture, error); @@ -1384,9 +1240,7 @@ mono_reflection_dynimage_basic_init (MonoReflectionAssemblyBuilder *assemblyb, M /* SRE assemblies are loaded into the individual loading context, ie, * they only fire AssemblyResolve events, they don't cause probing for * referenced assemblies to happen. */ - assembly->assembly.context.kind = assemblybuilderaccess_can_refonlyload (assemblyb->access) ? MONO_ASMCTX_REFONLY : MONO_ASMCTX_INDIVIDUAL; - assembly->run = assemblybuilderaccess_can_run (assemblyb->access); - assembly->save = assemblybuilderaccess_can_save (assemblyb->access); + assembly->assembly.context.kind = MONO_ASMCTX_INDIVIDUAL; assembly->domain = domain; char *assembly_name = mono_string_to_utf8_checked_internal (assemblyb->name, error); @@ -1395,13 +1249,6 @@ mono_reflection_dynimage_basic_init (MonoReflectionAssemblyBuilder *assemblyb, M image->initial_image = TRUE; assembly->assembly.aname.name = image->image.name; assembly->assembly.image = &image->image; - if (assemblyb->pktoken && assemblyb->pktoken->max_length) { - /* -1 to correct for the trailing NULL byte */ - if (assemblyb->pktoken->max_length != MONO_PUBLIC_KEY_TOKEN_LENGTH - 1) { - g_error ("Public key token length invalid for assembly %s: %i", assembly->assembly.aname.name, assemblyb->pktoken->max_length); - } - memcpy (&assembly->assembly.aname.public_key_token, mono_array_addr_internal (assemblyb->pktoken, guint8, 0), assemblyb->pktoken->max_length); - } mono_domain_assemblies_lock (domain); domain->domain_assemblies = g_slist_append (domain->domain_assemblies, assembly); @@ -3310,11 +3157,8 @@ ctorbuilder_to_mono_method (MonoClass *klass, MonoReflectionCtorBuilder* mb, Mon goto_if_nok (error, exit_null); mono_save_custom_attrs (klass->image, mb->mhandle, mb->cattrs); - if (!((MonoDynamicImage*)(MonoDynamicImage*)klass->image)->save) { - /* ilgen is no longer needed */ - mb->ilgen = NULL; - } - + /* ilgen is no longer needed */ + mb->ilgen = NULL; ret = mb->mhandle; goto exit; exit_null: @@ -3352,9 +3196,8 @@ methodbuilder_to_mono_method (MonoClass *klass, MonoReflectionMethodBuilderHandl MONO_HANDLE_SETVAL (ref_mb, mhandle, MonoMethod*, method); mono_save_custom_attrs (klass->image, method, mb->cattrs); - if (!((MonoDynamicImage*)(MonoDynamicImage*)klass->image)->save) - /* ilgen is no longer needed */ - mb->ilgen = NULL; + /* ilgen is no longer needed */ + mb->ilgen = NULL; ret = method; goto exit; exit_null: diff --git a/src/mono/mono/mini/method-to-ir.c b/src/mono/mono/mini/method-to-ir.c index 50948e6..ea3623c 100644 --- a/src/mono/mono/mini/method-to-ir.c +++ b/src/mono/mono/mini/method-to-ir.c @@ -6164,7 +6164,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b image = m_class_get_image (method->klass); /* serialization and xdomain stuff may need access to private fields and methods */ - dont_verify = image->assembly->corlib_internal? TRUE: FALSE; + dont_verify = FALSE; dont_verify |= method->wrapper_type == MONO_WRAPPER_XDOMAIN_INVOKE; dont_verify |= method->wrapper_type == MONO_WRAPPER_XDOMAIN_DISPATCH; dont_verify |= method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE; /* bug #77896 */ diff --git a/src/mono/mono/mini/mini.c b/src/mono/mono/mini/mini.c index c381fb9..c4b78d8 100644 --- a/src/mono/mono/mini/mini.c +++ b/src/mono/mono/mini/mini.c @@ -1023,14 +1023,13 @@ gboolean mono_compile_is_broken (MonoCompile *cfg, MonoMethod *method, gboolean fail_compile) { MonoMethod *method_definition = method; - gboolean dont_verify = m_class_get_image (method->klass)->assembly->corlib_internal; while (method_definition->is_inflated) { MonoMethodInflated *imethod = (MonoMethodInflated *) method_definition; method_definition = imethod->declaring; } - return !dont_verify && mini_method_verify (cfg, method_definition, fail_compile); + return mini_method_verify (cfg, method_definition, fail_compile); } static void -- 2.7.4