On 12/7/17 9:45 AM, Jean-Louis Leroy wrote:
On Thursday, 7 December 2017 at 13:08:09 UTC, Luís Marques wrote:
On Thursday, 7 December 2017 at 08:59:08 UTC, Wild wrote:
You could modify the one I use for PowerNex[1]. It is a hacked
version of Adam D. Ruppes
minimal.zip. There are only a few imports for strlen,
mem{set,move,cpy}, etc.
This one seems to be the one for me. For instance, typeid(ClassName)
seems to work, which I need.
For completeness, I had looked into minlibd but it didn't seemed
compatible with LDC and difficult for me to fix, IIRC. Regarding
Mike's question of what my use case is, I wanted my program to run in
webassembly/asmjs. Since druntime/phobos haven't been ported to that
target, I was being careful with my design to not depend on the
runtime, but then I found out I love the openmethods package. So I
decided to check if I could implement just enough of druntime to allow
a forked version of openmethods to work. As far as I can tell that's
feasible.
I am currently trying to understand how the compiler and the runtime
interact. ClassInfo contains a vtbl array whose ptr property is the same
as the vptr found in an instance of that class. However, when I modify
that pointer (e.g. by reserving 1000 more entries) and create a new
instance, it still contains the old pointer. So it looks like the
compiler sets the vptr without consulting the ClassInfo but somehow
reflects it there. I'd appreciate if anybody can explain how it works,
or sends me links to relevant info.
Example:
import std.stdio;
class Foo {
void foo() {}
}
void main() {
auto oldPtr = Foo.classinfo.vtbl.ptr;
Foo.classinfo.vtbl.reserve(1000);
writeln(oldPtr != Foo.classinfo.vtbl.ptr); // true
Object foo = new Foo();
writeln(oldPtr == *cast(void***)foo); // true, alas
}
The object is constructed here:
https://github.com/dlang/druntime/blob/master/src/rt/lifetime.d#L71
specifically, the vtbl is set when you blit the initializer array
(another piece of the TypeInfo) into the class object here:
https://github.com/dlang/druntime/blob/master/src/rt/lifetime.d#L115
So basically, the reason why it happens is because the pointer you are
changing is not the piece that actually is used to intialize the block.
On a side note however, you really shouldn't change data in a ClassInfo
at all, and probably the compiler shouldn't let you! This is static
readonly data, and changing this is I think even disallowed on some OSes.
Relevant source of how vtbls in D work:
https://dlang.org/spec/abi.html#classes
-Steve