On Sunday, 19 May 2013 at 13:56:56 UTC, Daniel Murphy wrote:
"Igor Stepanov" <[email protected]> wrote in message
news:[email protected]...
Is this mean, that D functions will _not_ create C++ objects with new?
For example:
You have moved parser to D, but you haven't moved expressions to D yet. And you want to create new Expression object in parser (in D code), but Expression class defined in C++. What will you do in this case?

This is not how we're moving it. The entire frontend will be moved in one
go, there will never be a need to create a C++ class from D.

That said, the glue layer will remain in C++ and will need to create instances of classes defined in D. The current glue layer calls 43
different constructors.

I don't have a solution for this yet, but it will probably be:
a) Extend D to allow creating classes with constructors callable from C++ b) Create/generate factory functions for each class new'd in the glue layer
c) Remove all class allocations from the glue layer

I'm leaning towards b, or maybe c, and I think you should too.

Yes, language shouldn't be modified for the sake of one goal.
But do you think, that calling C++ constructors from D is not typical task? I sure, that we must get a common way to bind C++ classes to D. No templates, no exceptions. But operators and constructors/destructors is needed. It may be special tool, that eat C++ header and return D file + C++ glue file. This util should transform all fields and constructors to D final methods for extern(C++) interface. In addition to this tool we can make a D binding layer, which simplify typical operations such as creating C++ objects using ::operator new() (or class operator new() if in exists) and destroying with operator delete() (local or global).

By the way: Why D disallow static __gshared C++ variables in classes? This is a principled feature (if yes: why?) or omission?

Reply via email to