Example #1
0
        private MemberInfo ResolveTypeMemberRef(Type type, string name, ByteReader sig, Type[] genericTypeArguments, Type[] genericMethodArguments)
        {
            IGenericContext context;

            if ((genericTypeArguments == null && genericMethodArguments == null) || type.IsGenericType)
            {
                context = type;
            }
            else
            {
                context = new GenericContext(genericTypeArguments, genericMethodArguments);
            }
            if (sig.PeekByte() == Signature.FIELD)
            {
                Type           org      = type;
                FieldSignature fieldSig = FieldSignature.ReadSig(this, sig, context);
                do
                {
                    FieldInfo field = type.FindField(name, fieldSig);
                    if (field != null)
                    {
                        return(field);
                    }
                    type = type.BaseType;
                } while (type != null);
                throw new MissingFieldException(org.ToString(), name);
            }
            else
            {
                Type            org       = type;
                MethodSignature methodSig = MethodSignature.ReadSig(this, sig, context);
                do
                {
                    MethodBase method = type.FindMethod(name, methodSig);
                    if (method != null)
                    {
                        return(method);
                    }
                    type = type.BaseType;
                } while (type != null);
                return(universe.GetMissingMethodOrThrow(org, name, methodSig));
            }
        }
Example #2
0
 private MemberInfo ResolveTypeMemberRef(Type type, string name, ByteReader sig)
 {
     if (sig.PeekByte() == Signature.FIELD)
     {
         Type           org      = type;
         FieldSignature fieldSig = FieldSignature.ReadSig(this, sig, type);
         FieldInfo      field    = type.FindField(name, fieldSig);
         if (field == null && universe.MissingMemberResolution)
         {
             return(universe.GetMissingFieldOrThrow(type, name, fieldSig));
         }
         while (field == null && (type = type.BaseType) != null)
         {
             field = type.FindField(name, fieldSig);
         }
         if (field != null)
         {
             return(field);
         }
         throw new MissingFieldException(org.ToString(), name);
     }
     else
     {
         Type            org       = type;
         MethodSignature methodSig = MethodSignature.ReadSig(this, sig, type);
         MethodBase      method    = type.FindMethod(name, methodSig);
         if (method == null && universe.MissingMemberResolution)
         {
             return(universe.GetMissingMethodOrThrow(type, name, methodSig));
         }
         while (method == null && (type = type.BaseType) != null)
         {
             method = type.FindMethod(name, methodSig);
         }
         if (method != null)
         {
             return(method);
         }
         throw new MissingMethodException(org.ToString(), name);
     }
 }
Example #3
0
        private MemberInfo GetMemberRef(int index, Type[] genericTypeArguments, Type[] genericMethodArguments)
        {
            if (memberRefs == null)
            {
                memberRefs = new MemberInfo[MemberRef.records.Length];
            }
            if (memberRefs[index] == null)
            {
                int    owner = MemberRef.records[index].Class;
                int    sig   = MemberRef.records[index].Signature;
                string name  = GetString(MemberRef.records[index].Name);
                switch (owner >> 24)
                {
                case MethodDefTable.Index:
                    return(GetMethodAt(null, (owner & 0xFFFFFF) - 1));

                case ModuleRefTable.Index:
                    memberRefs[index] = ResolveTypeMemberRef(ResolveModuleType(owner), name, ByteReader.FromBlob(blobHeap, sig));
                    break;

                case TypeDefTable.Index:
                case TypeRefTable.Index:
                    memberRefs[index] = ResolveTypeMemberRef(ResolveType(owner), name, ByteReader.FromBlob(blobHeap, sig));
                    break;

                case TypeSpecTable.Index:
                {
                    Type type = ResolveType(owner, genericTypeArguments, genericMethodArguments);
                    if (type.IsArray)
                    {
                        MethodSignature methodSig = MethodSignature.ReadSig(this, ByteReader.FromBlob(blobHeap, sig), new GenericContext(genericTypeArguments, genericMethodArguments));
                        return(type.FindMethod(name, methodSig)
                               ?? universe.GetMissingMethodOrThrow(type, name, methodSig));
                    }
                    else if (type.IsConstructedGenericType)
                    {
                        MemberInfo member = ResolveTypeMemberRef(type.GetGenericTypeDefinition(), name, ByteReader.FromBlob(blobHeap, sig));
                        MethodBase mb     = member as MethodBase;
                        if (mb != null)
                        {
                            member = mb.BindTypeParameters(type);
                        }
                        FieldInfo fi = member as FieldInfo;
                        if (fi != null)
                        {
                            member = fi.BindTypeParameters(type);
                        }
                        return(member);
                    }
                    else
                    {
                        return(ResolveTypeMemberRef(type, name, ByteReader.FromBlob(blobHeap, sig)));
                    }
                }

                default:
                    throw new BadImageFormatException();
                }
            }
            return(memberRefs[index]);
        }