コード例 #1
0
ファイル: NativeFormatMethod.cs プロジェクト: wtgodbe/corert
        private MethodSignature InitializeSignature()
        {
            var metadataReader = MetadataReader;

            NativeFormatSignatureParser parser = new NativeFormatSignatureParser(MetadataUnit, MetadataReader.GetMethod(_handle).Signature, metadataReader);
            var signature = parser.ParseMethodSignature();

            return(_signature = signature);
        }
コード例 #2
0
        private TypeDesc InitializeFieldType()
        {
            var metadataReader = MetadataReader;

            NativeFormatSignatureParser parser = new NativeFormatSignatureParser(MetadataUnit, metadataReader.GetField(_handle).Signature, metadataReader);
            var fieldType = parser.ParseFieldSignature();

            return(_fieldType = fieldType);
        }
コード例 #3
0
        private Object ResolveMemberReference(MemberReferenceHandle handle)
        {
            MemberReference memberReference = _metadataReader.GetMemberReference(handle);

            TypeDesc parent = GetType(memberReference.Parent);

            TypeDesc parentTypeDesc = parent as TypeDesc;

            if (parentTypeDesc != null)
            {
                NativeFormatSignatureParser parser = new NativeFormatSignatureParser(this, memberReference.Signature, _metadataReader);

                string name = _metadataReader.GetString(memberReference.Name);

                if (parser.IsFieldSignature)
                {
                    FieldDesc field = parentTypeDesc.GetField(name);
                    if (field != null)
                    {
                        return(field);
                    }

                    // TODO: Better error message
                    throw new MissingMemberException("Field not found " + parent.ToString() + "." + name);
                }
                else
                {
                    MethodSignature sig = parser.ParseMethodSignature();
                    TypeDesc        typeDescToInspect = parentTypeDesc;

                    // Try to resolve the name and signature in the current type, or any of the base types.
                    do
                    {
                        // TODO: handle substitutions
                        MethodDesc method = typeDescToInspect.GetMethod(name, sig);
                        if (method != null)
                        {
                            // If this resolved to one of the base types, make sure it's not a constructor.
                            // Instance constructors are not inherited.
                            if (typeDescToInspect != parentTypeDesc && method.IsConstructor)
                            {
                                break;
                            }

                            return(method);
                        }
                        typeDescToInspect = typeDescToInspect.BaseType;
                    } while (typeDescToInspect != null);

                    // TODO: Better error message
                    throw new MissingMemberException("Method not found " + parent.ToString() + "." + name);
                }
            }

            throw new BadImageFormatException();
        }
コード例 #4
0
            protected override IHandleObject CreateValueFromKey(NativeFormatObjectKey key)
            {
                Handle           handle    = key.Handle;
                NativeFormatType container = key.Container;

                object item;

                switch (handle.HandleType)
                {
                case HandleType.TypeDefinition:
                    item = new NativeFormatType(_metadataUnit, handle.ToTypeDefinitionHandle(_metadataReader));
                    break;

                case HandleType.Method:
                    item = new NativeFormatMethod(container, handle.ToMethodHandle(_metadataReader));
                    break;

                case HandleType.Field:
                    item = new NativeFormatField(container, handle.ToFieldHandle(_metadataReader));
                    break;

                case HandleType.TypeReference:
                    item = _metadataUnit.ResolveTypeReference(handle.ToTypeReferenceHandle(_metadataReader));
                    break;

                case HandleType.MemberReference:
                    item = _metadataUnit.ResolveMemberReference(handle.ToMemberReferenceHandle(_metadataReader));
                    break;

                case HandleType.QualifiedMethod:
                    item = _metadataUnit.ResolveQualifiedMethod(handle.ToQualifiedMethodHandle(_metadataReader));
                    break;

                case HandleType.QualifiedField:
                    item = _metadataUnit.ResolveQualifiedField(handle.ToQualifiedFieldHandle(_metadataReader));
                    break;

                case HandleType.ScopeReference:
                    item = _metadataUnit.ResolveAssemblyReference(handle.ToScopeReferenceHandle(_metadataReader));
                    break;

                case HandleType.ScopeDefinition:
                {
                    ScopeDefinition scope = handle.ToScopeDefinitionHandle(_metadataReader).GetScopeDefinition(_metadataReader);
                    item = _metadataUnit.GetModuleFromAssemblyName(scope.Name.GetConstantStringValue(_metadataReader).Value);
                }
                break;

                case HandleType.TypeSpecification:
                case HandleType.TypeInstantiationSignature:
                case HandleType.SZArraySignature:
                case HandleType.ArraySignature:
                case HandleType.PointerSignature:
                case HandleType.ByReferenceSignature:
                case HandleType.TypeVariableSignature:
                case HandleType.MethodTypeVariableSignature:
                {
                    NativeFormatSignatureParser parser = new NativeFormatSignatureParser(_metadataUnit, handle, _metadataReader);

                    item = parser.ParseTypeSignature();
                }
                break;

                case HandleType.MethodInstantiation:
                    item = _metadataUnit.ResolveMethodInstantiation(handle.ToMethodInstantiationHandle(_metadataReader));
                    break;

                // TODO: Resolve other tokens
                default:
                    throw new BadImageFormatException("Unknown metadata token type: " + handle.HandleType);
                }

                switch (handle.HandleType)
                {
                case HandleType.TypeDefinition:
                case HandleType.Field:
                case HandleType.Method:
                    // type/method/field definitions directly correspond to their target item.
                    return((IHandleObject)item);

                default:
                    // Everything else is some form of reference which cannot be self-describing
                    return(new NativeFormatObjectLookupWrapper(handle, item, container));
                }
            }
