예제 #1
0
 public override void VisitMethodRefSig(MethodRefSig methodRef)
 {
     m_sigWriter.Write(methodRef.CallingConvention);
     Write(methodRef.ParamCount);
     Write(methodRef.RetType);
     Write(methodRef.Parameters, methodRef.Sentinel);
 }
예제 #2
0
        public MethodRefSig GetMethodRefSig(uint index)
        {
            MethodRefSig m = m_signatures [index] as MethodRefSig;

            if (m == null)
            {
                m = new MethodRefSig(index);
                m.Accept(this);
                m_signatures [index] = m;
            }
            return(m);
        }
예제 #3
0
        public MethodSig GetStandAloneMethodSig(uint index)
        {
            byte [] data = m_root.Streams.BlobHeap.Read(index);
            int     start;

            if ((data [0] & 0x5) > 0)
            {
                MethodRefSig mrs = new MethodRefSig(index);
                ReadMethodRefSig(mrs, data, 0, out start);
                return(mrs);
            }
            else
            {
                MethodDefSig mds = new MethodDefSig(index);
                ReadMethodDefSig(mds, data, 0, out start);
                return(mds);
            }
        }
예제 #4
0
        void ReadMethodRefSig(MethodRefSig methodRef, byte [] data, int pos, out int start)
        {
            methodRef.CallingConvention = data [pos];
            start                  = pos + 1;
            methodRef.HasThis      = (methodRef.CallingConvention & 0x20) != 0;
            methodRef.ExplicitThis = (methodRef.CallingConvention & 0x40) != 0;
            if ((methodRef.CallingConvention & 0x1) != 0)
            {
                methodRef.MethCallConv |= MethodCallingConvention.C;
            }
            else if ((methodRef.CallingConvention & 0x2) != 0)
            {
                methodRef.MethCallConv |= MethodCallingConvention.StdCall;
            }
            else if ((methodRef.CallingConvention & 0x3) != 0)
            {
                methodRef.MethCallConv |= MethodCallingConvention.ThisCall;
            }
            else if ((methodRef.CallingConvention & 0x4) != 0)
            {
                methodRef.MethCallConv |= MethodCallingConvention.FastCall;
            }
            else if ((methodRef.CallingConvention & 0x5) != 0)
            {
                methodRef.MethCallConv |= MethodCallingConvention.VarArg;
            }
            else
            {
                methodRef.MethCallConv |= MethodCallingConvention.Default;
            }
            methodRef.ParamCount = Utilities.ReadCompressedInteger(data, start, out start);
            methodRef.RetType    = ReadRetType(data, start, out start);
            int sentpos;

            methodRef.Parameters = ReadParameters(methodRef.ParamCount, data, start, out start, out sentpos);
            methodRef.Sentinel   = sentpos;
        }
예제 #5
0
        SigType ReadType(byte [] data, int pos, out int start)
        {
            start = pos;
            ElementType element = (ElementType)Utilities.ReadCompressedInteger(data, start, out start);

            switch (element)
            {
            case ElementType.ValueType:
                VALUETYPE vt = new VALUETYPE();
                vt.Type = Utilities.GetMetadataToken(CodedIndex.TypeDefOrRef,
                                                     (uint)Utilities.ReadCompressedInteger(data, start, out start));
                return(vt);

            case ElementType.Class:
                CLASS c = new CLASS();
                c.Type = Utilities.GetMetadataToken(CodedIndex.TypeDefOrRef,
                                                    (uint)Utilities.ReadCompressedInteger(data, start, out start));
                return(c);

            case ElementType.Ptr:
                PTR p    = new PTR();
                int buf  = start;
                int flag = Utilities.ReadCompressedInteger(data, start, out start);
                p.Void = flag == (int)ElementType.Void;
                if (p.Void)
                {
                    return(p);
                }
                start        = buf;
                p.CustomMods = ReadCustomMods(data, start, out start);
                p.PtrType    = ReadType(data, start, out start);
                return(p);

            case ElementType.FnPtr:
                FNPTR fp = new FNPTR();
                if ((data [start] & 0x5) != 0)
                {
                    MethodRefSig mr = new MethodRefSig((uint)start);
                    ReadMethodRefSig(mr, data, start, out start);
                    fp.Method = mr;
                }
                else
                {
                    MethodDefSig md = new MethodDefSig((uint)start);
                    ReadMethodDefSig(md, data, start, out start);
                    fp.Method = md;
                }
                return(fp);

            case ElementType.Array:
                ARRAY ary = new ARRAY();
                ary.CustomMods = ReadCustomMods(data, start, out start);
                ArrayShape shape = new ArrayShape();
                ary.Type       = ReadType(data, start, out start);
                shape.Rank     = Utilities.ReadCompressedInteger(data, start, out start);
                shape.NumSizes = Utilities.ReadCompressedInteger(data, start, out start);
                shape.Sizes    = new int [shape.NumSizes];
                for (int i = 0; i < shape.NumSizes; i++)
                {
                    shape.Sizes [i] = Utilities.ReadCompressedInteger(data, start, out start);
                }
                shape.NumLoBounds = Utilities.ReadCompressedInteger(data, start, out start);
                shape.LoBounds    = new int [shape.NumLoBounds];
                for (int i = 0; i < shape.NumLoBounds; i++)
                {
                    shape.LoBounds [i] = Utilities.ReadCompressedInteger(data, start, out start);
                }
                ary.Shape = shape;
                return(ary);

            case ElementType.SzArray:
                SZARRAY sa = new SZARRAY();
                sa.CustomMods = ReadCustomMods(data, start, out start);
                sa.Type       = ReadType(data, start, out start);
                return(sa);

            case ElementType.Var:
                return(new VAR(Utilities.ReadCompressedInteger(data, start, out start)));

            case ElementType.MVar:
                return(new MVAR(Utilities.ReadCompressedInteger(data, start, out start)));

            case ElementType.GenericInst:
                GENERICINST ginst = new GENERICINST();

                ginst.ValueType = ((ElementType)Utilities.ReadCompressedInteger(
                                       data, start, out start)) == ElementType.ValueType;

                ginst.Type = Utilities.GetMetadataToken(CodedIndex.TypeDefOrRef,
                                                        (uint)Utilities.ReadCompressedInteger(data, start, out start));

                ginst.Signature = ReadGenericInstSignature(data, start, out start);

                return(ginst);

            default:
                return(new SigType(element));
            }
        }
예제 #6
0
        public override void VisitMethodRefSig(MethodRefSig methodRef)
        {
            int start;

            ReadMethodRefSig(methodRef, m_root.Streams.BlobHeap.Read(methodRef.BlobIndex), 0, out start);
        }
예제 #7
0
 public uint AddMethodRefSig(MethodRefSig methSig)
 {
     return(AddSignature(methSig));
 }