diff gen/toir.cpp @ 1434:5d0c043ff131

Remove code duplication for vtable loads and improve instruction naming to make bitcode with virtual calls easier to read.
author Frits van Bommel <fvbommel wxs.nl>
date Sat, 30 May 2009 13:04:49 +0200
parents a6dfd3cb5b99
children dd72f56ad211
line wrap: on
line diff
--- a/gen/toir.cpp	Sat May 30 12:58:04 2009 +0200
+++ b/gen/toir.cpp	Sat May 30 13:04:49 2009 +0200
@@ -1134,22 +1134,8 @@
             assert(funcval);
         }
         else {
-            assert(fdecl->vtblIndex > 0);
-            assert(e1type->ty == Tclass);
-
-            LLValue* zero = DtoConstUint(0);
-            size_t vtblidx = fdecl->vtblIndex;
-            if (Logger::enabled())
-                Logger::cout() << "vthis: " << *vthis << '\n';
-            funcval = DtoGEP(vthis, zero, zero);
-            funcval = DtoLoad(funcval);
-            Logger::println("vtblidx = %lu", vtblidx);
-            funcval = DtoGEP(funcval, zero, DtoConstUint(vtblidx), toChars());
-            funcval = DtoLoad(funcval);
-
-            funcval = DtoBitCast(funcval, getPtrToType(DtoType(fdecl->type)));
-            if (Logger::enabled())
-                Logger::cout() << "funcval casted: " << *funcval << '\n';
+            DImValue vthis3(e1type, vthis);
+            funcval = DtoVirtualFunctionPointer(&vthis3, fdecl, toChars());
         }
 
         return new DFuncValue(fdecl, funcval, vthis2);
@@ -2031,7 +2017,7 @@
 
     LLValue* castfptr;
     if (func->isVirtual() && !func->isFinal())
-        castfptr = DtoVirtualFunctionPointer(u, func);
+        castfptr = DtoVirtualFunctionPointer(u, func, toChars());
     else if (func->isAbstract())
         assert(0 && "TODO delegate to abstract method");
     else if (func->toParent()->isInterfaceDeclaration())