On 5 September 2012 14:04, Iain Buclaw <ibuc...@ubuntu.com> wrote:
> 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.
>
>

Oops, let me correct myself.

This was hacked at to call the *correct* opEquals method above.


bool opEquals(const Object lhs, const Object rhs)
{
    // A hack for the moment.
    return opEquals(cast()lhs, cast()rhs);
}


Regards
-- 
Iain Buclaw

*(p < e ? p++ : p) = (c & 0x0f) + '0';

Reply via email to