コード例 #1
0
        internal IMethod WrapAccessor(ref IMethod cachingField, IMethod accessorDefinition)
        {
            if (accessorDefinition == null)
            {
                return(null);
            }
            var result = LazyInit.VolatileRead(ref cachingField);

            if (result != null)
            {
                return(result);
            }
            else
            {
                var sm = accessorDefinition.Specialize(substitution);
                //sm.AccessorOwner = this;
                return(LazyInit.GetOrSet(ref cachingField, sm));
            }
        }
コード例 #2
0
ファイル: CSharpAssembly.cs プロジェクト: sq/ILSpy-JSIL
        Dictionary <FullNameAndTypeParameterCount, ITypeDefinition> GetTypes()
        {
            var dict = LazyInit.VolatileRead(ref this.typeDict);

            if (dict != null)
            {
                return(dict);
            }
            else
            {
                // Always use the ordinal comparer for the main dictionary so that partial classes
                // get merged correctly.
                // The compilation's comparer will be used for the per-namespace dictionaries.
                var comparer = FullNameAndTypeParameterCountComparer.Ordinal;
                dict = projectContent.TopLevelTypeDefinitions
                       .GroupBy(t => new FullNameAndTypeParameterCount(t.Namespace, t.Name, t.TypeParameters.Count), comparer)
                       .ToDictionary(g => g.Key, g => CreateResolvedTypeDefinition(g.ToArray()), comparer);
                return(LazyInit.GetOrSet(ref this.typeDict, dict));
            }
        }
コード例 #3
0
ファイル: MetadataField.cs プロジェクト: quitec/ilspy
        public object GetConstantValue(bool throwOnInvalidMetadata)
        {
            object val = LazyInit.VolatileRead(ref this.constantValue);

            if (val != null)
            {
                return(val);
            }
            try
            {
                var metadata = module.metadata;
                var fieldDef = metadata.GetFieldDefinition(handle);
                if (IsDecimalConstant && DecimalConstantHelper.AllowsDecimalConstants(module))
                {
                    val = DecimalConstantHelper.GetDecimalConstantValue(module, fieldDef.GetCustomAttributes());
                }
                else
                {
                    var constantHandle = fieldDef.GetDefaultValue();
                    if (constantHandle.IsNil)
                    {
                        return(null);
                    }
                    var constant   = metadata.GetConstant(constantHandle);
                    var blobReader = metadata.GetBlobReader(constant.Value);
                    try
                    {
                        val = blobReader.ReadConstant(constant.TypeCode);
                    }
                    catch (ArgumentOutOfRangeException)
                    {
                        throw new BadImageFormatException($"Constant with invalid typecode: {constant.TypeCode}");
                    }
                }
                return(LazyInit.GetOrSet(ref this.constantValue, val));
            }
            catch (BadImageFormatException) when(!throwOnInvalidMetadata)
            {
                return(null);
            }
        }
コード例 #4
0
        internal IUnresolvedTypeDefinition GetTypeDefByToken(Mono.Cecil.MetadataToken token)
        {
            if (token.TokenType != Mono.Cecil.TokenType.TypeDef)
            {
                throw new ArgumentException("Token must be typedef-token.");
            }
            var lookup = LazyInit.VolatileRead(ref allTypesByMetadata);

            if (lookup == null)
            {
                lookup = LazyInit.GetOrSet(ref allTypesByMetadata, BuildMetadataLookup());
            }
            if (token.RID < lookup.Length)
            {
                return(lookup[token.RID]);
            }
            else
            {
                return(null);
            }
        }
コード例 #5
0
        MemberList GetMemberList()
        {
            var result = LazyInit.VolatileRead(ref this.memberList);

            if (result != null)
            {
                return(result);
            }
            List <IUnresolvedMember>   unresolvedMembers = new List <IUnresolvedMember>();
            List <ITypeResolveContext> contextPerMember  = new List <ITypeResolveContext>();
            bool addDefaultConstructorIfRequired         = false;

            foreach (IUnresolvedTypeDefinition part in parts)
            {
                ITypeResolveContext parentContextForPart = part.CreateResolveContext(parentContext);
                ITypeResolveContext contextForPart       = parentContextForPart.WithCurrentTypeDefinition(this);
                foreach (var member in part.Members)
                {
                    IUnresolvedMethod method = member as IUnresolvedMethod;

                    unresolvedMembers.Add(member);
                    contextPerMember.Add(contextForPart);
                }

                addDefaultConstructorIfRequired |= part.AddDefaultConstructorIfRequired;
            }
            if (addDefaultConstructorIfRequired)
            {
                TypeKind kind = this.Kind;
                if (kind == TypeKind.Class && !this.IsStatic && !unresolvedMembers.Any(m => m.SymbolKind == SymbolKind.Constructor && !m.IsStatic) ||
                    kind == TypeKind.Enum || kind == TypeKind.Struct)
                {
                    contextPerMember.Add(parts[0].CreateResolveContext(parentContext).WithCurrentTypeDefinition(this));
                    unresolvedMembers.Add(MethodCore.CreateDefaultConstructor(parts[0]));
                }
            }
            result = new MemberList(contextPerMember, unresolvedMembers);
            return(LazyInit.GetOrSet(ref this.memberList, result));
        }
