From cbb1f204e124e60b75ecbb094b3fa0e94129dc10 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 3 May 2018 11:18:46 +0200 Subject: [PATCH] Rename DynamicAwareTypeReference to DynamicTypeReference --- ICSharpCode.Decompiler/IL/ILReader.cs | 2 +- .../TypeSystem/DecompilerTypeSystem.cs | 17 ++----------- .../Implementation/TypeSpecification.cs | 20 ++++++---------- .../TypeSystem/MetadataLoader.cs | 24 +++++++++---------- ILSpy/Languages/CSharpLanguage.cs | 2 +- 5 files changed, 23 insertions(+), 42 deletions(-) diff --git a/ICSharpCode.Decompiler/IL/ILReader.cs b/ICSharpCode.Decompiler/IL/ILReader.cs index da8abb312..deb29f17c 100644 --- a/ICSharpCode.Decompiler/IL/ILReader.cs +++ b/ICSharpCode.Decompiler/IL/ILReader.cs @@ -86,7 +86,7 @@ namespace ICSharpCode.Decompiler.IL this.currentStack = ImmutableStack.Empty; this.unionFind = new UnionFind(); this.stackMismatchPairs = new List<(ILVariable, ILVariable)>(); - this.methodReturnStackType = typeSystem.ResolveFromSignature(TypeSystem.Implementation.DynamicAwareTypeReference.Create(methodSignature.ReturnType, methodDefinition.GetCustomAttributes(), metadata)).GetStackType(); + this.methodReturnStackType = typeSystem.ResolveFromSignature(TypeSystem.Implementation.DynamicTypeReference.Create(methodSignature.ReturnType, methodDefinition.GetCustomAttributes(), metadata)).GetStackType(); InitParameterVariables(); localVariables = InitLocalVariables(); if (body.LocalVariablesInitialized) { diff --git a/ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs b/ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs index e06d67ce4..0da1830bd 100644 --- a/ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs +++ b/ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs @@ -28,12 +28,6 @@ namespace ICSharpCode.Decompiler.TypeSystem /// readonly MetadataLoader typeReferenceCecilLoader = new MetadataLoader(); - /// - /// Dictionary for NRefactory->Cecil lookup. - /// May only be accessed within lock(entityDict) - /// - Dictionary entityDict = new Dictionary(); - Dictionary fieldLookupCache = new Dictionary(); Dictionary propertyLookupCache = new Dictionary(); Dictionary methodLookupCache = new Dictionary(); @@ -44,7 +38,7 @@ namespace ICSharpCode.Decompiler.TypeSystem if (moduleDefinition == null) throw new ArgumentNullException(nameof(moduleDefinition)); this.moduleDefinition = moduleDefinition; - MetadataLoader cecilLoader = new MetadataLoader { IncludeInternalMembers = true, LazyLoad = true, OnEntityLoaded = StoreMemberReference, ShortenInterfaceImplNames = false }; + MetadataLoader cecilLoader = new MetadataLoader { IncludeInternalMembers = true, LazyLoad = true, ShortenInterfaceImplNames = false }; typeReferenceCecilLoader.SetCurrentModule(moduleDefinition); IUnresolvedAssembly mainAssembly = cecilLoader.LoadModule(moduleDefinition); // Load referenced assemblies and type-forwarder references. @@ -91,13 +85,6 @@ namespace ICSharpCode.Decompiler.TypeSystem public SRM.MetadataReader GetMetadata() => moduleDefinition.GetMetadataReader(); - void StoreMemberReference(IUnresolvedEntity entity, SRM.EntityHandle mr) - { - // This is a callback from the type system, which is multi-threaded and may be accessed externally - lock (entityDict) - entityDict[entity] = mr; - } - public IType ResolveFromSignature(ITypeReference typeReference) { return typeReference.Resolve(context); @@ -159,7 +146,7 @@ namespace ICSharpCode.Decompiler.TypeSystem case SRM.HandleKind.FieldDefinition: var fieldDef = metadata.GetFieldDefinition((SRM.FieldDefinitionHandle)fieldReference); declaringType = ResolveAsType(fieldDef.GetDeclaringType()); - returnType = DynamicAwareTypeReference.Create(fieldDef.DecodeSignature(TypeReferenceSignatureDecoder.Instance, default), fieldDef.GetCustomAttributes(), metadata); + returnType = DynamicTypeReference.Create(fieldDef.DecodeSignature(TypeReferenceSignatureDecoder.Instance, default), fieldDef.GetCustomAttributes(), metadata); var declaringTypeDefinition = declaringType.GetDefinition(); if (declaringTypeDefinition == null) field = CreateFakeField(declaringType, metadata.GetString(fieldDef.Name), returnType); diff --git a/ICSharpCode.Decompiler/TypeSystem/Implementation/TypeSpecification.cs b/ICSharpCode.Decompiler/TypeSystem/Implementation/TypeSpecification.cs index fa5799020..16c255d2f 100644 --- a/ICSharpCode.Decompiler/TypeSystem/Implementation/TypeSpecification.cs +++ b/ICSharpCode.Decompiler/TypeSystem/Implementation/TypeSpecification.cs @@ -87,19 +87,19 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation } } - public sealed class DynamicAwareTypeReference : TypeVisitor, ITypeReference + public sealed class DynamicTypeReference : TypeVisitor, ITypeReference { readonly ITypeReference reference; - readonly bool isDynamic; readonly bool[] dynamicInfo; int typeIndex; static readonly ITypeResolveContext minimalCorlibContext = new SimpleTypeResolveContext(MinimalCorlib.Instance.CreateCompilation()); - public static DynamicAwareTypeReference Create(ITypeReference reference, SRM.CustomAttributeHandleCollection? customAttributes, SRM.MetadataReader metadata) + public static ITypeReference Create(ITypeReference reference, SRM.CustomAttributeHandleCollection? customAttributes, SRM.MetadataReader metadata) { - bool isDynamic = HasDynamicAttribute(customAttributes, metadata, out var dynamicInfo); - return new DynamicAwareTypeReference(reference, isDynamic, dynamicInfo); + if (HasDynamicAttribute(customAttributes, metadata, out var dynamicInfo)) + return new DynamicTypeReference(reference, dynamicInfo); + return reference; } public static bool HasDynamicAttribute(SRM.CustomAttributeHandleCollection? attributes, SRM.MetadataReader metadata, out bool[] mapping) @@ -126,19 +126,15 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation return false; } - DynamicAwareTypeReference(ITypeReference reference, bool isDynamic, bool[] dynamicInfo) + DynamicTypeReference(ITypeReference reference, bool[] dynamicInfo) { this.reference = reference; - this.isDynamic = isDynamic; this.dynamicInfo = dynamicInfo; } public IType Resolve(ITypeResolveContext context) { - if (isDynamic) - return reference.Resolve(context).AcceptVisitor(this); - else - return reference.Resolve(context); + return reference.Resolve(context).AcceptVisitor(this); } public override IType VisitPointerType(PointerType type) @@ -176,8 +172,6 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation public override IType VisitTypeDefinition(ITypeDefinition type) { - if (!isDynamic) - return type; if (type.KnownTypeCode == KnownTypeCode.Object) { if (dynamicInfo == null || typeIndex >= dynamicInfo.Length) return SpecialType.Dynamic; diff --git a/ICSharpCode.Decompiler/TypeSystem/MetadataLoader.cs b/ICSharpCode.Decompiler/TypeSystem/MetadataLoader.cs index 595541935..b0f6ba555 100644 --- a/ICSharpCode.Decompiler/TypeSystem/MetadataLoader.cs +++ b/ICSharpCode.Decompiler/TypeSystem/MetadataLoader.cs @@ -92,7 +92,7 @@ namespace ICSharpCode.Decompiler.TypeSystem /// Warning: if delay-loading is used and the type system is accessed by multiple threads, /// the callback may be invoked concurrently on multiple threads. /// - public Action OnEntityLoaded { get; set; } + public Action OnEntityLoaded { get; set; } bool shortenInterfaceImplNames = true; @@ -212,7 +212,7 @@ namespace ICSharpCode.Decompiler.TypeSystem if (this.LazyLoad) { var t = new LazySRMTypeDefinition(cecilLoaderCloneForLazyLoading, module, h); currentAssembly.AddTypeDefinition(t); - RegisterCecilObject(t, h); + RegisterCecilObject(t); } else { var t = CreateTopLevelTypeDefinition(h, td); cecilTypeDefs.Add(h); @@ -303,7 +303,7 @@ namespace ICSharpCode.Decompiler.TypeSystem switch (type.Kind) { case HandleKind.TypeSpecification: - return DynamicAwareTypeReference.Create(currentMetadata.GetTypeSpecification((TypeSpecificationHandle)type) + return DynamicTypeReference.Create(currentMetadata.GetTypeSpecification((TypeSpecificationHandle)type) .DecodeSignature(TypeReferenceSignatureDecoder.Instance, default), typeAttributes, currentMetadata); case HandleKind.TypeReference: return CreateTypeReference((TypeReferenceHandle)type); @@ -798,7 +798,7 @@ namespace ICSharpCode.Decompiler.TypeSystem InitMembers(typeDefinition, td, td.Members); td.ApplyInterningProvider(interningProvider); td.Freeze(); - RegisterCecilObject(td, handle); + RegisterCecilObject(td); } void InitBaseTypes(TypeDefinitionHandle handle, IList baseTypes) @@ -1224,7 +1224,7 @@ namespace ICSharpCode.Decompiler.TypeSystem int j = 0; if (signature.RequiredParameterCount > parameters.Length) { foreach (var parameterType in signature.ParameterTypes) { - m.Parameters.Add(new DefaultUnresolvedParameter(DynamicAwareTypeReference.Create(parameterType, null, currentMetadata), string.Empty)); + m.Parameters.Add(new DefaultUnresolvedParameter(DynamicTypeReference.Create(parameterType, null, currentMetadata), string.Empty)); } } else { foreach (var p in parameters) { @@ -1296,7 +1296,7 @@ namespace ICSharpCode.Decompiler.TypeSystem attributes = par.GetCustomAttributes(); } } - return DynamicAwareTypeReference.Create(returnType, attributes, currentMetadata); + return DynamicTypeReference.Create(returnType, attributes, currentMetadata); } static bool HasExtensionAttribute(MetadataReader currentModule, CustomAttributeHandleCollection attributes) @@ -1368,7 +1368,7 @@ namespace ICSharpCode.Decompiler.TypeSystem #region Read Parameter public IUnresolvedParameter ReadParameter(Parameter parameter, ITypeReference type) { - var p = new DefaultUnresolvedParameter(DynamicAwareTypeReference.Create(type, parameter.GetCustomAttributes(), currentMetadata), interningProvider.Intern(currentMetadata.GetString(parameter.Name))); + var p = new DefaultUnresolvedParameter(DynamicTypeReference.Create(type, parameter.GetCustomAttributes(), currentMetadata), interningProvider.Intern(currentMetadata.GetString(parameter.Name))); if (type is ByReferenceTypeReference) { if ((parameter.Attributes & ParameterAttributes.In) == 0 && (parameter.Attributes & ParameterAttributes.Out) != 0) @@ -1479,7 +1479,7 @@ namespace ICSharpCode.Decompiler.TypeSystem f.Accessibility = GetAccessibility(field.Attributes); f.IsReadOnly = (field.Attributes & FieldAttributes.InitOnly) == FieldAttributes.InitOnly; f.IsStatic = (field.Attributes & FieldAttributes.Static) == FieldAttributes.Static; - f.ReturnType = DynamicAwareTypeReference.Create(field.DecodeSignature(TypeReferenceSignatureDecoder.Instance, default), field.GetCustomAttributes(), currentMetadata); + f.ReturnType = DynamicTypeReference.Create(field.DecodeSignature(TypeReferenceSignatureDecoder.Instance, default), field.GetCustomAttributes(), currentMetadata); var constantHandle = field.GetDefaultValue(); if (!constantHandle.IsNil) { var constant = currentMetadata.GetConstant(constantHandle); @@ -1609,7 +1609,7 @@ namespace ICSharpCode.Decompiler.TypeSystem int i = 0; if (signature.RequiredParameterCount > parameterHandles.Length) { foreach (var parameterType in signature.ParameterTypes) { - p.Parameters.Add(new DefaultUnresolvedParameter(DynamicAwareTypeReference.Create(parameterType, null, currentMetadata), string.Empty)); + p.Parameters.Add(new DefaultUnresolvedParameter(DynamicTypeReference.Create(parameterType, null, currentMetadata), string.Empty)); } } else { foreach (var h in parameterHandles) { @@ -1681,14 +1681,14 @@ namespace ICSharpCode.Decompiler.TypeSystem member.MetadataToken = cecilDefinition; member.ApplyInterningProvider(interningProvider); member.Freeze(); - RegisterCecilObject(member, cecilDefinition); + RegisterCecilObject(member); } #endregion #region Type system translation table - void RegisterCecilObject(IUnresolvedEntity typeSystemObject, EntityHandle cecilObject) + void RegisterCecilObject(IUnresolvedEntity typeSystemObject) { - OnEntityLoaded?.Invoke(typeSystemObject, cecilObject); + OnEntityLoaded?.Invoke(typeSystemObject); } #endregion } diff --git a/ILSpy/Languages/CSharpLanguage.cs b/ILSpy/Languages/CSharpLanguage.cs index 9af23699c..1ddc37818 100644 --- a/ILSpy/Languages/CSharpLanguage.cs +++ b/ILSpy/Languages/CSharpLanguage.cs @@ -683,7 +683,7 @@ namespace ICSharpCode.ILSpy public InsertDynamicTypeVisitor(MetadataReader metadata, CustomAttributeHandleCollection? customAttributes) { - isDynamic = DynamicAwareTypeReference.HasDynamicAttribute(customAttributes, metadata, out mapping); + isDynamic = DynamicTypeReference.HasDynamicAttribute(customAttributes, metadata, out mapping); } public override void VisitComposedType(ComposedType composedType)