digitalmars.D.learn - Cast to subclass in the dmd compiler
- unDEFER (18/18) Jul 25 2017 Hello!
- Steven Schveighoffer (7/29) Jul 25 2017 I think it's likely that these are actually C++ classes, and probably
- unDEFER (5/5) Jul 25 2017 I have found the answer in the code.
- Nicholas Wilson (3/8) Jul 25 2017 grep for kluge in code, you'll find all the places it does its
- Jacob Carlborg (6/13) Jul 25 2017 That's the correct solution. For Expression, there's a field called "op"...
- unDEFER (2/5) Jul 26 2017 Thank you for hint!
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 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
Jul 25 2017
I have found the answer in the code. Right code is: Import imp = m.isImport(); if (imp !is null) Thank you.
Jul 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.
Jul 25 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
Jul 25 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!
Jul 26 2017









Nicholas Wilson <iamthewilsonator hotmail.com> 