Eliminate class allocators and deallocators?

Steven Schveighoffer schveiguy at yahoo.com
Thu Oct 8 04:48:56 PDT 2009


On Thu, 08 Oct 2009 07:26:37 -0400, Denis Koroskin <2korden at gmail.com>  
wrote:

> On Thu, 08 Oct 2009 14:48:19 +0400, Steven Schveighoffer  
> <schveiguy at yahoo.com> wrote:
>
>> On Wed, 07 Oct 2009 17:54:35 -0400, Denis Koroskin <2korden at gmail.com>  
>> wrote:
>>
>>> On Wed, 07 Oct 2009 23:00:06 +0400, Sean Kelly  
>>> <sean at invisibleduck.org> wrote:
>>>
>>>> auto x = cast(MyClass) malloc(MyClass.classinfo.init.length);
>>>
>>> I would expect a dynamic cast to occur at this line. Which will either  
>>> result in an access violation (since you are trying to cast a garbage  
>>> to an object) or result in a null being returned.
>>
>> malloc returns void *, so no dynamic cast.
>>
>> -Steve
>
> I know malloc returns void*. I didn't know you can hijack type system  
> that easily.
>
> But then, if no dynamic cast takes place why cast(Object)cast(void*)0  
> cannot be evaluated at compile time?

Your message made me test it :)

import std.stdio;

void *foo()
{
     return cast(void*)0;
}

void main()
{
     auto o = cast(Object)foo();
     writefln("here!");
     o.opEquals(o);
}

outputs:

here!
Segmentation fault

So, no dynamic cast (dynamic cast would have looked at the classinfo of  
null, segfaulting before the output).

So I would say, the fact that compile time evaluation doesn't work is a  
bug maybe?

-Steve



More information about the Digitalmars-d mailing list