From 89c737f7e9871353eaef81b8767769a2615590ba Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Wed, 14 Feb 2018 11:38:00 -0800 Subject: [PATCH 1/3] add extern (C++) struct Darray(T) to simplify interop with C++ --- src/dmd/interop.d | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/dmd/interop.d diff --git a/src/dmd/interop.d b/src/dmd/interop.d new file mode 100644 index 000000000000..50e051a845ef --- /dev/null +++ b/src/dmd/interop.d @@ -0,0 +1,29 @@ +/+ +Example usage: +extern (C++) Dstring funLib(Dstring input) +{ + import std.string : toUpper; + import std.conv : to; + return input.toNative.toUpper.to!Dstring; +} ++/ + +extern (C++) struct Darray(T) +{ + size_t length; + T* ptr; + + extern (D) this(T[] a) + { + this.length = a.length; + this.ptr = a.ptr; + } + + extern (D) T[] toNative() + { + // TODO: could even use a raw cast since ABI is same + return ptr[0 .. length]; + } +} + +alias Dstring = Darray!char; From db47c80d42f91f2dca9198000d20abe8b22df5c1 Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Wed, 14 Feb 2018 12:06:35 -0800 Subject: [PATCH 2/3] fixup --- src/dmd/interop.d | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dmd/interop.d b/src/dmd/interop.d index 50e051a845ef..75a1216a836c 100644 --- a/src/dmd/interop.d +++ b/src/dmd/interop.d @@ -27,3 +27,5 @@ extern (C++) struct Darray(T) } alias Dstring = Darray!char; +alias Dcstring = Darray!(const(char)); + From 2c8005dbf9f627cee66b368e6be84c1388608b81 Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Thu, 15 Mar 2018 16:16:21 -0700 Subject: [PATCH 3/3] add visit(TypeVector t) --- src/dmd/cppmangle.d | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/dmd/cppmangle.d b/src/dmd/cppmangle.d index 12b445166156..e033f25e0377 100644 --- a/src/dmd/cppmangle.d +++ b/src/dmd/cppmangle.d @@ -877,6 +877,20 @@ public: } } + override void visit(TypeDArray t) + { + //if (substitute(t)) + //return; + + // from: template_args + buf.writestring("8__dslice"); + buf.writeByte('I'); + Type t2 = t.next; + assert(t2); + headOfType(t2); + buf.writeByte('E'); + } + override void visit(TypeSArray t) { if (t.isImmutable() || t.isShared())