Thread overview
Cast to subclass in the dmd compiler
Jul 25, 2017
unDEFER
Jul 25, 2017
unDEFER
Jul 25, 2017
Nicholas Wilson
Jul 26, 2017
Jacob Carlborg
Jul 26, 2017
unDEFER
July 25, 2017
Hello!
I'm hacking dmd compiler and trying to look on members array just after parse module.

for(uint i = 0; i < members.dim; i++)
{
     Dsymbol m = (*members)[i];

// It is good, but further:

    Import imp = cast(Import) m;
    if (imp !is null)
    {
        printf("++++ import %s.%s\n", imp.packages.toChars(), imp.id.toChars());
    }
// ...
}

For really imports casting doing well. But for not imports it again casts, imp not is null and  the compiler crashes.
What I'm doing wrong?
July 25, 2017
On 7/25/17 4:36 PM, unDEFER wrote:
> Hello!
> I'm hacking dmd compiler and trying to look on members array just after parse module.
> 
> for(uint i = 0; i < members.dim; i++)
> {
>       Dsymbol m = (*members)[i];
> 
> // It is good, but further:
> 
>      Import imp = cast(Import) m;
>      if (imp !is null)
>      {
>          printf("++++ import %s.%s\n", imp.packages.toChars(), imp.id.toChars());
>      }
> // ...
> }
> 
> For really imports casting doing well. But for not imports it again casts, imp not is null and  the compiler crashes.
> What I'm doing wrong?

I think it's likely that these are actually C++ classes, and probably there is no RTTI, so this is a reinterpret cast. This is a wild guess, but much of the compiler still needs to interface with C++ backend.

I would look elsewhere in the compiler to see how they handle this type of thing. Not sure of dynamic_cast support?

-Steve
July 25, 2017
I have found the answer in the code.
Right code is:

Import imp = m.isImport();
if (imp !is null)

Thank you.
July 25, 2017
On Tuesday, 25 July 2017 at 21:06:25 UTC, unDEFER wrote:
> I have found the answer in the code.
> Right code is:
>
> Import imp = m.isImport();
> if (imp !is null)
>
> Thank you.

grep for kluge in code, you'll find all the places it does its own RTTI.
July 26, 2017
On 2017-07-25 23:06, unDEFER wrote:
> I have found the answer in the code.
> Right code is:
> 
> Import imp = m.isImport();
> if (imp !is null)
> 
> Thank you.

That's the correct solution. For Expression, there's a field called "op" that indicates what kind of expression it is, which can used in combination with a cast.

-- 
/Jacob Carlborg
July 26, 2017
On Wednesday, 26 July 2017 at 06:50:21 UTC, Jacob Carlborg wrote:
> For Expression, there's a field called "op" that indicates what kind of expression it is, which can used in combination with a cast.

Thank you for hint!