betterC: new operator
Basile B.
b2.temp at gmx.com
Sun Nov 22 16:58:03 UTC 2020
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();
> }
You can recreate the vtable using static introspection, POC:
---
#!dmd -betterC
module a;
import core.stdc.stdlib : malloc;
import core.stdc.stdio : printf;
import std.traits;
void setVtable(CT)(ref void** memory)
{
alias members = __traits(allMembers, CT);
void** entries = cast(void**) malloc(members.length + 1);
size_t i;
static foreach(m; members)
static if (isSomeFunction!(__traits(getMember, CT, m)))
static foreach (ov; __traits(getVirtualMethods, CT,
m))
{
entries[i++] = &ov;
}
memory[0] = *entries; // pointer to vtable
memory[1] = null; // monitor
memory[2] = null; // interfaces
}
CT New(CT, A...)(A a) @trusted
if (is(CT == class))
{
enum size = __traits(classInstanceSize, CT);
void** memory = cast(void**) malloc(size);
setVtable!CT(memory);
CT result = cast(CT) &memory;
static if (__traits(hasMember, CT, "__ctor"))
result.__ctor(a);
return result;
}
extern (C++) class A {
abstract void sayHello() {}
}
extern (C++) class B : A {
override void sayHello() {
printf("hello\n");
}
}
extern (C) void main() {
B b = New!B();
b.sayHello();
}
---
however note
1. not well tested (e.g overloads)
2. static init of fields is not done because that really rquires
TypeInfo, so a ctor has to be used instead.
But that's a good start to get things done more properly
More information about the Digitalmars-d
mailing list