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();
    }

Then because they are const, TypeInfo_Const.toString() will be called:

    override string toString()
    {
        return cast(string) ("const(" ~ base.toString() ~ ")");
    }

which allocates, due to array concardination.

But this only happens, if they are not of the same type, and if one of them has a storage qualifier.

Kind Regards
Benjamin Thaut

Reply via email to