changeset 138:aeddd4d533b3 trunk

[svn r142] minor fix to dynamic casts. added a few missed files.
author lindquist
date Fri, 18 Jan 2008 20:13:19 +0100
parents ce7b81fb957f
children 0ab29b838084
files gen/classes.cpp llvmdc-tango tango/tango/io/Buffer.d tangotests/s.d tangotests/t.d
diffstat 5 files changed, 205 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/gen/classes.cpp	Fri Jan 18 16:42:16 2008 +0100
+++ b/gen/classes.cpp	Fri Jan 18 20:13:19 2008 +0100
@@ -878,6 +878,9 @@
 
 DValue* DtoCastClass(DValue* val, Type* _to)
 {
+    Logger::println("DtoCastClass(%s, %s)", val->getType()->toChars(), _to->toChars());
+    LOG_SCOPE;
+
     Type* to = DtoDType(_to);
     if (to->ty == Tpointer) {
         const llvm::Type* tolltype = DtoType(_to);
@@ -892,24 +895,31 @@
     TypeClass* fc = (TypeClass*)from;
 
     if (tc->sym->isInterfaceDeclaration()) {
+        Logger::println("to interface");
         if (fc->sym->isInterfaceDeclaration()) {
+            Logger::println("from interface");
             return DtoDynamicCastInterface(val, _to);
         }
         else {
+            Logger::println("from object");
             return DtoDynamicCastObject(val, _to);
         }
     }
     else {
+        Logger::println("to object");
         int poffset;
         if (fc->sym->isInterfaceDeclaration()) {
+            Logger::println("interface cast");
             return DtoCastInterfaceToObject(val, _to);
         }
-        else if (tc->sym->isBaseOf(fc->sym,NULL)) {
+        else if (!tc->sym->isInterfaceDeclaration() && tc->sym->isBaseOf(fc->sym,NULL)) {
+            Logger::println("static down cast)");
             const llvm::Type* tolltype = DtoType(_to);
             llvm::Value* rval = DtoBitCast(val->getRVal(), tolltype);
             return new DImValue(_to, rval);
         }
         else {
+            Logger::println("dynamic up cast");
             return DtoDynamicCastObject(val, _to);
         }
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/llvmdc-tango	Fri Jan 18 20:13:19 2008 +0100
@@ -0,0 +1,70 @@
+profile=tango
+
+compiler=llvmdc
+inifile=llvmdc.conf
+
+exeext=
+objext=bc
+
+
+version=LLVMDC
+noversion=DigitalMars
+noversion=GNU
+testversion=linux
+testversion=Unix
+testversion=Posix
+testversion=Windows
+testversion=Win32
+testversion=Win64
+testversion=X86
+testversion=PPC
+testversion=X86_64
+testversion=PPC64
+testversion=D_InlineAsm
+testvestion=D_InlineAsm_X86
+testversion=D_InlineAsm_PPC
+testversion=D_InlineAsm_X86_64
+testversion=D_InlineAsm_PPC64
+testversion=LittleEndian
+testversion=BigEndian
+testversion=LLVM64
+
+
+[compile]
+cmd=llvmdc -version=Tango -c $i
+
+flag=$i
+incdir=-I$i
+libdir=-L-L=$i
+optimize=-O3
+version=-version=$i
+
+
+[link]
+oneatatime=yes
+cmd=llvmdc $i -of$o
+
+libdir=-L-L=$i
+lib=-L-l=$i
+flag=-L$i
+
+
+[liblink]
+safe=yes
+oneatatime=yes
+cmd=llvm-ar rsc $o $i
+
+libdir=-L=$i
+lib=-l=$i
+flag=$i
+
+
+[postliblink]
+#cmd=ranlib $i
+
+
+[shliblink]
+shlibs=no
+
+[dyliblink]
+dylibs=no
--- a/tango/tango/io/Buffer.d	Fri Jan 18 16:42:16 2008 +0100
+++ b/tango/tango/io/Buffer.d	Fri Jan 18 20:13:19 2008 +0100
@@ -550,7 +550,8 @@
         ***********************************************************************/
 
         IBuffer append (void* src, uint length)
-        {               
+        {
+                printf("Buffer.append(%p, %u)\n", src, length);
                 if (length > writable)
                     // can we write externally?
                     if (sink)
@@ -570,8 +571,9 @@
                        }
                     else
                        error (overflow);
-
+                printf("  copying\n");
                 copy (src, length);
+                printf("returning\n");
                 return this;
         }
 
@@ -1095,6 +1097,7 @@
 
         protected void copy (void *src, uint size)
         {
+                printf("Buffer.copy(%p, %u)\n", src, size);
                 // avoid "out of bounds" test on zero size
                 if (size)
                    {
@@ -1102,6 +1105,7 @@
                    memcpy (&data[extent], src, size);
                    extent += size;
                    }
+                printf("  copy done\n");
         }
 
         /***********************************************************************
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tangotests/s.d	Fri Jan 18 20:13:19 2008 +0100
@@ -0,0 +1,85 @@
+module s;
+
+interface Inter
+{
+    void inter();
+}
+
+interface Inter2
+{
+    void inter2();
+}
+
+interface InterOne : Inter
+{
+    void interOne();
+}
+
+abstract class ClassAbstract : InterOne
+{
+    abstract void inter();
+    abstract void interOne();
+}
+
+class TheClassOne : ClassAbstract
+{
+    void inter()
+    {
+    }
+    void interOne()
+    {
+    }
+}
+
+class TheClassTwo : TheClassOne, Inter2
+{
+    long l;
+    double d;
+
+    void inter2()
+    {
+    }
+}
+
+extern(C) int printf(char*, ...);
+
+void main()
+{
+    printf("classinfo test\n");
+    {
+        auto c = new TheClassOne;
+        {
+            auto ci = c.classinfo;
+            printf("ci = %.*s\n", ci.name.length, ci.name.ptr);
+            printf("ci.interfaces.length = %lu\n", ci.interfaces.length);
+            printf("i[0] = %.*s\n", ci.interfaces[0].classinfo.name.length, ci.interfaces[0].classinfo.name.ptr);
+            printf("i[1] = %.*s\n", ci.interfaces[1].classinfo.name.length, ci.interfaces[1].classinfo.name.ptr);
+        }
+    }
+    {
+        auto c = new TheClassTwo;
+        {
+            auto ci = c.classinfo;
+            printf("ci = %.*s\n", ci.name.length, ci.name.ptr);
+            printf("ci.interfaces.length = %lu\n", ci.interfaces.length);
+            printf("i[0] = %.*s\n", ci.interfaces[0].classinfo.name.length, ci.interfaces[0].classinfo.name.ptr);
+            printf("i[1] = %.*s\n", ci.interfaces[1].classinfo.name.length, ci.interfaces[1].classinfo.name.ptr);
+            printf("i[2] = %.*s\n", ci.interfaces[2].classinfo.name.length, ci.interfaces[2].classinfo.name.ptr);
+        }
+        auto i = cast(InterOne)c;
+        {
+            auto ci = i.classinfo;
+            printf("ci = %.*s\n", ci.name.length, ci.name.ptr);
+        }
+        auto i2 = cast(Inter2)i;
+        {
+            auto ci = i2.classinfo;
+            printf("ci = %.*s\n", ci.name.length, ci.name.ptr);
+        }
+        auto o = cast(Object)i2;
+        {
+            auto ci = o.classinfo;
+            printf("ci = %.*s\n", ci.name.length, ci.name.ptr);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tangotests/t.d	Fri Jan 18 20:13:19 2008 +0100
@@ -0,0 +1,33 @@
+interface MyInterface
+{
+    void func();
+}
+
+abstract class MyBaseClass : MyInterface
+{
+    abstract void func();
+}
+
+class MyClass : MyBaseClass
+{
+    void func()
+    {
+    }
+
+    MyBaseClass toBase()
+    {
+        return this;
+    }
+}
+
+void main()
+{
+    printf("STARTING\n");
+    auto c = new MyClass;
+    printf("c = %p\n", c);
+    auto b = c.toBase;
+    printf("b = %p\n", b);
+    printf("FINISHED\n");
+}
+
+extern(C) int printf(char*, ...);