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