Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 34 additions & 3 deletions src/dmd/dtoh.d
Original file line number Diff line number Diff line change
Expand Up @@ -126,12 +126,43 @@ extern(C++) void genCppHdrFiles(ref Modules ms)
buf.writenl();
buf.writestringln("#pragma once");
buf.writenl();
// buf.writestring("#include <assert.h>\n");
hashInclude(buf, "<assert.h>");
hashInclude(buf, "<stddef.h>");
hashInclude(buf, "<stdint.h>");
// buf.writestring(buf, "#include <stdio.h>\n");
// buf.writestring("#include <string.h>\n");
buf.writenl();

// Emit array compatibility because extern(C++) types may have slices
// as members (as opposed to function parameters)
buf.writestring(`
#ifdef CUSTOM_D_ARRAY_TYPE
#define _d_dynamicArray CUSTOM_D_ARRAY_TYPE
#else
/// Represents a D [] array
template<typename T>
struct _d_dynamicArray
{
size_t length;
T *ptr;

_d_dynamicArray() : length(0), ptr(NULL) { }

_d_dynamicArray(size_t length_in, T *ptr_in)
: length(length_in), ptr(ptr_in) { }

T& operator[](const size_t idx) {
assert(idx < length);
return ptr[idx];
}

const T& operator[](const size_t idx) const {
assert(idx < length);
return ptr[idx];
}
};
#endif
`);

if (v.hasReal)
{
hashIf(buf, "!defined(_d_real)");
Expand Down Expand Up @@ -1568,7 +1599,7 @@ public:
}
if (!cdparent && t.isConst())
buf.writestring("const ");
buf.writestring("DArray< ");
buf.writestring("_d_dynamicArray< ");
t.next.accept(this);
buf.writestring(" >");
}
Expand Down
119 changes: 73 additions & 46 deletions src/dmd/frontend.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,36 @@

#pragma once

#include <assert.h>
#include <stddef.h>
#include <stdint.h>

