You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
There is kinda plugin here (code is for linux or other posix system with dlfcn)
Why does it crush when using interface instead of abstract class? (-version=inter)
//dinter.d
module dinter;
version(inter) {
pragma(msg, "Using interface");
interface Dinter {
int foo(int a, int b);
}
}
else {
pragma(msg, "Using abstract class");
abstract class Dinter {
int foo(int a, int b);
}
}
//dimpl.d
//dmd -shared -fPIC dimpl.d dinter.d -oflibdimpl.so
//dmd -shared -fPIC dimpl.d dinter.d -oflibdimpl.so -verstion=inter
module dimpl;
import dinter;
class Dimpl : Dinter {
override int foo(int a, int b) {
return a+b;
}
}
extern(C) Dinter create() {
return new Dimpl;
}
//dmain.d
//dmd dmain.d -L-rpath=. -L-ldl
//dmd dmain.d -L-rpath=. -L-ldl -version=inter
import dinter;
import std.c.linux.linux;
import std.string : toStringz;
alias extern(C) Dinter function() CreateFn;
int main(string[] args) {
void* lib = dlopen(toStringz("./libdimpl.so"), RTLD_LAZY);
assert(lib);
auto create = cast(CreateFn)dlsym(lib, toStringz("create"));
assert(create);
Dinter d = create();
assert(d.foo(3,7)==10);
return 0;
}
The text was updated successfully, but these errors were encountered:
This does not appear to be an all platforms issue. I have similar code and mine appears to work on a 64 bit system and fail on 32 bit, which in some ways is more serious.
Roman reported this on 2013-07-26T17:37:00Z
Transferred from https://issues.dlang.org/show_bug.cgi?id=10719
CC List
Description
There is kinda plugin here (code is for linux or other posix system with dlfcn) Why does it crush when using interface instead of abstract class? (-version=inter) //dinter.d module dinter; version(inter) { pragma(msg, "Using interface"); interface Dinter { int foo(int a, int b); } } else { pragma(msg, "Using abstract class"); abstract class Dinter { int foo(int a, int b); } } //dimpl.d //dmd -shared -fPIC dimpl.d dinter.d -oflibdimpl.so //dmd -shared -fPIC dimpl.d dinter.d -oflibdimpl.so -verstion=inter module dimpl; import dinter; class Dimpl : Dinter { override int foo(int a, int b) { return a+b; } } extern(C) Dinter create() { return new Dimpl; } //dmain.d //dmd dmain.d -L-rpath=. -L-ldl //dmd dmain.d -L-rpath=. -L-ldl -version=inter import dinter; import std.c.linux.linux; import std.string : toStringz; alias extern(C) Dinter function() CreateFn; int main(string[] args) { void* lib = dlopen(toStringz("./libdimpl.so"), RTLD_LAZY); assert(lib); auto create = cast(CreateFn)dlsym(lib, toStringz("create")); assert(create); Dinter d = create(); assert(d.foo(3,7)==10); return 0; }The text was updated successfully, but these errors were encountered: