示例#1
0
文件: opover.c 项目: odis-project/ldc
Expression *EqualExp::op_overload(Scope *sc)
{
    //printf("EqualExp::op_overload() (%s)\n", toChars());

    Type *t1 = e1->type->toBasetype();
    Type *t2 = e2->type->toBasetype();
    if (t1->ty == Tclass && t2->ty == Tclass)
    {
        /* Rewrite as:
         *      .object.opEquals(cast(Object)e1, cast(Object)e2)
         * The explicit cast is necessary for interfaces,
         * see http://d.puremagic.com/issues/show_bug.cgi?id=4088
         */
        Expression *e1x = e1; //new CastExp(loc, e1, ClassDeclaration::object->getType());
        Expression *e2x = e2; //new CastExp(loc, e2, ClassDeclaration::object->getType());

        Expression *e = new IdentifierExp(loc, Id::empty);
        e = new DotIdExp(loc, e, Id::object);
        e = new DotIdExp(loc, e, Id::eq);
        e = new CallExp(loc, e, e1x, e2x);
        e = e->semantic(sc);
        return e;
    }

    return compare_overload(sc, Id::eq);
}
示例#2
0
文件: opover.c 项目: michelf/dmd
Expression *EqualExp::op_overload(Scope *sc)
{
    //printf("EqualExp::op_overload() (%s)\n", toChars());

    Type *t1 = e1->type->toBasetype();
    Type *t2 = e2->type->toBasetype();
    if (t1->ty == Tclass && t2->ty == Tclass)
    {
        /* Rewrite as:
         *      .object.opEquals(e1, e2)
         */
        Expression *e = new IdentifierExp(loc, Id::empty);
        e = new DotIdExp(loc, e, Id::object);
        e = new DotIdExp(loc, e, Id::eq);
        e = new CallExp(loc, e, e1, e2);
        e = e->semantic(sc);
        return e;
    }

    return compare_overload(sc, Id::eq);
}
示例#3
0
文件: opover.c 项目: alexrp/dmd
Expression *EqualExp::op_overload(Scope *sc)
{
    //printf("EqualExp::op_overload() (%s)\n", toChars());

    Type *t1 = e1->type->toBasetype();
    Type *t2 = e2->type->toBasetype();
    if (t1->ty == Tclass && t2->ty == Tclass)
    {   ClassDeclaration *cd1 = t1->isClassHandle();
        ClassDeclaration *cd2 = t2->isClassHandle();

        if (!(cd1->isCPPinterface() || cd2->isCPPinterface()))
        {
            /* Rewrite as:
             *      .object.opEquals(e1, e2)
             */
            Expression *e1x = e1;
            Expression *e2x = e2;

            /*
             * The explicit cast is necessary for interfaces,
             * see http://d.puremagic.com/issues/show_bug.cgi?id=4088
             */
            Type *to = ClassDeclaration::object->getType();
            if (cd1->isInterfaceDeclaration())
                e1x = new CastExp(loc, e1, t1->isMutable() ? to : to->constOf());
            if (cd2->isInterfaceDeclaration())
                e2x = new CastExp(loc, e2, t2->isMutable() ? to : to->constOf());

            Expression *e = new IdentifierExp(loc, Id::empty);
            e = new DotIdExp(loc, e, Id::object);
            e = new DotIdExp(loc, e, Id::eq);
            e = new CallExp(loc, e, e1x, e2x);
            e = e->semantic(sc);
            return e;
        }
    }

    return compare_overload(sc, Id::eq);
}
示例#4
0
文件: opover.c 项目: odis-project/ldc
Expression *CmpExp::op_overload(Scope *sc)
{
    //printf("CmpExp::op_overload() (%s)\n", toChars());

    return compare_overload(sc, Id::cmp);
}