ILMethod *ILProgramItemToMethod(ILProgramItem *item) { if(!item) { return 0; } else if((item->token & IL_META_TOKEN_MASK) == IL_META_TOKEN_METHOD_DEF) { return (ILMethod *)item; } else if((item->token & IL_META_TOKEN_MASK) == IL_META_TOKEN_MEMBER_REF) { if(ILMember_IsMethod(item)) { return (ILMethod *)item; } else if(ILMember_IsRef(item)) { ILMember *ref = ILMemberResolveRef((ILMember *)item); if(ILMember_IsMethod(ref)) { return (ILMethod *)ref; } else { return 0; } } else { return 0; } } else { return 0; } }
/* * Determine if "classInfo" fully implements "interface". * Note: Returns non-zero on error. */ static int ImplementsInterface(ILNode *node, ILClass *classInfo, ILClass *interface, ILGenInterfaceErrorFunc error, ILGenInterfaceProxyFunc proxy, ILClass **visited, int *visitedSize) { int posn; ILMember *member; int sawErrors; /* Bail out if we've already visited this interface */ for(posn = 0; posn < *visitedSize; ++posn) { if(visited[posn] == interface) { return 0; } } visited[(*visitedSize)++] = interface; /* Process all members within the interface */ sawErrors = 0; member = 0; while((member = ILClassNextMember(interface, member)) != 0) { if(ILMember_IsMethod(member) && !ILMethod_HasSpecialName(member)) { sawErrors |= ImplementsMethod(node, classInfo, (ILMethod *)member, error, proxy); } else if(ILMember_IsProperty(member) || ILMember_IsEvent(member)) { sawErrors |= ImplementsMethodSem(node, classInfo, member, error, proxy); } } /* Process all of the parent interfaces */ return sawErrors | ImplementsAllInterfaces(node, classInfo, interface, error, proxy, visited, visitedSize); }