Beispiel #1
0
        public MethodSig(CLIFile pCLIFile, byte[] pSignature, ref int pCursor)
        {
            CLIFile = pCLIFile;

            byte callingConvention = pSignature[pCursor++];
            HasThis = (callingConvention & CallingConvention.HasThis) != 0;
            ExplicitThis = (callingConvention & CallingConvention.ExplicitThis) != 0;
            if ((callingConvention & CallingConvention.HasThis) != 0) callingConvention ^= CallingConvention.HasThis;
            if ((callingConvention & CallingConvention.ExplicitThis) != 0) callingConvention ^= CallingConvention.ExplicitThis;
            Default = callingConvention == CallingConvention.Default;
            CCall = callingConvention == CallingConvention.CCall;
            STDCall = callingConvention == CallingConvention.STDCall;
            ThisCall = callingConvention == CallingConvention.ThisCall;
            FastCall = callingConvention == CallingConvention.FastCall;
            VarArg = callingConvention == CallingConvention.VarArgs;
            Generic = callingConvention == CallingConvention.Generic;
            if (Generic) GenParamCount = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
            uint paramCount = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
            Params = new List<SigParam>((int)paramCount);
            RetType = new SigRetType(CLIFile, pSignature, ref pCursor);
            if (paramCount > 0)
            {
                for (uint paramIndex = 0; paramIndex < paramCount; ++paramIndex)
                {
                    if (pSignature[pCursor] == (byte)SigElementType.Sentinel)
                    {
                        HasSentinel = true;
                        SentinelIndex = paramIndex;
                        ++pCursor;
                    }
                    Params.Add(new SigParam(CLIFile, pSignature, ref pCursor));
                }
            }
        }
Beispiel #2
0
		public SigArrayShape(CLIFile pCLIFile, byte[] pSignature, ref int pCursor)
		{
			CLIFile = pCLIFile;

			Rank = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
			uint sizeCount = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
			Sizes = new List<uint>((int)sizeCount);
			for (uint sizeIndex = 0; sizeIndex < sizeCount; ++sizeIndex) Sizes.Add(CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor));
			uint lowBoundCount = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
			LowBounds = new List<int>((int)lowBoundCount);
			for (uint lowBoundIndex = 0; lowBoundIndex < lowBoundCount; ++lowBoundIndex) LowBounds.Add(CLIFile.ReadCompressedSigned(pSignature, ref pCursor));
		}
Beispiel #3
0
        public SigCustomMod(CLIFile pCLIFile, byte[] pSignature, ref int pCursor)
        {
            CLIFile = pCLIFile;

            Optional = pSignature[pCursor++] == (byte)SigElementType.CustomModifier_Optional;
            TypeDefOrRefOrSpecToken = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
        }
Beispiel #4
0
        public SigCustomMod(CLIFile pCLIFile, byte[] pSignature, ref int pCursor)
        {
            CLIFile = pCLIFile;

            Optional = pSignature[pCursor++] == (byte)SigElementType.CustomModifier_Optional;
            TypeDefOrRefOrSpecToken = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
        }
Beispiel #5
0
        public MethodSig(CLIFile pCLIFile, byte[] pSignature, ref int pCursor)
        {
            CLIFile = pCLIFile;

            byte callingConvention = pSignature[pCursor++];

            HasThis      = (callingConvention & CallingConvention.HasThis) != 0;
            ExplicitThis = (callingConvention & CallingConvention.ExplicitThis) != 0;
            if ((callingConvention & CallingConvention.HasThis) != 0)
            {
                callingConvention ^= CallingConvention.HasThis;
            }
            if ((callingConvention & CallingConvention.ExplicitThis) != 0)
            {
                callingConvention ^= CallingConvention.ExplicitThis;
            }
            Default  = callingConvention == CallingConvention.Default;
            CCall    = callingConvention == CallingConvention.CCall;
            STDCall  = callingConvention == CallingConvention.STDCall;
            ThisCall = callingConvention == CallingConvention.ThisCall;
            FastCall = callingConvention == CallingConvention.FastCall;
            VarArg   = callingConvention == CallingConvention.VarArgs;
            Generic  = callingConvention == CallingConvention.Generic;
            if (Generic)
            {
                GenParamCount = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
            }
            uint paramCount = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);

            Params  = new List <SigParam>((int)paramCount);
            RetType = new SigRetType(CLIFile, pSignature, ref pCursor);
            if (paramCount > 0)
            {
                for (uint paramIndex = 0; paramIndex < paramCount; ++paramIndex)
                {
                    if (pSignature[pCursor] == (byte)SigElementType.Sentinel)
                    {
                        HasSentinel   = true;
                        SentinelIndex = paramIndex;
                        ++pCursor;
                    }
                    Params.Add(new SigParam(CLIFile, pSignature, ref pCursor));
                }
            }
        }
