private MethodSignature InitializeSignature() { var metadataReader = MetadataReader; NativeFormatSignatureParser parser = new NativeFormatSignatureParser(MetadataUnit, MetadataReader.GetMethod(_handle).Signature, metadataReader); var signature = parser.ParseMethodSignature(); return(_signature = signature); }
private TypeDesc InitializeFieldType() { var metadataReader = MetadataReader; NativeFormatSignatureParser parser = new NativeFormatSignatureParser(MetadataUnit, metadataReader.GetField(_handle).Signature, metadataReader); var fieldType = parser.ParseFieldSignature(); return(_fieldType = fieldType); }
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(); }
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)); } }
private MethodSignature InitializeSignature() { var metadataReader = MetadataReader; NativeFormatSignatureParser parser = new NativeFormatSignatureParser(MetadataUnit, MetadataReader.GetMethod(_handle).Signature, metadataReader); var signature = parser.ParseMethodSignature(); return (_signature = signature); }
/// <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(); } }