diff gen/classes.cpp @ 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 a123dca8349b
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);
         }
     }