Mercurial > projects > ldc
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); } }