betterC: new operator

9il ilyayaroshenko at gmail.com
Tue Nov 24 17:02:27 UTC 2020


On Tuesday, 24 November 2020 at 11:22:30 UTC, Petar Kirov 
[ZombineDev] wrote:
> On Tuesday, 24 November 2020 at 05:40:21 UTC, 9il wrote:
>> On Sunday, 22 November 2020 at 11:54:01 UTC, Dibyendu Majumdar 
>> wrote:
>>> I had assumed that new operator is not available in betterC.
>>>
>>> But in following code, it seems the only way to initialize 
>>> the object correctly ... is there another way I am missing? 
>>> How should one cleanup objects?
>>>
>>> import core.stdc.stdio : printf;
>>>
>>> extern (C++) abstract class A {
>>>     void sayHello();
>>> }
>>>
>>> extern (C++) class B : A {
>>>     override void sayHello() {
>>>         printf("hello\n");
>>>     }
>>> }
>>>
>>> extern (C) void main() {
>>>     scope b = new B;
>>>     b.sayHello();
>>> }
>>
>> Mir's RC classes doesn't use TypeInfo and DRuntime,
>>
>> http://mir-algorithm.libmir.org/mir_rc_ptr.html
>>
>> can be used from C++
>>
>> https://github.com/libmir/mir-algorithm/blob/master/include/mir/rcptr.h
>>
>> and C#
>>
>> https://github.com/libmir/mir.net
>
> Nice! However, how do you initialize the vtbl of the extern 
> (C++) class? I briefly had a look and mir.rc.ptr.createRC [1] 
> calls mir.conv.emplace [2], which is a public import of 
> core.lifetime.emplace, which as far as I can see uses typeinfo 
> for that [3]. You also have a custom typeinfo implementation in 
> mir.typeinfo [4], but I didn't see anything regarding 
> initializing the vtbl pointer in there, just about the pointer 
> to the destructor.

`emplace` ref uses type info in compile time. This may not work 
with betterC flag, I don't know. But it is a compile-time 
constant, so TypeInfo isn't required to be generated into 
executable.

C++ generates its own vtables. Order of methods should mutch in D 
and C++, the implementation of a method may be either on the D 
side or the C++ side.

Sometimes you may need to force the C++ compiler to generate 
vtable using at least one abstract method.

vtable for extern(C++) classes is independent of TypeInfo class. 
But I am not sure how the D compiler generates them.

BTW, to make this work, it should be really an extern(C++) 
interface or abstract classes. So both C++ and D compilers 
generate vtables. And D has some mangling bugs... but finally we 
have ported a really huge private C++/C#/protobuffer codebase to 
D/C# codebase.

> Anyway, impressive work on making the interoperability between 
> D, C++ and .NET more seamless! As a former C# developer, 
> mir.net looks much simpler to use than another marshaling 
> techniques for e.g. C/C++. What is the relation between mir.net 
> and autowrap's support for .NET [5]?

They are independent projects.


More information about the Digitalmars-d mailing list