diff --git a/gen/classes.cpp b/gen/classes.cpp index 7d3575c1..17076399 100644 --- a/gen/classes.cpp +++ b/gen/classes.cpp @@ -919,19 +919,6 @@ DValue* DtoCallClassCtor(TypeClass* type, CtorDeclaration* ctor, Array* argument ////////////////////////////////////////////////////////////////////////////////////////// -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 --git a/gen/classes.h b/gen/classes.h index 2fc61a67..5dc6e5a1 100644 --- a/gen/classes.h +++ b/gen/classes.h @@ -27,7 +27,6 @@ void DtoDefineClassInfo(ClassDeclaration* cd); 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 --git a/gen/toir.cpp b/gen/toir.cpp index d449d40d..16c4928d 100644 --- a/gen/toir.cpp +++ b/gen/toir.cpp @@ -2009,9 +2009,14 @@ DValue* DeleteExp::toElem(IRState* p) 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 @@ DValue* DeleteExp::toElem(IRState* p) 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 --git a/gen/tollvm.cpp b/gen/tollvm.cpp index 9398798a..5c31f5de 100644 --- a/gen/tollvm.cpp +++ b/gen/tollvm.cpp @@ -725,6 +725,17 @@ void DtoDeleteClass(llvm::Value* inst) 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 --git a/gen/tollvm.h b/gen/tollvm.h index a4089104..86a3efd4 100644 --- a/gen/tollvm.h +++ b/gen/tollvm.h @@ -63,6 +63,7 @@ llvm::Value* DtoGEPi(llvm::Value* ptr, unsigned i0, unsigned i1, const std::stri 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