Пример #1
0
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;
	}
}
Пример #2
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);
}