mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-08 03:46:02 +03:00
Fixed calling of _d_delmemory() and _d_delinterface()
This commit is contained in:
parent
349a6c1c3f
commit
7e6807b0df
2 changed files with 16 additions and 2 deletions
|
@ -457,9 +457,14 @@ static void LLVM_D_BuildRuntimeModule()
|
||||||
llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M);
|
llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// D1:
|
||||||
// void _d_delmemory(void* p)
|
// void _d_delmemory(void* p)
|
||||||
// void _d_delinterface(void* p)
|
// void _d_delinterface(void* p)
|
||||||
// void _d_callfinalizer(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 fname("_d_delmemory");
|
||||||
llvm::StringRef fname2("_d_delinterface");
|
llvm::StringRef fname2("_d_delinterface");
|
||||||
|
|
11
gen/toir.cpp
11
gen/toir.cpp
|
@ -1750,10 +1750,14 @@ DValue* DeleteExp::toElem(IRState* p)
|
||||||
// simple pointer
|
// simple pointer
|
||||||
if (et->ty == Tpointer)
|
if (et->ty == Tpointer)
|
||||||
{
|
{
|
||||||
|
#if DMDV2
|
||||||
|
DtoDeleteMemory(dval->isLVal() ? dval->getLVal() : makeLValue(loc, dval));
|
||||||
|
#else
|
||||||
LLValue* rval = dval->getRVal();
|
LLValue* rval = dval->getRVal();
|
||||||
DtoDeleteMemory(rval);
|
DtoDeleteMemory(rval);
|
||||||
if (dval->isVar())
|
if (dval->isVar())
|
||||||
DtoStore(LLConstant::getNullValue(rval->getType()), dval->getLVal());
|
DtoStore(LLConstant::getNullValue(rval->getType()), dval->getLVal());
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
// class
|
// class
|
||||||
else if (et->ty == Tclass)
|
else if (et->ty == Tclass)
|
||||||
|
@ -1762,7 +1766,12 @@ DValue* DeleteExp::toElem(IRState* p)
|
||||||
TypeClass* tc = (TypeClass*)et;
|
TypeClass* tc = (TypeClass*)et;
|
||||||
if (tc->sym->isInterfaceDeclaration())
|
if (tc->sym->isInterfaceDeclaration())
|
||||||
{
|
{
|
||||||
DtoDeleteInterface(dval->getRVal());
|
#if DMDV2
|
||||||
|
LLValue *val = dval->getLVal();
|
||||||
|
#else
|
||||||
|
LLValue *val = dval->getRVal();
|
||||||
|
#endif
|
||||||
|
DtoDeleteInterface(val);
|
||||||
onstack = true;
|
onstack = true;
|
||||||
}
|
}
|
||||||
else if (DVarValue* vv = dval->isVar()) {
|
else if (DVarValue* vv = dval->isVar()) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue