digitalmars.D.bugs - TypeInfo_C.equals defined absurdly
- Stewart Gordon (37/37) Jul 18 2005 I've noticed this, while looking through the Phobos source (DMD 0.128):
- Ben Hinkle (4/14) Jul 18 2005 see also http://www.digitalmars.com/d/archives/digitalmars/D/bugs/1306.h...
- Walter (3/6) Jul 22 2005 I agree. Good catch. -Walter
I've noticed this, while looking through the Phobos source (DMD 0.128):
std\typeinfo\ti_C.d
int equals(void *p1, void *p2)
{
Object o1 = *cast(Object*)p1;
Object o2 = *cast(Object*)p2;
return o1 == o2 || (o1 && o1.opCmp(o2) == 0);
}
Where on earth did this come from? It checks whether they're equal, and
then if they're not, whether they rank equally in order.
The spec doesn't indicate whether having a class where unequal objects
can rank equally in order (something that the Java API spec allows) is a
correct practice in D.
But either way, something's wrong:
- If equal ranking of unequal objects is supposed to be allowed, then
this function doesn't check objects for equality as its name (and
presumably intended use) indicates.
- If it isn't meant to be allowed (and if so then this needs to be
documented), then getting a second opinion on whether the objects are
equal is a mere waste of time.
In either case, replacing the return statement with
return o1 == o2;
will fix it to this extent.
Moreover, I also noticed that while TypeInfo_C.compare treats null
object references as a special case, TypeInfo_C.equals will just AV if
o1 is null. This looks inconsistent and probably not what was intended.
To fix:
return (o1 is o2) || (o1 !is null && o2 !is null && o1 == o2);
Stewart.
--
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS/M d- s:- a->--- UB P+ L E W++ N+++ o K- w++ O? M V? PS- PE- Y?
PGP- t- 5? X? R b DI? D G e++>++++ h-- r-- !y
------END GEEK CODE BLOCK------
My e-mail is valid but not my primary mailbox. Please keep replies on
the 'group where everyone may benefit.
Jul 18 2005
"Stewart Gordon" <smjg_1998 yahoo.com> wrote in message
news:dbftm0$2k4r$1 digitaldaemon.com...
I've noticed this, while looking through the Phobos source (DMD 0.128):
std\typeinfo\ti_C.d
int equals(void *p1, void *p2)
{
Object o1 = *cast(Object*)p1;
Object o2 = *cast(Object*)p2;
return o1 == o2 || (o1 && o1.opCmp(o2) == 0);
}
Where on earth did this come from? It checks whether they're equal, and
then if they're not, whether they rank equally in order.
see also http://www.digitalmars.com/d/archives/digitalmars/D/bugs/1306.html
I agree the opCmp shouldn't be there in the first place, though.
Jul 18 2005
"Stewart Gordon" <smjg_1998 yahoo.com> wrote in message
news:dbftm0$2k4r$1 digitaldaemon.com...
In either case, replacing the return statement with
return o1 == o2;
will fix it to this extent.
I agree. Good catch. -Walter
Jul 22 2005









"Ben Hinkle" <ben.hinkle gmail.com> 