# HG changeset patch # User lindquist # Date 1210723223 -7200 # Node ID 1d6cfdbc97f00ed965dd190af9778af3af109c59 # Parent c4c9b4ac021b0b7896097e0e31097913f17c734e [svn r226] Fixed: deleting interface. Removed: unused util function for calling class destructors. diff -r c4c9b4ac021b -r 1d6cfdbc97f0 gen/classes.cpp --- 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; idim; 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 diff -r c4c9b4ac021b -r 1d6cfdbc97f0 gen/classes.h --- 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); diff -r c4c9b4ac021b -r 1d6cfdbc97f0 gen/toir.cpp --- 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); } diff -r c4c9b4ac021b -r 1d6cfdbc97f0 gen/tollvm.cpp --- 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 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 diff -r c4c9b4ac021b -r 1d6cfdbc97f0 gen/tollvm.h --- 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