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