Fixed calling of _d_delmemory() and _d_delinterface()

This commit is contained in:
Alexey Prokhin 2010-12-17 12:55:28 +03:00
parent 349a6c1c3f
commit 7e6807b0df
2 changed files with 16 additions and 2 deletions

View file

@ -457,9 +457,14 @@ static void LLVM_D_BuildRuntimeModule()
llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M);
}
// D1:
// void _d_delmemory(void* p)
// void _d_delinterface(void* p)
// void _d_callfinalizer(void* p)
// D2:
// void _d_delmemory(void **p)
// void _d_delinterface(void **p)
// void _d_callfinalizer(void *p)
{
llvm::StringRef fname("_d_delmemory");
llvm::StringRef fname2("_d_delinterface");

View file

@ -1750,10 +1750,14 @@ DValue* DeleteExp::toElem(IRState* p)
// simple pointer
if (et->ty == Tpointer)
{
#if DMDV2
DtoDeleteMemory(dval->isLVal() ? dval->getLVal() : makeLValue(loc, dval));
#else
LLValue* rval = dval->getRVal();
DtoDeleteMemory(rval);
if (dval->isVar())
DtoStore(LLConstant::getNullValue(rval->getType()), dval->getLVal());
#endif
}
// class
else if (et->ty == Tclass)
@ -1762,7 +1766,12 @@ DValue* DeleteExp::toElem(IRState* p)
TypeClass* tc = (TypeClass*)et;
if (tc->sym->isInterfaceDeclaration())
{
DtoDeleteInterface(dval->getRVal());
#if DMDV2
LLValue *val = dval->getLVal();
#else
LLValue *val = dval->getRVal();
#endif
DtoDeleteInterface(val);
onstack = true;
}
else if (DVarValue* vv = dval->isVar()) {