#ifdef CUSTOM_D_ARRAY_TYPE
#define _d_dynamicArray CUSTOM_D_ARRAY_TYPE
#else
/// Represents a D [] array
template<typename T>
struct _d_dynamicArray
{
size_t length;
T *ptr;

_d_dynamicArray() : length(0), ptr(NULL) { }

_d_dynamicArray(size_t length_in, T *ptr_in)
: length(length_in), ptr(ptr_in) { }

T& operator[](const size_t idx) {
assert(idx < length);
return ptr[idx];
}

const T& operator[](const size_t idx) const {
assert(idx < length);
return ptr[idx];
}
};
#endif
#if !defined(_d_real)
# define _d_real long double
#endif
Expand Down Expand Up @@ -1128,7 +1155,7 @@ struct ObjcClassDeclaration
struct FileName
{
private:
DArray< const char > str;
_d_dynamicArray< const char > str;
public:
static bool equals(const char* name1, const char* name2);
static bool absolute(const char* name);
Expand Down Expand Up @@ -2346,7 +2373,7 @@ struct BaseClass
ClassDeclaration* sym;
uint32_t offset;
Array<FuncDeclaration* > vtbl;
DArray< BaseClass > baseInterfaces;
_d_dynamicArray< BaseClass > baseInterfaces;
bool fillVtbl(ClassDeclaration* cd, Array<FuncDeclaration* >* vtbl, int32_t newinstance);
~BaseClass();
BaseClass() :
Expand Down Expand Up @@ -2387,7 +2414,7 @@ class ClassDeclaration : public AggregateDeclaration
Array<Dsymbol* > vtbl;
Array<Dsymbol* > vtblFinal;
Array<BaseClass* >* baseclasses;
DArray< BaseClass* > interfaces;
_d_dynamicArray< BaseClass* > interfaces;
Array<BaseClass* >* vtblInterfaces;
TypeInfoClassDeclaration* vclassinfo;
bool com;
Expand Down Expand Up @@ -2527,7 +2554,7 @@ class Declaration : public Dsymbol
Prot protection;
LINK linkage;
int32_t inuse;
DArray< char > mangleOverride;
_d_dynamicArray< char > mangleOverride;
const char* kind() const;
d_uns64 size(const Loc& loc);
Dsymbol* search(const Loc& loc, Identifier* ident, int32_t flags = 8);
Expand Down Expand Up @@ -2954,7 +2981,7 @@ class Module final : public Package
static void _init();
static void deinitialize();
static AggregateDeclaration* moduleinfo;
DArray< char > arg;
_d_dynamicArray< char > arg;
ModuleDeclaration* md;
FileName srcfile;
FileName objfile;
Expand Down Expand Up @@ -5072,13 +5099,13 @@ extern "C" void printInternalFailure(_IO_FILE* stream);

extern void generateJson(Array<Module* >* modules);

typedef int32_t(*MainFunc)(DArray< DArray< char > > args);
typedef int32_t(*MainFunc)(_d_dynamicArray< _d_dynamicArray< char > > args);

extern "C" DArray< DArray< char > > rt_options;
extern "C" _d_dynamicArray< _d_dynamicArray< char > > rt_options;

extern "C" int32_t main(int32_t argc, char** argv);

extern "C" int32_t _Dmain(DArray< DArray< char > > _param_0);
extern "C" int32_t _Dmain(_d_dynamicArray< _d_dynamicArray< char > > _param_0);

extern "C" void printGlobalConfigs(_IO_FILE* stream);

Expand Down Expand Up @@ -6464,7 +6491,7 @@ struct Target
TargetC c;
TargetCPP cpp;
TargetObjC objc;
DArray< const char > architectureName;
_d_dynamicArray< const char > architectureName;
template <typename T>
struct FPTypeProperties
{
Expand Down Expand Up @@ -6841,26 +6868,26 @@ struct Param
CHECKENABLE boundscheck;
CHECKACTION checkAction;
uint32_t errorLimit;
DArray< const char > argv0;
_d_dynamicArray< const char > argv0;
Array<const char* > modFileAliasStrings;
Array<const char* >* imppath;
Array<const char* >* fileImppath;
DArray< const char > objdir;
DArray< const char > objname;
DArray< const char > libname;
_d_dynamicArray< const char > objdir;
_d_dynamicArray< const char > objname;
_d_dynamicArray< const char > libname;
bool doDocComments;
DArray< const char > docdir;
DArray< const char > docname;
_d_dynamicArray< const char > docdir;
_d_dynamicArray< const char > docname;
Array<const char* > ddocfiles;
bool doHdrGeneration;
DArray< const char > hdrdir;
DArray< const char > hdrname;
_d_dynamicArray< const char > hdrdir;
_d_dynamicArray< const char > hdrname;
bool hdrStripPlainFunctions;
CxxHeaderMode doCxxHdrGeneration;
DArray< const char > cxxhdrdir;
DArray< const char > cxxhdrname;
_d_dynamicArray< const char > cxxhdrdir;
_d_dynamicArray< const char > cxxhdrname;
bool doJsonGeneration;
DArray< const char > jsonfilename;
_d_dynamicArray< const char > jsonfilename;
JsonFieldFlags jsonFieldFlags;
OutBuffer* mixinOut;
const char* mixinFile;
Expand All @@ -6869,10 +6896,10 @@ struct Param
Array<const char* >* debugids;
uint32_t versionlevel;
Array<const char* >* versionids;
DArray< const char > defaultlibname;
DArray< const char > debuglibname;
DArray< const char > mscrtlib;
DArray< const char > moduleDepsFile;
_d_dynamicArray< const char > defaultlibname;
_d_dynamicArray< const char > debuglibname;
_d_dynamicArray< const char > mscrtlib;
_d_dynamicArray< const char > moduleDepsFile;
OutBuffer* moduleDeps;
MessageStyle messageStyle;
bool debugb;
Expand All @@ -6888,10 +6915,10 @@ struct Param
Array<bool > linkswitchIsForCC;
Array<const char* > libfiles;
Array<const char* > dllfiles;
DArray< const char > deffile;
DArray< const char > resfile;
DArray< const char > exefile;
DArray< const char > mapfile;
_d_dynamicArray< const char > deffile;
_d_dynamicArray< const char > resfile;
_d_dynamicArray< const char > exefile;
_d_dynamicArray< const char > mapfile;
~Param();
Param() :
obj(true),
Expand Down Expand Up @@ -7045,23 +7072,23 @@ enum : uint32_t { STRUCTALIGN_DEFAULT = 4294967295u };

struct Global
{
DArray< const char > inifilename;
DArray< char > mars_ext;
DArray< const char > obj_ext;
DArray< const char > lib_ext;
DArray< const char > dll_ext;
DArray< char > doc_ext;
DArray< char > ddoc_ext;
DArray< char > hdr_ext;
DArray< char > cxxhdr_ext;
DArray< char > json_ext;
DArray< char > map_ext;
_d_dynamicArray< const char > inifilename;
_d_dynamicArray< char > mars_ext;
_d_dynamicArray< const char > obj_ext;
_d_dynamicArray< const char > lib_ext;
_d_dynamicArray< const char > dll_ext;
_d_dynamicArray< char > doc_ext;
_d_dynamicArray< char > ddoc_ext;
_d_dynamicArray< char > hdr_ext;
_d_dynamicArray< char > cxxhdr_ext;
_d_dynamicArray< char > json_ext;
_d_dynamicArray< char > map_ext;
bool run_noext;
DArray< char > copyright;
DArray< char > written;
_d_dynamicArray< char > copyright;
_d_dynamicArray< char > written;
Array<const char* >* path;
Array<const char* >* filePath;
DArray< const char > vendor;
_d_dynamicArray< const char > vendor;
Param params;
uint32_t errors;
uint32_t warnings;
Expand Down Expand Up @@ -7542,7 +7569,7 @@ class Identifier final : public RootObject
{
int32_t value;
bool isAnonymous_;
DArray< char > name;
_d_dynamicArray< char > name;
public:
static Identifier* create(const char* name);
const char* toChars() const;
Expand All @@ -7561,8 +7588,8 @@ struct Token
Loc loc;
const char* ptr;
TOK value;
DArray< const char > blockComment;
DArray< const char > lineComment;
_d_dynamicArray< const char > blockComment;
_d_dynamicArray< const char > lineComment;
union
{
int64_t intvalue;
Expand Down Expand Up @@ -7598,7 +7625,7 @@ struct Array
// Ignoring var length alignment 0
size_t length;
// Ignoring var data alignment 0
DArray< T > data;
_d_dynamicArray< T > data;
// Ignoring var SMALLARRAYCAP alignment 0
// Ignoring var smallarray alignment 0
void* smallarray;
Expand Down
31 changes: 29 additions & 2 deletions test/compilable/test21217.d → test/compilable/dtoh_21217.d
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,43 @@ TEST_OUTPUT:

#pragma once

#include <assert.h>
#include <stddef.h>
#include <stdint.h>

#ifdef CUSTOM_D_ARRAY_TYPE
#define _d_dynamicArray CUSTOM_D_ARRAY_TYPE
#else
/// Represents a D [] array
template<typename T>
struct _d_dynamicArray
{
size_t length;
T *ptr;

_d_dynamicArray() : length(0), ptr(NULL) { }

_d_dynamicArray(size_t length_in, T *ptr_in)
: length(length_in), ptr(ptr_in) { }

T& operator[](const size_t idx) {
assert(idx < length);
return ptr[idx];
}

const T& operator[](const size_t idx) const {
assert(idx < length);
return ptr[idx];
}
};
#endif

struct Foo
{
int32_t a;
enum : int32_t { b = 2 };

// Ignored enum `test21217.Foo.c` because it is `private`.
// Ignored enum `dtoh_21217.Foo.c` because it is `private`.
protected:
enum : int32_t { d = 4 };

Expand All @@ -34,7 +61,7 @@ private:
b = 2,
};

// Ignored enum `test21217.Foo.h` because it is `private`.
// Ignored enum `dtoh_21217.Foo.h` because it is `private`.
public:
Foo() :
a(1)
Expand Down
27 changes: 27 additions & 0 deletions test/compilable/dtoh_AliasDeclaration.d
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,36 @@ TEST_OUTPUT:

#pragma once

#include <assert.h>
#include <stddef.h>
#include <stdint.h>

#ifdef CUSTOM_D_ARRAY_TYPE
#define _d_dynamicArray CUSTOM_D_ARRAY_TYPE
#else
/// Represents a D [] array
template<typename T>
struct _d_dynamicArray
{
size_t length;
T *ptr;

_d_dynamicArray() : length(0), ptr(NULL) { }

_d_dynamicArray(size_t length_in, T *ptr_in)
: length(length_in), ptr(ptr_in) { }

T& operator[](const size_t idx) {
assert(idx < length);
return ptr[idx];
}

const T& operator[](const size_t idx) const {
assert(idx < length);
return ptr[idx];
}
};
#endif

struct S;
struct S2;
Expand Down
Loading