On 5 September 2012 13:27, Benjamin Thaut <c...@benjamin-thaut.de> wrote: > Am 05.09.2012 14:14, schrieb Alex Rønne Petersen: > >> >> Where's the catch? From looking in druntime, I don't see where the >> allocation could occur. >> > > Everything is in object_.d: > > equals_t opEquals(Object lhs, Object rhs) > { > if (lhs is rhs) > return true; > if (lhs is null || rhs is null) > return false; > if (typeid(lhs) == typeid(rhs)) > return lhs.opEquals(rhs); > return lhs.opEquals(rhs) && > rhs.opEquals(lhs); > } > > Will trigger a comparison of the TypeInfo objects with > if (typeid(lhs) == typeid(rhs)) > > Which will after some function calls trigger opEquals of TypeInfo > > override equals_t opEquals(Object o) > { > /* TypeInfo instances are singletons, but duplicates can exist > * across DLL's. Therefore, comparing for a name match is > * sufficient. > */ > if (this is o) > return true; > TypeInfo ti = cast(TypeInfo)o; > return ti && this.toString() == ti.toString(); > } >
This got fixed. Said code is now: override equals_t opEquals(Object o) { if (this is o) return true; auto c = cast(const TypeInfo_Class)o; return c && this.info.name == c.info.name; } Causing no hidden allocation. Regards -- Iain Buclaw *(p < e ? p++ : p) = (c & 0x0f) + '0';