Beispiel #6
0
        public MethodSpecSig(CLIFile pCLIFile, byte[] pSignature, ref int pCursor)
        {
            CLIFile = pCLIFile;

            ++pCursor;
            uint genArgsCount = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
            GenArgs = new List<SigType>((int)genArgsCount);
            for (uint genArgsIndex = 0; genArgsIndex < genArgsCount; ++genArgsIndex) GenArgs.Add(new SigType(CLIFile, pSignature, ref pCursor));
        }
Beispiel #7
0
		public LocalVarSig(CLIFile pCLIFile, byte[] pSignature, ref int pCursor)
		{
			CLIFile = pCLIFile;

			++pCursor;
			uint localVarCount = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
			LocalVars = new List<SigLocalVar>((int)localVarCount);
			for (uint localVarIndex = 0; localVarIndex < localVarCount; ++localVarIndex) LocalVars.Add(new SigLocalVar(CLIFile, pSignature, ref pCursor));
		}
Beispiel #8
0
        public SigArrayShape(CLIFile pCLIFile, byte[] pSignature, ref int pCursor)
        {
            CLIFile = pCLIFile;

            Rank = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
            uint sizeCount = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);

            Sizes = new List <uint>((int)sizeCount);
            for (uint sizeIndex = 0; sizeIndex < sizeCount; ++sizeIndex)
            {
                Sizes.Add(CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor));
            }
            uint lowBoundCount = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);

            LowBounds = new List <int>((int)lowBoundCount);
            for (uint lowBoundIndex = 0; lowBoundIndex < lowBoundCount; ++lowBoundIndex)
            {
                LowBounds.Add(CLIFile.ReadCompressedSigned(pSignature, ref pCursor));
            }
        }
Beispiel #9
0
        public LocalVarSig(CLIFile pCLIFile, byte[] pSignature, ref int pCursor)
        {
            CLIFile = pCLIFile;

            ++pCursor;
            uint localVarCount = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);

            LocalVars = new List <SigLocalVar>((int)localVarCount);
            for (uint localVarIndex = 0; localVarIndex < localVarCount; ++localVarIndex)
            {
                LocalVars.Add(new SigLocalVar(CLIFile, pSignature, ref pCursor));
            }
        }
Beispiel #10
0
        public MethodSpecSig(CLIFile pCLIFile, byte[] pSignature, ref int pCursor)
        {
            CLIFile = pCLIFile;

            ++pCursor;
            uint genArgsCount = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);

            GenArgs = new List <SigType>((int)genArgsCount);
            for (uint genArgsIndex = 0; genArgsIndex < genArgsCount; ++genArgsIndex)
            {
                GenArgs.Add(new SigType(CLIFile, pSignature, ref pCursor));
            }
        }
Beispiel #11
0
		public PropertySig(CLIFile pCLIFile, byte[] pSignature, ref int pCursor)
		{
			CLIFile = pCLIFile;

			HasThis = (pSignature[pCursor++] & CallingConvention.HasThis) != 0;
			uint paramCount = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
			while (pSignature[pCursor] == (byte)SigElementType.CustomModifier_Required ||
				   pSignature[pCursor] == (byte)SigElementType.CustomModifier_Optional)
			{
				Mods.Add(new SigCustomMod(CLIFile, pSignature, ref pCursor));
			}
			Type = new SigType(CLIFile, pSignature, ref pCursor);
			Params = new List<SigParam>((int)paramCount);
			for (uint paramIndex = 0; paramIndex < paramCount; ++paramIndex) Params.Add(new SigParam(CLIFile, pSignature, ref pCursor));
		}
Beispiel #12
0
        public PropertySig(CLIFile pCLIFile, byte[] pSignature, ref int pCursor)
        {
            CLIFile = pCLIFile;

            HasThis = (pSignature[pCursor++] & CallingConvention.HasThis) != 0;
            uint paramCount = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);

            while (pSignature[pCursor] == (byte)SigElementType.CustomModifier_Required ||
                   pSignature[pCursor] == (byte)SigElementType.CustomModifier_Optional)
            {
                Mods.Add(new SigCustomMod(CLIFile, pSignature, ref pCursor));
            }
            Type   = new SigType(CLIFile, pSignature, ref pCursor);
            Params = new List <SigParam>((int)paramCount);
            for (uint paramIndex = 0; paramIndex < paramCount; ++paramIndex)
            {
                Params.Add(new SigParam(CLIFile, pSignature, ref pCursor));
            }
        }
