On Sat, 24 May 2014 21:39:14 -0700, H. S. Teoh via Digitalmars-d <digitalmars-d@puremagic.com> wrote:

On Sat, May 24, 2014 at 06:05:49PM -0700, Steven Schveighoffer via Digitalmars-d wrote:
On Sat, 24 May 2014 02:54:01 -0700, FG <h...@fgda.pl> wrote:
[...]
>Really? Then what does TypeInfo.compare(void*, void*) use? For
>example here:
>
>     auto key_hash = keyti.getHash(pkey); Entry *e;
>     /* ... */
>     if (key_hash == e.hash) {
>         auto c = keyti.compare(pkey, e + 1);
>         if (c == 0) goto Lret;
>     }

You know what, you are right. I assumed it used keyti.equals. This is
a bug imo, since opCmp will be used, and opEquals will be ignored.
Just checking for opCmp == 0 is identical to opEquals, except some
types can define opEquals but not opCmp.

But I don't know if it will get fixed. The whole AA runtime has to be
redone at some point.
[...]

This has been argued over in a druntime pull before. I'm 100% for
changing the above line (and all other instances of it) to use
keyti.equals() instead. But that was shot down due to potential breakage
of existing code. :-( :-( Nevermind the fact that it probably breaks a
lot more *new* code than it ever will break old code... :-(

Any object/struct that defines opCmp but not opEquals is broken, and deserves to not work with AAs.

It's a trivial change to add opEquals when opCmp is defined. This change should happen should happen. What pull request is it?

It's been far too long that AA's have been broken in druntime. Somebody
should just take the aaA.d out in the back and shoot it, and replace it
with a better implementation. I think users will be far happier with
that.

I don't know that the current implementation is broken, just horrible. I'd rather focus on getting a full library type able to be up-to-par with the builtin type, and then switch the implementation over in the compiler. IIRC, the compiler does some magic (i.e. ignoring certain attribute requirements) that can't be done for a library type.

-Steve

Reply via email to