コード例 #5
0
ファイル: NativeFormatMethod.cs プロジェクト: nattress/corert
        private MethodSignature InitializeSignature()
        {
            var metadataReader = MetadataReader;

            NativeFormatSignatureParser parser = new NativeFormatSignatureParser(MetadataUnit, MetadataReader.GetMethod(_handle).Signature, metadataReader);
            var signature = parser.ParseMethodSignature();
            return (_signature = signature);
        }
コード例 #6
0
        /// <summary>
        /// Use for handle kinds, TypeInstantiationSignature, TypeSpecification, SZArraySignature, ArraySignature, PointerSignature, ByReferenceSignature, TypeVariableSignature, MethodTypeVariableSignature
        /// </summary>
        /// <returns></returns>
        public TypeDesc ParseTypeSignature()
        {
            switch (_signatureHandle.HandleType)
            {
                case HandleType.TypeSpecification:
                    {
                        var typeSpec = _metadataReader.GetTypeSpecification(_signatureHandle.ToTypeSpecificationHandle(_metadataReader));
                        return _metadataUnit.GetType(typeSpec.Signature);
                    }

                case HandleType.TypeInstantiationSignature:
                    {
                        var typeInstantiationSignature = _metadataReader.GetTypeInstantiationSignature(_signatureHandle.ToTypeInstantiationSignatureHandle(_metadataReader));
                        var openType = (MetadataType)_metadataUnit.GetType(typeInstantiationSignature.GenericType);
                        var typeArguments = typeInstantiationSignature.GenericTypeArguments;
                        TypeDesc[] instantiationArguments = new TypeDesc[typeArguments.Count];
                        int i = 0;
                        foreach (Handle typeArgument in typeArguments)
                        {
                            instantiationArguments[i] = _metadataUnit.GetType(typeArgument);
                            i++;
                        }
                        return _metadataUnit.Context.GetInstantiatedType(openType, new Instantiation(instantiationArguments));
                    }

                case HandleType.SZArraySignature:
                    {
                        var szArraySignature = _metadataReader.GetSZArraySignature(_signatureHandle.ToSZArraySignatureHandle(_metadataReader));
                        return _metadataUnit.Context.GetArrayType(_metadataUnit.GetType(szArraySignature.ElementType));
                    }

                case HandleType.ArraySignature:
                    {
                        var arraySignature = _metadataReader.GetArraySignature(_signatureHandle.ToArraySignatureHandle(_metadataReader));
                        return _metadataUnit.Context.GetArrayType(_metadataUnit.GetType(arraySignature.ElementType), arraySignature.Rank);
                    }

                case HandleType.PointerSignature:
                    {
                        var pointerSignature = _metadataReader.GetPointerSignature(_signatureHandle.ToPointerSignatureHandle(_metadataReader));
                        return _metadataUnit.Context.GetPointerType(_metadataUnit.GetType(pointerSignature.Type));
                    }

                case HandleType.ByReferenceSignature:
                    {
                        var byReferenceSignature = _metadataReader.GetByReferenceSignature(_signatureHandle.ToByReferenceSignatureHandle(_metadataReader));
                        return _metadataUnit.Context.GetByRefType(_metadataUnit.GetType(byReferenceSignature.Type));
                    }

                case HandleType.TypeVariableSignature:
                    {
                        var typeVariableSignature = _metadataReader.GetTypeVariableSignature(_signatureHandle.ToTypeVariableSignatureHandle(_metadataReader));
                        return _metadataUnit.Context.GetSignatureVariable(typeVariableSignature.Number, false);
                    }

                case HandleType.MethodTypeVariableSignature:
                    {
                        var methodVariableSignature = _metadataReader.GetMethodTypeVariableSignature(_signatureHandle.ToMethodTypeVariableSignatureHandle(_metadataReader));
                        return _metadataUnit.Context.GetSignatureVariable(methodVariableSignature.Number, true);
                    }

                case HandleType.FunctionPointerSignature:
                    {
                        var functionPointerSignature = _metadataReader.GetFunctionPointerSignature(_signatureHandle.ToFunctionPointerSignatureHandle(_metadataReader));
                        NativeFormatSignatureParser methodSigParser = new NativeFormatSignatureParser(_metadataUnit, functionPointerSignature.Signature, _metadataReader);
                        return _metadataUnit.Context.GetFunctionPointerType(methodSigParser.ParseMethodSignature());
                    }
                default:
                    throw new BadImageFormatException();
            }
        }
        /// <summary>
        /// Use for handle kinds, TypeInstantiationSignature, TypeSpecification, SZArraySignature, ArraySignature, PointerSignature, ByReferenceSignature, TypeVariableSignature, MethodTypeVariableSignature
        /// </summary>
        /// <returns></returns>
        public TypeDesc ParseTypeSignature()
        {
            switch (_signatureHandle.HandleType)
            {
            case HandleType.TypeSpecification:
            {
                var typeSpec = _metadataReader.GetTypeSpecification(_signatureHandle.ToTypeSpecificationHandle(_metadataReader));
                return(_metadataUnit.GetType(typeSpec.Signature));
            }

            case HandleType.TypeInstantiationSignature:
            {
                var        typeInstantiationSignature = _metadataReader.GetTypeInstantiationSignature(_signatureHandle.ToTypeInstantiationSignatureHandle(_metadataReader));
                var        openType               = (MetadataType)_metadataUnit.GetType(typeInstantiationSignature.GenericType);
                var        typeArguments          = typeInstantiationSignature.GenericTypeArguments;
                TypeDesc[] instantiationArguments = new TypeDesc[typeArguments.Count];
                int        i = 0;
                foreach (Handle typeArgument in typeArguments)
                {
                    instantiationArguments[i] = _metadataUnit.GetType(typeArgument);
                    i++;
                }
                return(_metadataUnit.Context.GetInstantiatedType(openType, new Instantiation(instantiationArguments)));
            }

            case HandleType.SZArraySignature:
            {
                var szArraySignature = _metadataReader.GetSZArraySignature(_signatureHandle.ToSZArraySignatureHandle(_metadataReader));
                return(_metadataUnit.Context.GetArrayType(_metadataUnit.GetType(szArraySignature.ElementType)));
            }

            case HandleType.ArraySignature:
            {
                var arraySignature = _metadataReader.GetArraySignature(_signatureHandle.ToArraySignatureHandle(_metadataReader));
                return(_metadataUnit.Context.GetArrayType(_metadataUnit.GetType(arraySignature.ElementType), arraySignature.Rank));
            }

            case HandleType.PointerSignature:
            {
                var pointerSignature = _metadataReader.GetPointerSignature(_signatureHandle.ToPointerSignatureHandle(_metadataReader));
                return(_metadataUnit.Context.GetPointerType(_metadataUnit.GetType(pointerSignature.Type)));
            }

            case HandleType.ByReferenceSignature:
            {
                var byReferenceSignature = _metadataReader.GetByReferenceSignature(_signatureHandle.ToByReferenceSignatureHandle(_metadataReader));
                return(_metadataUnit.Context.GetByRefType(_metadataUnit.GetType(byReferenceSignature.Type)));
            }

            case HandleType.TypeVariableSignature:
            {
                var typeVariableSignature = _metadataReader.GetTypeVariableSignature(_signatureHandle.ToTypeVariableSignatureHandle(_metadataReader));
                return(_metadataUnit.Context.GetSignatureVariable(typeVariableSignature.Number, false));
            }

            case HandleType.MethodTypeVariableSignature:
            {
                var methodVariableSignature = _metadataReader.GetMethodTypeVariableSignature(_signatureHandle.ToMethodTypeVariableSignatureHandle(_metadataReader));
                return(_metadataUnit.Context.GetSignatureVariable(methodVariableSignature.Number, true));
            }

            case HandleType.FunctionPointerSignature:
            {
                var functionPointerSignature = _metadataReader.GetFunctionPointerSignature(_signatureHandle.ToFunctionPointerSignatureHandle(_metadataReader));
                NativeFormatSignatureParser methodSigParser = new NativeFormatSignatureParser(_metadataUnit, functionPointerSignature.Signature, _metadataReader);
                return(_metadataUnit.Context.GetFunctionPointerType(methodSigParser.ParseMethodSignature()));
            }

            default:
                throw new BadImageFormatException();
            }
        }