Beispiel #13
0
		public SigType(CLIFile pCLIFile, byte[] pSignature, ref int pCursor)
		{
			CLIFile = pCLIFile;

			ElementType = (SigElementType)pSignature[pCursor++];
			switch (ElementType)
			{
				case SigElementType.Array:
					ArrayType = new SigType(CLIFile, pSignature, ref pCursor);
					ArrayShape = new SigArrayShape(CLIFile, pSignature, ref pCursor);
					break;
				case SigElementType.Class:
					ClassTypeDefOrRefOrSpecToken = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
					break;
				case SigElementType.FunctionPointer:
					FnPtrMethodSig = new MethodSig(CLIFile, pSignature, ref pCursor);
					break;
				case SigElementType.GenericInstantiation:
					{
						GenericInstClass = pSignature[pCursor] == (byte)SigElementType.Class;
						GenericInstValueType = pSignature[pCursor] == (byte)SigElementType.ValueType;
						++pCursor;
						GenericInstTypeDefOrRefOrSpecToken = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
						uint genericInstGenArgCount = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
						GenericInstGenArgs = new List<SigType>((int)genericInstGenArgCount);
						for (uint genericInstGenArgIndex = 0; genericInstGenArgIndex < genericInstGenArgCount; ++genericInstGenArgIndex) GenericInstGenArgs.Add(new SigType(CLIFile, pSignature, ref pCursor));
						break;
					}
				case SigElementType.MethodVar:
					MVarNumber = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
					break;
				case SigElementType.Pointer:
					while (pSignature[pCursor] == (byte)SigElementType.CustomModifier_Required ||
						   pSignature[pCursor] == (byte)SigElementType.CustomModifier_Optional)
					{
						PtrMods.Add(new SigCustomMod(CLIFile, pSignature, ref pCursor));
					}
					if (pSignature[pCursor] == (byte)SigElementType.Void)
					{
						PtrVoid = true;
						++pCursor;
					}
					else PtrType = new SigType(CLIFile, pSignature, ref pCursor);
					break;
				case SigElementType.SingleDimensionArray:
					while (pSignature[pCursor] == (byte)SigElementType.CustomModifier_Required ||
						   pSignature[pCursor] == (byte)SigElementType.CustomModifier_Optional)
					{
						SZArrayMods.Add(new SigCustomMod(CLIFile, pSignature, ref pCursor));
					}
					SZArrayType = new SigType(CLIFile, pSignature, ref pCursor);
					break;
				case SigElementType.ValueType:
					ValueTypeDefOrRefOrSpecToken = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
					break;
				case SigElementType.Var:
					VarNumber = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
					break;

				default: break;
			}
		}
Beispiel #14
0
        public SigType(CLIFile pCLIFile, byte[] pSignature, ref int pCursor)
        {
            CLIFile = pCLIFile;

            ElementType = (SigElementType)pSignature[pCursor++];
            switch (ElementType)
            {
            case SigElementType.Array:
                ArrayType  = new SigType(CLIFile, pSignature, ref pCursor);
                ArrayShape = new SigArrayShape(CLIFile, pSignature, ref pCursor);
                break;

            case SigElementType.Class:
                ClassTypeDefOrRefOrSpecToken = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
                break;

            case SigElementType.FunctionPointer:
                FnPtrMethodSig = new MethodSig(CLIFile, pSignature, ref pCursor);
                break;

            case SigElementType.GenericInstantiation:
            {
                GenericInstClass     = pSignature[pCursor] == (byte)SigElementType.Class;
                GenericInstValueType = pSignature[pCursor] == (byte)SigElementType.ValueType;
                ++pCursor;
                GenericInstTypeDefOrRefOrSpecToken = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
                uint genericInstGenArgCount = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
                GenericInstGenArgs = new List <SigType>((int)genericInstGenArgCount);
                for (uint genericInstGenArgIndex = 0; genericInstGenArgIndex < genericInstGenArgCount; ++genericInstGenArgIndex)
                {
                    GenericInstGenArgs.Add(new SigType(CLIFile, pSignature, ref pCursor));
                }
                break;
            }

            case SigElementType.MethodVar:
                MVarNumber = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
                break;

            case SigElementType.Pointer:
                while (pSignature[pCursor] == (byte)SigElementType.CustomModifier_Required ||
                       pSignature[pCursor] == (byte)SigElementType.CustomModifier_Optional)
                {
                    PtrMods.Add(new SigCustomMod(CLIFile, pSignature, ref pCursor));
                }
                if (pSignature[pCursor] == (byte)SigElementType.Void)
                {
                    PtrVoid = true;
                    ++pCursor;
                }
                else
                {
                    PtrType = new SigType(CLIFile, pSignature, ref pCursor);
                }
                break;

            case SigElementType.SingleDimensionArray:
                while (pSignature[pCursor] == (byte)SigElementType.CustomModifier_Required ||
                       pSignature[pCursor] == (byte)SigElementType.CustomModifier_Optional)
                {
                    SZArrayMods.Add(new SigCustomMod(CLIFile, pSignature, ref pCursor));
                }
                SZArrayType = new SigType(CLIFile, pSignature, ref pCursor);
                break;

            case SigElementType.ValueType:
                ValueTypeDefOrRefOrSpecToken = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
                break;

            case SigElementType.Var:
                VarNumber = CLIFile.ReadCompressedUnsigned(pSignature, ref pCursor);
                break;

            default: break;
            }
        }