/// <summary> /// Instantiate a MethodImplRecord from uninstantiated form to instantiated form /// </summary> /// <param name="uninstMethodImpls"></param> /// <returns></returns> private MethodImplRecord[] InstantiateMethodImpls(MethodImplRecord[] uninstMethodImpls) { if (uninstMethodImpls == null || uninstMethodImpls.Length == 0) { return(uninstMethodImpls); } MethodImplRecord[] instMethodImpls = new MethodImplRecord[uninstMethodImpls.Length]; for (int i = 0; i < uninstMethodImpls.Length; i++) { var implTypeInstantiated = uninstMethodImpls[i].Decl.OwningType.InstantiateSignature(this.Instantiation, new Instantiation()); if (implTypeInstantiated is InstantiatedType) { instMethodImpls[i].Decl = _typeDef.Context.GetMethodForInstantiatedType(uninstMethodImpls[i].Decl.GetTypicalMethodDefinition(), (InstantiatedType)implTypeInstantiated); } else { instMethodImpls[i].Decl = uninstMethodImpls[i].Decl; } instMethodImpls[i].Body = _typeDef.Context.GetMethodForInstantiatedType(uninstMethodImpls[i].Body, this); } return(instMethodImpls); }
/// <summary> /// Instantiate a MethodImplRecord from uninstantiated form to instantiated form /// </summary> /// <param name="uninstMethodImpls"></param> /// <returns></returns> private MethodImplRecord[] InstantiateMethodImpls(MethodImplRecord[] uninstMethodImpls) { if (uninstMethodImpls == null || uninstMethodImpls.Length == 0) return uninstMethodImpls; MethodImplRecord[] instMethodImpls = new MethodImplRecord[uninstMethodImpls.Length]; for (int i = 0; i < uninstMethodImpls.Length; i++) { MethodDesc decl; var implTypeInstantiated = uninstMethodImpls[i].Decl.OwningType.InstantiateSignature(this.Instantiation, new Instantiation()); if (implTypeInstantiated is InstantiatedType) { decl = _typeDef.Context.GetMethodForInstantiatedType(uninstMethodImpls[i].Decl.GetTypicalMethodDefinition(), (InstantiatedType)implTypeInstantiated); } else { decl = uninstMethodImpls[i].Decl; } MethodDesc body = _typeDef.Context.GetMethodForInstantiatedType(uninstMethodImpls[i].Body, this); instMethodImpls[i] = new MethodImplRecord(decl, body); } return instMethodImpls; }
// Virtual function related functionality public override MethodImplRecord[] FindMethodsImplWithMatchingDeclName(string declName) { MetadataReader metadataReader = _module.MetadataReader; var stringComparer = metadataReader.StringComparer; ArrayBuilder<MethodImplRecord> foundRecords = new ArrayBuilder<MethodImplRecord>(); foreach (var methodImplHandle in _typeDefinition.GetMethodImplementations()) { MethodImplementation methodImpl = metadataReader.GetMethodImplementation(methodImplHandle); EntityHandle methodDeclCheckHandle = methodImpl.MethodDeclaration; HandleKind methodDeclHandleKind = methodDeclCheckHandle.Kind; // We want to check that the method name matches before actually getting the MethodDesc. For MethodSpecifications // we need to dereference that handle to the underlying member reference to look at name matching. if (methodDeclHandleKind == HandleKind.MethodSpecification) { methodDeclCheckHandle = metadataReader.GetMethodSpecification((MethodSpecificationHandle)methodDeclCheckHandle).Method; methodDeclHandleKind = methodDeclCheckHandle.Kind; } bool foundRecord = false; switch (methodDeclHandleKind) { case HandleKind.MethodDefinition: if (stringComparer.Equals(metadataReader.GetMethodDefinition((MethodDefinitionHandle)methodDeclCheckHandle).Name, declName)) { foundRecord = true; } break; case HandleKind.MemberReference: if (stringComparer.Equals(metadataReader.GetMemberReference((MemberReferenceHandle)methodDeclCheckHandle).Name, declName)) { foundRecord = true; } break; default: Debug.Assert(false, "unexpected methodDeclHandleKind"); break; } if (foundRecord) { MethodImplRecord newRecord = new MethodImplRecord(); newRecord.Decl = (MethodDesc)_module.GetObject(methodImpl.MethodDeclaration); newRecord.Body = (MethodDesc)_module.GetObject(methodImpl.MethodBody); foundRecords.Add(newRecord); } } if (foundRecords.Count != 0) return foundRecords.ToArray(); return null; }
/// <summary> /// Instantiate a MethodImplRecord from uninstantiated form to instantiated form /// </summary> /// <param name="uninstMethodImpls"></param> /// <returns></returns> private MethodImplRecord[] InstantiateMethodImpls(MethodImplRecord[] uninstMethodImpls) { if (uninstMethodImpls == null || uninstMethodImpls.Length == 0) return uninstMethodImpls; MethodImplRecord[] instMethodImpls = new MethodImplRecord[uninstMethodImpls.Length]; for (int i = 0; i < uninstMethodImpls.Length; i++) { instMethodImpls[i].Decl = _typeDef.Context.GetMethodForInstantiatedType(uninstMethodImpls[i].Decl, this); instMethodImpls[i].Body = _typeDef.Context.GetMethodForInstantiatedType(uninstMethodImpls[i].Body, this); } return instMethodImpls; }
/// <summary> /// Instantiate a MethodImplRecord from uninstantiated form to instantiated form /// </summary> /// <param name="uninstMethodImpls"></param> /// <returns></returns> private MethodImplRecord[] InstantiateMethodImpls(MethodImplRecord[] uninstMethodImpls) { if (uninstMethodImpls == null || uninstMethodImpls.Length == 0) { return(uninstMethodImpls); } MethodImplRecord[] instMethodImpls = new MethodImplRecord[uninstMethodImpls.Length]; for (int i = 0; i < uninstMethodImpls.Length; i++) { instMethodImpls[i].Decl = _typeDef.Context.GetMethodForInstantiatedType(uninstMethodImpls[i].Decl, this); instMethodImpls[i].Body = _typeDef.Context.GetMethodForInstantiatedType(uninstMethodImpls[i].Body, this); } return(instMethodImpls); }
protected override MethodImplRecord[] ComputeVirtualMethodImplsForType() { ArrayBuilder<MethodImplRecord> records = new ArrayBuilder<MethodImplRecord>(); MetadataReader metadataReader = _module.MetadataReader; foreach (var methodImplHandle in _typeDefinition.GetMethodImplementations()) { MethodImplementation methodImpl = metadataReader.GetMethodImplementation(methodImplHandle); EntityHandle methodDeclCheckHandle = methodImpl.MethodDeclaration; HandleKind methodDeclHandleKind = methodDeclCheckHandle.Kind; // We want to check that the type is not an interface matches before actually getting the MethodDesc. // For MethodSpecifications we need to dereference that handle to the underlying member reference to // look at the owning type. if (methodDeclHandleKind == HandleKind.MethodSpecification) { methodDeclCheckHandle = metadataReader.GetMethodSpecification((MethodSpecificationHandle)methodDeclCheckHandle).Method; methodDeclHandleKind = methodDeclCheckHandle.Kind; } MetadataType owningType = null; switch (methodDeclHandleKind) { case HandleKind.MethodDefinition: owningType = ((MethodDesc)_module.GetObject(methodDeclCheckHandle)).OwningType as MetadataType; break; case HandleKind.MemberReference: EntityHandle owningTypeHandle = metadataReader.GetMemberReference((MemberReferenceHandle)methodDeclCheckHandle).Parent; owningType = _module.GetObject(owningTypeHandle) as MetadataType; break; default: Debug.Assert(false, "unexpected methodDeclHandleKind"); break; } if (!owningType.IsInterface) { MethodImplRecord newRecord = new MethodImplRecord(); newRecord.Decl = (MethodDesc)_module.GetObject(methodImpl.MethodDeclaration); newRecord.Body = (MethodDesc)_module.GetObject(methodImpl.MethodBody); records.Add(newRecord); } } return records.ToArray(); }