changeset 321:571959608194 trunk

[svn r342] Fix DMD bug 2206. Implement mixin declarations in LLVMDC.
author ChristianK
date Wed, 09 Jul 2008 17:01:08 +0200
parents d772927ca496
children 1aaf6ff7f685
files dmd/mangle.c dmd/template.h gen/toir.cpp
diffstat 3 files changed, 36 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/dmd/mangle.c	Sat Jul 05 13:05:29 2008 +0200
+++ b/dmd/mangle.c	Wed Jul 09 17:01:08 2008 +0200
@@ -221,6 +221,31 @@
 }
 
 
+char *TemplateMixin::mangle()
+{
+    OutBuffer buf;
+    char *id;
+
+#if 0
+    printf("TemplateMixin::mangle() %s", toChars());
+    if (parent)
+        printf("  parent = %s %s", parent->kind(), parent->toChars());
+    printf("\n");
+#endif
+    id = ident ? ident->toChars() : toChars();
+    if (parent)
+    {
+	char *p = parent->mangle();
+	if (p[0] == '_' && p[1] == 'D')
+	    p += 2;
+	buf.writestring(p);
+    }
+    buf.printf("%"PRIuSIZE"%s", strlen(id), id);
+    id = buf.toChars();
+    buf.data = NULL;
+    //printf("TemplateMixin::mangle() %s = %s\n", toChars(), id);
+    return id;
+}
 
 char *Dsymbol::mangle()
 {
--- a/dmd/template.h	Sat Jul 05 13:05:29 2008 +0200
+++ b/dmd/template.h	Wed Jul 09 17:01:08 2008 +0200
@@ -309,6 +309,7 @@
     int oneMember(Dsymbol **ps);
     int hasPointers();
     char *toChars();
+    char *mangle();
     void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
 
     void toObjFile();			// compile to .obj file
--- a/gen/toir.cpp	Sat Jul 05 13:05:29 2008 +0200
+++ b/gen/toir.cpp	Wed Jul 09 17:01:08 2008 +0200
@@ -18,6 +18,7 @@
 #include "total.h"
 #include "init.h"
 #include "mtype.h"
+#include "template.h"
 #include "hdrgen.h"
 #include "port.h"
 
@@ -140,6 +141,15 @@
             DtoForceDeclareDsymbol((Dsymbol*)a->decl->data[i]);
         }
     }
+    // mixin declaration
+    else if (TemplateMixin* m = declaration->isTemplateMixin())
+    {
+        Logger::println("TemplateMixin");
+        for (int i=0; i < m->members->dim; ++i)
+        {
+            DtoForceDeclareDsymbol((Dsymbol*)m->members->data[i]);
+        }
+    }
     // unsupported declaration
     else
     {