Пример #1
0
        // Create a TypeSystem.MethodSignature object from a RuntimeSignature that isn't a NativeLayoutSignature
        private TypeSystem.MethodSignature TypeSystemSigFromRuntimeSignature(TypeSystemContext context, RuntimeSignature signature)
        {
            Debug.Assert(!signature.IsNativeLayoutSignature);

            ModuleInfo module = signature.GetModuleInfo();

#if ECMA_METADATA_SUPPORT
            if (module is NativeFormatModuleInfo)
#endif
            {
                NativeFormatModuleInfo nativeFormatModule = (NativeFormatModuleInfo)module;
                var metadataReader = nativeFormatModule.MetadataReader;
                var methodHandle   = signature.Token.AsHandle().ToMethodHandle(metadataReader);
                var metadataUnit   = ((TypeLoaderTypeSystemContext)context).ResolveMetadataUnit(nativeFormatModule);
                var parser         = new Internal.TypeSystem.NativeFormat.NativeFormatSignatureParser(metadataUnit, metadataReader.GetMethod(methodHandle).Signature, metadataReader);
                return(parser.ParseMethodSignature());
            }
#if ECMA_METADATA_SUPPORT
            else
            {
                EcmaModuleInfo             ecmaModuleInfo = (EcmaModuleInfo)module;
                TypeSystem.Ecma.EcmaModule ecmaModule     = context.ResolveEcmaModule(ecmaModuleInfo);
                var        ecmaHandle = System.Reflection.Metadata.Ecma335.MetadataTokens.EntityHandle(signature.Token);
                MethodDesc ecmaMethod = ecmaModule.GetMethod(ecmaHandle);
                return(ecmaMethod.Signature);
            }
#endif
        }
Пример #2
0
        internal bool GetCallingConverterDataFromMethodSignature_NativeLayout_Common(
            TypeSystemContext context,
            RuntimeSignature methodSig,
            Instantiation typeInstantiation,
            Instantiation methodInstantiation,
            out bool hasThis,
            out TypeDesc[] parameters,
            out bool[] parametersWithGenericDependentLayout,
            NativeReader nativeReader)
        {
            NativeLayoutInfoLoadContext nativeLayoutContext = new NativeLayoutInfoLoadContext();

            nativeLayoutContext._module                = (NativeFormatModuleInfo)methodSig.GetModuleInfo();
            nativeLayoutContext._typeSystemContext     = context;
            nativeLayoutContext._typeArgumentHandles   = typeInstantiation;
            nativeLayoutContext._methodArgumentHandles = methodInstantiation;

            NativeFormatModuleInfo module = ModuleList.Instance.GetModuleInfoByHandle(new TypeManagerHandle(methodSig.ModuleHandle));
            NativeReader           reader = GetNativeLayoutInfoReader(methodSig);
            NativeParser           parser = new NativeParser(reader, methodSig.NativeLayoutOffset);

            MethodCallingConvention callingConvention = (MethodCallingConvention)parser.GetUnsigned();

            hasThis = !callingConvention.HasFlag(MethodCallingConvention.Static);

            if (callingConvention.HasFlag(MethodCallingConvention.Generic))
            {
                parser.SkipInteger(); // numGenArgs
            }

            uint parameterCount = parser.GetUnsigned();

            parameters = new TypeDesc[parameterCount + 1];
            parametersWithGenericDependentLayout = new bool[parameterCount + 1];

            // One extra parameter to account for the return type
            for (uint i = 0; i <= parameterCount; i++)
            {
                // NativeParser is a struct, so it can be copied.
                NativeParser parserCopy = parser;

                // Parse the signature twice. The first time to find out the exact type of the signature
                // The second time to identify if the parameter loaded via the signature should be forced to be
                // passed byref as part of the universal generic calling convention.
                parameters[i] = GetConstructedTypeFromParserAndNativeLayoutContext(ref parser, nativeLayoutContext);
                parametersWithGenericDependentLayout[i] = TypeSignatureHasVarsNeedingCallingConventionConverter(ref parserCopy, module, context, HasVarsInvestigationLevel.Parameter);
                if (parameters[i] == null)
                {
                    return(false);
                }
            }

            return(true);
        }
Пример #3
0
        internal bool IsStaticMethodSignature(RuntimeSignature methodSig)
        {
            if (methodSig.IsNativeLayoutSignature)
            {
                NativeReader reader = GetNativeLayoutInfoReader(methodSig);
                NativeParser parser = new NativeParser(reader, methodSig.NativeLayoutOffset);

                MethodCallingConvention callingConvention = (MethodCallingConvention)parser.GetUnsigned();
                return(callingConvention.HasFlag(MethodCallingConvention.Static));
            }
            else
            {
                ModuleInfo module = methodSig.GetModuleInfo();

#if ECMA_METADATA_SUPPORT
                if (module is NativeFormatModuleInfo)
#endif
                {
                    NativeFormatModuleInfo nativeFormatModule = (NativeFormatModuleInfo)module;
                    var metadataReader = nativeFormatModule.MetadataReader;
                    var methodHandle   = methodSig.Token.AsHandle().ToMethodHandle(metadataReader);

                    var method = methodHandle.GetMethod(metadataReader);
                    return((method.Flags & MethodAttributes.Static) != 0);
                }
#if ECMA_METADATA_SUPPORT
                else
                {
                    EcmaModuleInfo ecmaModuleInfo = (EcmaModuleInfo)module;
                    var            metadataReader = ecmaModuleInfo.MetadataReader;
                    var            ecmaHandle     = (System.Reflection.Metadata.MethodDefinitionHandle)System.Reflection.Metadata.Ecma335.MetadataTokens.Handle(methodSig.Token);
                    var            method         = metadataReader.GetMethodDefinition(ecmaHandle);
                    var            blobHandle     = method.Signature;
                    var            blobReader     = metadataReader.GetBlobReader(blobHandle);
                    byte           sigByte        = blobReader.ReadByte();
                    return((sigByte & (byte)System.Reflection.Metadata.SignatureAttributes.Instance) == 0);
                }
#endif
            }
        }