changeset 210:1d6cfdbc97f0 trunk

[svn r226] Fixed: deleting interface. Removed: unused util function for calling class destructors.
author lindquist
date Wed, 14 May 2008 02:00:23 +0200
parents c4c9b4ac021b
children f66219e0d530
files gen/classes.cpp gen/classes.h gen/toir.cpp gen/tollvm.cpp gen/tollvm.h
diffstat 5 files changed, 20 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/gen/classes.cpp	Wed May 14 01:22:40 2008 +0200
+++ b/gen/classes.cpp	Wed May 14 02:00:23 2008 +0200
@@ -919,19 +919,6 @@
 
 //////////////////////////////////////////////////////////////////////////////////////////
 
-void DtoCallClassDtors(TypeClass* tc, llvm::Value* instance)
-{
-    Array* arr = &tc->sym->dtors;
-    for (size_t i=0; i<arr->dim; i++)
-    {
-        FuncDeclaration* fd = (FuncDeclaration*)arr->data[i];
-        assert(fd->ir.irFunc->func);
-        llvm::CallInst::Create(fd->ir.irFunc->func, instance, "", gIR->scopebb());
-    }
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////
-
 void DtoFinalizeClass(llvm::Value* inst)
 {
     // get runtime function
--- a/gen/classes.h	Wed May 14 01:22:40 2008 +0200
+++ b/gen/classes.h	Wed May 14 02:00:23 2008 +0200
@@ -27,7 +27,6 @@
 DValue* DtoNewClass(TypeClass* type, NewExp* newexp);
 void DtoInitClass(TypeClass* tc, llvm::Value* dst);
 DValue* DtoCallClassCtor(TypeClass* type, CtorDeclaration* ctor, Array* arguments, llvm::Value* mem);
-void DtoCallClassDtors(TypeClass* tc, llvm::Value* instance);
 void DtoFinalizeClass(llvm::Value* inst);
 
 DValue* DtoCastClass(DValue* val, Type* to);
--- a/gen/toir.cpp	Wed May 14 01:22:40 2008 +0200
+++ b/gen/toir.cpp	Wed May 14 02:00:23 2008 +0200
@@ -2009,9 +2009,14 @@
     else if (et->ty == Tclass)
     {
         bool onstack = false;
-        if (DVarValue* vv = dval->isVar()) {
+        TypeClass* tc = (TypeClass*)et;
+        if (tc->sym->isInterfaceDeclaration())
+        {
+            DtoDeleteInterface(dval->getRVal());
+            onstack = true;
+        }
+        else if (DVarValue* vv = dval->isVar()) {
             if (vv->var && vv->var->onstack) {
-                TypeClass* tc = (TypeClass*)et;
                 if (tc->sym->dtors.dim > 0) {
                     DtoFinalizeClass(dval->getRVal());
                     onstack = true;
@@ -2022,7 +2027,7 @@
             llvm::Value* rval = dval->getRVal();
             DtoDeleteClass(rval);
         }
-        if (dval->isVar() && dval->isVar()->lval) {
+        if (!dval->isThis() && dval->isVar() && dval->isVar()->lval) {
             llvm::Value* lval = dval->getLVal();
             DtoStore(llvm::Constant::getNullValue(lval->getType()->getContainedType(0)), lval);
         }
--- a/gen/tollvm.cpp	Wed May 14 01:22:40 2008 +0200
+++ b/gen/tollvm.cpp	Wed May 14 02:00:23 2008 +0200
@@ -725,6 +725,17 @@
     llvm::CallInst::Create(fn, arg.begin(), arg.end(), "", gIR->scopebb());
 }
 
+void DtoDeleteInterface(llvm::Value* inst)
+{
+    // get runtime function
+    llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_delinterface");
+    // build args
+    llvm::SmallVector<llvm::Value*,1> arg;
+    arg.push_back(DtoBitCast(inst, fn->getFunctionType()->getParamType(0), ".tmp"));
+    // call
+    llvm::CallInst::Create(fn, arg.begin(), arg.end(), "", gIR->scopebb());
+}
+
 void DtoDeleteArray(DValue* arr)
 {
     // get runtime function
--- a/gen/tollvm.h	Wed May 14 01:22:40 2008 +0200
+++ b/gen/tollvm.h	Wed May 14 02:00:23 2008 +0200
@@ -63,6 +63,7 @@
 llvm::Value* DtoNew(Type* newtype);
 void DtoDeleteMemory(llvm::Value* ptr);
 void DtoDeleteClass(llvm::Value* inst);
+void DtoDeleteInterface(llvm::Value* inst);
 void DtoDeleteArray(DValue* arr);
 
 // assertion generator