www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Cast to subclass in the dmd compiler

reply unDEFER <undefer gmail.com> writes:
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?
Jul 25
parent reply Steven Schveighoffer <schveiguy yahoo.com> writes:
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
Jul 25
parent reply unDEFER <undefer gmail.com> writes:
I have found the answer in the code.
Right code is:

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

Thank you.
Jul 25
next sibling parent Nicholas Wilson <iamthewilsonator hotmail.com> writes:
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.
Jul 25
prev sibling parent reply Jacob Carlborg <doob me.com> writes:
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
Jul 25
parent unDEFER <undefer gmail.com> writes:
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!
Jul 26