Thread overview
[D-runtime] Two questions about object opEquals
Mar 09, 2013
kenji hara
Mar 09, 2013
Simen Kjærås
Mar 09, 2013
Jonathan M Davis
Mar 10, 2013
kenji hara
March 10, 2013
I don't know why following. Can someone answer?

1. Object.opEquals(Object lhs, Object.rhs)

It seems to me that nobody uses it. Why it exists?

2. object.opEquals(TypeInfo lhs, TypeInfo rhs)

It might be used to hack for typeid(x) == typeid(y), but I'm not sure.
That is much ambiguous, and if it's really used, we should move it to
static TypeInfo.equals and explicitly use it by the name.

Kenji Hara


March 09, 2013
On Sat, 09 Mar 2013 16:28:50 +0100, kenji hara <k.hara.pg@gmail.com> wrote:

> I don't know why following. Can someone answer?
>
> 1. Object.opEquals(Object lhs, Object.rhs)
>
> It seems to me that nobody uses it. Why it exists?
>
> 2. object.opEquals(TypeInfo lhs, TypeInfo rhs)
>
> It might be used to hack for typeid(x) == typeid(y), but I'm not sure.
> That is much ambiguous, and if it's really used, we should move it to
> static TypeInfo.equals and explicitly use it by the name.
>
> Kenji Hara

I might be misremembering, but I seem to recall objA == objB is rewritten into Object.opEquals(objA, objB). Object.opEquals(Object lhs, Object rhs) then does the actual two-way comparison of objA.opEquals(objB) && objB.opEquals(objA).

-- 
Simen

March 09, 2013
On Saturday, March 09, 2013 21:00:07 Simen Kjærås wrote:
> On Sat, 09 Mar 2013 16:28:50 +0100, kenji hara <k.hara.pg@gmail.com> wrote:
> > I don't know why following. Can someone answer?
> > 
> > 1. Object.opEquals(Object lhs, Object.rhs)
> > 
> > It seems to me that nobody uses it. Why it exists?
> > 
> > 2. object.opEquals(TypeInfo lhs, TypeInfo rhs)
> > 
> > It might be used to hack for typeid(x) == typeid(y), but I'm not sure.
> > That is much ambiguous, and if it's really used, we should move it to
> > static TypeInfo.equals and explicitly use it by the name.
> > 
> > Kenji Hara
> 
> I might be misremembering, but I seem to recall objA == objB is rewritten
> into Object.opEquals(objA, objB). Object.opEquals(Object lhs, Object rhs)
> then does the actual two-way comparison of objA.opEquals(objB) &&
> objB.opEquals(objA).

I believe that that rewrite uses the free function opEquals in object_.d, and not the one on Object. To make matters even more bizarre, the one on Object isn't even static. I suspect that the one on Object can and should be axed. The way it's written is nonsensical, and AFAIK, it's never used.

Of course, the opEquals stuff does need to be revamped a bit anyway, since we'd decided that we want to move towards getting rid of opEquals, opCmp, toHash, and toString on Object, which in the case of opEquals means templatizing the opEquals free function and make it so that it doesn't use Object at all.

- Jonathan M Davis
_______________________________________________
D-runtime mailing list
D-runtime@puremagic.com
http://lists.puremagic.com/mailman/listinfo/d-runtime

March 10, 2013
2013/3/10 Jonathan M Davis <jmdavisProg@gmx.com>

> On Saturday, March 09, 2013 21:00:07 Simen Kjærås wrote:
> > On Sat, 09 Mar 2013 16:28:50 +0100, kenji hara <k.hara.pg@gmail.com>
> wrote:
> > > I don't know why following. Can someone answer?
> > >
> > > 1. Object.opEquals(Object lhs, Object.rhs)
> > >
> > > It seems to me that nobody uses it. Why it exists?
> > >
> > > 2. object.opEquals(TypeInfo lhs, TypeInfo rhs)
> > >
> > > It might be used to hack for typeid(x) == typeid(y), but I'm not sure.
> > > That is much ambiguous, and if it's really used, we should move it to
> > > static TypeInfo.equals and explicitly use it by the name.
> > >
> > > Kenji Hara
> >
> > I might be misremembering, but I seem to recall objA == objB is rewritten
> > into Object.opEquals(objA, objB). Object.opEquals(Object lhs, Object rhs)
> > then does the actual two-way comparison of objA.opEquals(objB) &&
> > objB.opEquals(objA).
>
> I believe that that rewrite uses the free function opEquals in object_.d,
> and
> not the one on Object. To make matters even more bizarre, the one on Object
> isn't even static. I suspect that the one on Object can and should be axed.
> The way it's written is nonsensical, and AFAIK, it's never used.
>
> Of course, the opEquals stuff does need to be revamped a bit anyway, since
> we'd
> decided that we want to move towards getting rid of opEquals, opCmp,
> toHash,
> and toString on Object, which in the case of opEquals means templatizing
> the
> opEquals free function and make it so that it doesn't use Object at all.
>

For #2,  I found this issue and commit.
http://d.puremagic.com/issues/show_bug.cgi?id=3917
https://github.com/D-Programming-Language/druntime/commit/8409adbbb6bde641bd2b852637016068d22c6756

As far as I see, object.opEquals(TypeInfo lhs, TypeInfo rhs) is redundant
and never used.

But for #1, I found the commit that was added, but I still cannot
understand why it was done.
https://github.com/D-Programming-Language/druntime/commit/1e7ddf0425050e4f184532ec1d99316c37a8b2eb

Kenji Hara