protected virtual MethodDesc ResolveVirtualMethod(MethodDesc declMethod, DefType implType) { MethodDesc impl; if (declMethod.OwningType.IsInterface) { impl = implType.ResolveInterfaceMethodTarget(declMethod); if (impl != null) { impl = implType.FindVirtualFunctionTargetMethodOnObjectType(impl); } } else { impl = implType.FindVirtualFunctionTargetMethodOnObjectType(declMethod); if (impl != null && (impl != declMethod)) { MethodDesc slotDefiningMethodImpl = MetadataVirtualMethodAlgorithm.FindSlotDefiningMethodForVirtualMethod(impl); MethodDesc slotDefiningMethodDecl = MetadataVirtualMethodAlgorithm.FindSlotDefiningMethodForVirtualMethod(declMethod); if (slotDefiningMethodImpl != slotDefiningMethodDecl) { // We cannot resolve virtual method in case the impl is a different slot from the declMethod impl = null; } } } return(impl); }
protected virtual MethodDesc ResolveVirtualMethod(MethodDesc declMethod, DefType implType) { // Quick check: if decl matches impl, we're done. if (declMethod.OwningType == implType) { return(declMethod); } MethodDesc impl; if (declMethod.OwningType.IsInterface) { impl = implType.ResolveInterfaceMethodTarget(declMethod); if (impl != null) { impl = implType.FindVirtualFunctionTargetMethodOnObjectType(impl); } } else { impl = implType.FindVirtualFunctionTargetMethodOnObjectType(declMethod); } return(impl); }
protected virtual MethodDesc ResolveVirtualMethod(MethodDesc declMethod, DefType implType) { MethodDesc impl; if (declMethod.OwningType.IsInterface) { if (declMethod.OwningType.IsCanonicalSubtype(CanonicalFormKind.Any) || implType.IsCanonicalSubtype(CanonicalFormKind.Any)) { DefType[] implTypeRuntimeInterfaces = implType.RuntimeInterfaces; int canonicallyMatchingInterfacesFound = 0; DefType canonicalInterfaceType = (DefType)declMethod.OwningType.ConvertToCanonForm(CanonicalFormKind.Specific); for (int i = 0; i < implTypeRuntimeInterfaces.Length; i++) { DefType runtimeInterface = implTypeRuntimeInterfaces[i]; if (canonicalInterfaceType.HasSameTypeDefinition(runtimeInterface) && runtimeInterface.ConvertToCanonForm(CanonicalFormKind.Specific) == canonicalInterfaceType) { canonicallyMatchingInterfacesFound++; if (canonicallyMatchingInterfacesFound > 1) { // We cannot resolve the interface as we don't know with exact enough detail which interface // of multiple possible interfaces is being called. return(null); } } } } impl = implType.ResolveInterfaceMethodTarget(declMethod); if (impl != null) { impl = implType.FindVirtualFunctionTargetMethodOnObjectType(impl); } } else { impl = implType.FindVirtualFunctionTargetMethodOnObjectType(declMethod); if (impl != null && (impl != declMethod)) { MethodDesc slotDefiningMethodImpl = MetadataVirtualMethodAlgorithm.FindSlotDefiningMethodForVirtualMethod(impl); MethodDesc slotDefiningMethodDecl = MetadataVirtualMethodAlgorithm.FindSlotDefiningMethodForVirtualMethod(declMethod); if (slotDefiningMethodImpl != slotDefiningMethodDecl) { // We cannot resolve virtual method in case the impl is a different slot from the declMethod impl = null; } } } return(impl); }
protected virtual MethodDesc ResolveVirtualMethod(MethodDesc declMethod, DefType implType) { MethodDesc impl; if (declMethod.OwningType.IsInterface) { impl = implType.ResolveInterfaceMethodTarget(declMethod); if (impl != null) { impl = implType.FindVirtualFunctionTargetMethodOnObjectType(impl); } } else { impl = implType.FindVirtualFunctionTargetMethodOnObjectType(declMethod); } return(impl); }