changeset 169:2df270e1ba59 trunk

[svn r185] Fixed broken nested classes with data members, did DMD change the class layout? tango.text.Regex now compiles. Commented some of the *very* verbose logging for -vv option.
author lindquist
date Tue, 06 May 2008 03:07:21 +0200
parents 08cfde5f70d3
children 6476da35a0fe
files gen/classes.cpp gen/structs.cpp gen/toir.cpp llvmdc.kdevelop.filelist tangotests/classes1.d
diffstat 5 files changed, 54 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/gen/classes.cpp	Tue May 06 02:26:17 2008 +0200
+++ b/gen/classes.cpp	Tue May 06 03:07:21 2008 +0200
@@ -769,12 +769,11 @@
         Logger::println("Resolving outer class");
         LOG_SCOPE;
         DValue* thisval = newexp->thisexp->toElem(gIR);
-        size_t idx = 2;
-        //idx += gIR->irDsymbol[tc->sym].irStruct->interfaces.size();
-        llvm::Value* dst = thisval->getRVal();
-        llvm::Value* src = DtoGEPi(mem,0,idx,"tmp");
+        size_t idx = 2 + gIR->irDsymbol[tc->sym->vthis].irField->index;
+        llvm::Value* src = thisval->getRVal();
+        llvm::Value* dst = DtoGEPi(mem,0,idx,"tmp");
         Logger::cout() << "dst: " << *dst << "\nsrc: " << *src << '\n';
-        DtoStore(dst, src);
+        DtoStore(src, dst);
     }
     // set the context for nested classes
     else if (tc->sym->isNested())
@@ -1110,18 +1109,19 @@
         VarDeclaration* vd = i->second.var;
         assert(vd);
         Type* vdtype = DtoDType(vd->type);
-        Logger::println("found %u type %s", vd->offset, vdtype->toChars());
+        //Logger::println("found %u type %s", vd->offset, vdtype->toChars());
         assert(gIR->irDsymbol[vd].irField->index >= 0);
         if (os == vd->offset && vdtype == t) {
+            Logger::println("found %s %s", vdtype->toChars(), vd->toChars());
             idxs.push_back(gIR->irDsymbol[vd].irField->index + dataoffset);
-            Logger::cout() << "indexing: " << *ptr << '\n';
+            //Logger::cout() << "indexing: " << *ptr << '\n';
             ptr = DtoGEP(ptr, idxs, "tmp");
             if (ptr->getType() != llt)
                 ptr = gIR->ir->CreateBitCast(ptr, llt, "tmp");
-            Logger::cout() << "indexing: " << *ptr << '\n';
+            //Logger::cout() << "indexing: " << *ptr << '\n';
             if (gIR->irDsymbol[vd].irField->indexOffset)
                 ptr = new llvm::GetElementPtrInst(ptr, DtoConstUint(gIR->irDsymbol[vd].irField->indexOffset), "tmp", gIR->scopebb());
-            Logger::cout() << "indexing: " << *ptr << '\n';
+            //Logger::cout() << "indexing: " << *ptr << '\n';
             return ptr;
         }
         else if (vdtype->ty == Tstruct && (vd->offset + vdtype->size()) > os) {
--- a/gen/structs.cpp	Tue May 06 02:26:17 2008 +0200
+++ b/gen/structs.cpp	Tue May 06 03:07:21 2008 +0200
@@ -122,7 +122,7 @@
     for (unsigned i=0; i<sd->fields.dim; ++i) {
         VarDeclaration* vd = (VarDeclaration*)sd->fields.data[i];
         Type* vdtype = DtoDType(vd->type);
-        Logger::println("found %u type %s", vd->offset, vdtype->toChars());
+        //Logger::println("found %u type %s", vd->offset, vdtype->toChars());
         assert(gIR->irDsymbol[vd].irField->index >= 0);
         if (os == vd->offset && vdtype == t) {
             idxs.push_back(gIR->irDsymbol[vd].irField->index);
--- a/gen/toir.cpp	Tue May 06 02:26:17 2008 +0200
+++ b/gen/toir.cpp	Tue May 06 03:07:21 2008 +0200
@@ -541,6 +541,8 @@
 
     p->exps.pop_back();
 
+    Logger::println("performing assignment");
+
     DImValue* im = r->isIm();
     if (!im || !im->inPlace()) {
         Logger::println("assignment not inplace");
@@ -1007,7 +1009,7 @@
 
     // this arguments
     if (dfn && dfn->vthis) {
-        Logger::cout() << "This Call func val:" << *funcval << '\n';
+        Logger::cout() << "This Call" << '\n';// func val:" << *funcval << '\n';
         if (dfn->vthis->getType() != argiter->get()) {
             //Logger::cout() << "value: " << *dfn->vthis << " totype: " << *argiter->get() << '\n';
             llargs[j] = DtoBitCast(dfn->vthis, argiter->get());
@@ -1155,7 +1157,7 @@
         }
     }
 
-    #if 1
+    #if 0
     Logger::println("%d params passed", n);
     for (int i=0; i<llargs.size(); ++i) {
         assert(llargs[i]);
@@ -1168,7 +1170,7 @@
     if (llfnty->getReturnType() != llvm::Type::VoidTy)
         varname = "tmp";
 
-    Logger::cout() << "Calling: " << *funcval << '\n';
+    //Logger::cout() << "Calling: " << *funcval << '\n';
 
     // call the function
     llvm::CallInst* call = new llvm::CallInst(funcval, llargs.begin(), llargs.end(), varname, p->scopebb());
@@ -1894,6 +1896,7 @@
     Type* ntype = DtoDType(newtype);
 
     if (ntype->ty == Tclass) {
+        Logger::println("new class");
         return DtoNewClass((TypeClass*)ntype, this);
     }
 
--- a/llvmdc.kdevelop.filelist	Tue May 06 02:26:17 2008 +0200
+++ b/llvmdc.kdevelop.filelist	Tue May 06 03:07:21 2008 +0200
@@ -750,6 +750,7 @@
 tangotests/aa1.d
 tangotests/b.d
 tangotests/c.d
+tangotests/classes1.d
 tangotests/constructors.d
 tangotests/d.d
 tangotests/e.d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tangotests/classes1.d	Tue May 06 03:07:21 2008 +0200
@@ -0,0 +1,37 @@
+module tangotests.classes1;
+
+class Outer
+{
+    int data;
+
+    class Inner
+    {
+        long data;
+
+        this(long d)
+        {
+            data = d*2;
+        }
+    }
+
+    void func()
+    {
+        auto i = new Inner(data);
+        data += (i.data/4);
+    }
+
+    this(int d)
+    {
+        data = d;
+    }
+}
+
+void main()
+{
+    scope c = new Outer(100);
+    c.func();
+    int d = c.data;
+    printf("150 = %d\n", d);
+}
+
+extern(C) int printf(char*, ...);