コード例 #6
0
ファイル: CSharpAssembly.cs プロジェクト: sq/ILSpy-JSIL
        IList <IAttribute> GetAttributes(ref IList <IAttribute> field, bool assemblyAttributes)
        {
            IList <IAttribute> result = LazyInit.VolatileRead(ref field);

            if (result != null)
            {
                return(result);
            }
            else
            {
                result = new List <IAttribute>();
                foreach (var unresolvedFile in projectContent.Files.OfType <CSharpUnresolvedFile>())
                {
                    var attributes = assemblyAttributes ? unresolvedFile.AssemblyAttributes : unresolvedFile.ModuleAttributes;
                    var context    = new CSharpTypeResolveContext(this, unresolvedFile.RootUsingScope.Resolve(compilation));
                    foreach (var unresolvedAttr in attributes)
                    {
                        result.Add(unresolvedAttr.CreateResolvedAttribute(context));
                    }
                }
                return(LazyInit.GetOrSet(ref field, result));
            }
        }
コード例 #7
0
        MemberList GetMemberList()
        {
            var result = LazyInit.VolatileRead(ref this.memberList);

            if (result != null)
            {
                return(result);
            }
            List <IUnresolvedMember>   unresolvedMembers  = new List <IUnresolvedMember>();
            List <ITypeResolveContext> contextPerMember   = new List <ITypeResolveContext>();
            List <PartialMethodInfo>   partialMethodInfos = null;
            bool addDefaultConstructorIfRequired          = false;

            foreach (IUnresolvedTypeDefinition part in parts)
            {
                ITypeResolveContext parentContextForPart = part.CreateResolveContext(parentContext);
                ITypeResolveContext contextForPart       = parentContextForPart.WithCurrentTypeDefinition(this);
                foreach (var member in part.Members)
                {
                    IUnresolvedMethod method = member as IUnresolvedMethod;
                    if (method != null && method.IsPartial)
                    {
                        // Merge partial method declaration and implementation
                        if (partialMethodInfos == null)
                        {
                            partialMethodInfos = new List <PartialMethodInfo>();
                        }
                        PartialMethodInfo newInfo      = new PartialMethodInfo(method, contextForPart);
                        PartialMethodInfo existingInfo = null;
                        foreach (var info in partialMethodInfos)
                        {
                            if (newInfo.IsSameSignature(info, Compilation.NameComparer))
                            {
                                existingInfo = info;
                                break;
                            }
                        }
                        if (existingInfo != null)
                        {
                            // Add the unresolved method to the PartialMethodInfo:
                            existingInfo.AddPart(method, contextForPart);
                        }
                        else
                        {
                            partialMethodInfos.Add(newInfo);
                        }
                    }
                    else
                    {
                        unresolvedMembers.Add(member);
                        contextPerMember.Add(contextForPart);
                    }
                }

                addDefaultConstructorIfRequired |= part.AddDefaultConstructorIfRequired;
            }
            if (addDefaultConstructorIfRequired)
            {
                TypeKind kind = this.Kind;
                if (kind == TypeKind.Class && !this.IsStatic && !unresolvedMembers.Any(m => m.SymbolKind == SymbolKind.Constructor && !m.IsStatic) ||
                    kind == TypeKind.Enum || kind == TypeKind.Struct)
                {
                    contextPerMember.Add(parts[0].CreateResolveContext(parentContext).WithCurrentTypeDefinition(this));
                    unresolvedMembers.Add(DefaultUnresolvedMethod.CreateDefaultConstructor(parts[0]));
                }
            }
            result = new MemberList(contextPerMember, unresolvedMembers, partialMethodInfos);
            return(LazyInit.GetOrSet(ref this.memberList, result));
        }