mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-04-29 22:50:53 +03:00
Fix #125 – Nested class context pointer invalid (D1).
Patch originally by Alexey Prokhin, thanks.
This commit is contained in:
parent
67f12fe8b5
commit
cef19fb225
2 changed files with 23 additions and 11 deletions
|
@ -134,11 +134,22 @@ DValue* DtoNestedVariable(Loc loc, Type* astype, VarDeclaration* vd, bool byref)
|
|||
LLValue* val = irfunc->thisArg;
|
||||
if (cd->isClassDeclaration())
|
||||
val = DtoLoad(val);
|
||||
ctx = DtoLoad(DtoGEPi(val, 0, cd->vthis->ir.irField->index, ".vthis"));
|
||||
#else
|
||||
ClassDeclaration* cd = irfunc->decl->isMember2()->isClassDeclaration();
|
||||
LLValue* val = DtoLoad(irfunc->thisArg);
|
||||
ctx = DtoGEPi(val, 0, cd->vthis->ir.irField->index, ".vthis");
|
||||
|
||||
if (!irfunc->frameType && vd->isThisDeclaration())
|
||||
{
|
||||
// If the only "nested" variable is the outer this pointer, we don't
|
||||
// emit a normal context, but just store the this pointer - see
|
||||
// GitHub #127.
|
||||
return new DVarValue(astype, vd, ctx);
|
||||
}
|
||||
|
||||
ctx = DtoLoad(ctx);
|
||||
#endif
|
||||
ctx = DtoLoad(DtoGEPi(val, 0,cd->vthis->ir.irField->index, ".vthis"));
|
||||
}
|
||||
else if (irfunc->nestedVar) {
|
||||
ctx = irfunc->nestedVar;
|
||||
|
@ -311,12 +322,14 @@ LLValue* DtoNestedContext(Loc loc, Dsymbol* sym)
|
|||
#if DMDV2
|
||||
AggregateDeclaration* ad = irfunc->decl->isMember2();
|
||||
val = ad->isClassDeclaration() ? DtoLoad(irfunc->thisArg) : irfunc->thisArg;
|
||||
if (!ad || !ad->vthis)
|
||||
return llvm::UndefValue::get(getVoidPtrType());
|
||||
#else
|
||||
ClassDeclaration* ad = irfunc->decl->isMember2()->isClassDeclaration();
|
||||
val = DtoLoad(irfunc->thisArg);
|
||||
#endif
|
||||
if (!ad || !ad->vthis)
|
||||
return llvm::UndefValue::get(getVoidPtrType());
|
||||
return val;
|
||||
#endif
|
||||
val = DtoLoad(DtoGEPi(val, 0,ad->vthis->ir.irField->index, ".vthis"));
|
||||
}
|
||||
else
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue