private MethodSignature InitializeSignature() { var metadataReader = MetadataReader; BlobReader signatureReader = metadataReader.GetBlobReader(metadataReader.GetMethodDefinition(_handle).Signature); EcmaSignatureParser parser = new EcmaSignatureParser(Module, signatureReader); var signature = parser.ParseMethodSignature(); return (_signature = signature); }
public override LocalVariableDefinition[] GetLocals() { if (_locals != null) return _locals; var metadataReader = _module.MetadataReader; var localSignature = _methodBody.LocalSignature; if (localSignature.IsNil) return Array.Empty<LocalVariableDefinition>(); BlobReader signatureReader = metadataReader.GetBlobReader(metadataReader.GetStandaloneSignature(localSignature).Signature); EcmaSignatureParser parser = new EcmaSignatureParser(_module, signatureReader); LocalVariableDefinition[] locals = parser.ParseLocalsSignature(); return (_locals = locals); }
private TypeDesc InitializeFieldType() { var metadataReader = MetadataReader; BlobReader signatureReader = metadataReader.GetBlobReader(metadataReader.GetFieldDefinition(_handle).Signature); EcmaSignatureParser parser = new EcmaSignatureParser(Module, signatureReader); var fieldType = parser.ParseFieldSignature(); return (_fieldType = fieldType); }
private Object ResolveMemberReference(MemberReferenceHandle handle) { MemberReference memberReference = _metadataReader.GetMemberReference(handle); Object parent = GetObject(memberReference.Parent); TypeDesc parentTypeDesc = parent as TypeDesc; if (parentTypeDesc != null) { BlobReader signatureReader = _metadataReader.GetBlobReader(memberReference.Signature); EcmaSignatureParser parser = new EcmaSignatureParser(this, signatureReader); string name = _metadataReader.GetString(memberReference.Name); if (parser.IsFieldSignature) { FieldDesc field = parentTypeDesc.GetField(name); if (field != null) { return(field); } throw new TypeSystemException.MissingFieldException(parentTypeDesc, 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); throw new TypeSystemException.MissingMethodException(parentTypeDesc, name, sig); } } else if (parent is MethodDesc) { throw new NotSupportedException("Vararg methods not supported in .NET Core."); } else if (parent is ModuleDesc) { throw new NotImplementedException("MemberRef to a global function or variable."); } throw new BadImageFormatException(); }
private Object ResolveMemberReference(MemberReferenceHandle handle) { MemberReference memberReference = _metadataReader.GetMemberReference(handle); Object parent = GetObject(memberReference.Parent); TypeDesc parentTypeDesc = parent as TypeDesc; if (parentTypeDesc != null) { BlobReader signatureReader = _metadataReader.GetBlobReader(memberReference.Signature); EcmaSignatureParser parser = new EcmaSignatureParser(this, signatureReader); string name = _metadataReader.GetString(memberReference.Name); if (parser.IsFieldSignature) { FieldDesc field = parentTypeDesc.GetField(name); if (field != null) { return(field); } ThrowHelper.ThrowMissingFieldException(parentTypeDesc, name); } else { MethodSignature sig = parser.ParseMethodSignature(); TypeDesc typeDescToInspect = parentTypeDesc; Instantiation substitution = default(Instantiation); // Try to resolve the name and signature in the current type, or any of the base types. do { MethodDesc method = typeDescToInspect.GetMethod(name, sig, substitution); 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); } var baseType = typeDescToInspect.BaseType; if (baseType != null) { if (!baseType.HasInstantiation) { substitution = default(Instantiation); } else { // If the base type is generic, any signature match for methods on the base type with the generic details from // the deriving type Instantiation newSubstitution = typeDescToInspect.GetTypeDefinition().BaseType.Instantiation; if (!substitution.IsNull) { TypeDesc[] newSubstitutionTypes = new TypeDesc[newSubstitution.Length]; for (int i = 0; i < newSubstitution.Length; i++) { newSubstitutionTypes[i] = newSubstitution[i].InstantiateSignature(substitution, default(Instantiation)); } newSubstitution = new Instantiation(newSubstitutionTypes); } substitution = newSubstitution; } } typeDescToInspect = baseType; } while (typeDescToInspect != null); ThrowHelper.ThrowMissingMethodException(parentTypeDesc, name, sig); } } else if (parent is MethodDesc) { ThrowHelper.ThrowInvalidProgramException(ExceptionStringID.InvalidProgramVararg, (MethodDesc)parent); } else if (parent is ModuleDesc) { throw new NotImplementedException("MemberRef to a global function or variable."); } throw new BadImageFormatException(); }