Fixed dmdfe generated class invariant calls. Also insert proper "this !is null" check before it. Fixed invariant* dstress regressions and generally seems like a good idea. Hope I didn't break anything.. minitests run fine!

This commit is contained in:
Tomas Lindquist Olsen
2009-05-10 00:46:09 +02:00
parent 06108db87e
commit ecc106d7b7
2 changed files with 23 additions and 4 deletions

View File

@@ -1232,6 +1232,7 @@ void FuncDeclaration::semantic3(Scope *sc)
if (addPreInvariant())
{
Expression *e = NULL;
Expression *ee = NULL;
if (isDtorDeclaration())
{
// Call invariant directly only if it exists
@@ -1256,11 +1257,30 @@ void FuncDeclaration::semantic3(Scope *sc)
{ // Call invariant virtually
ThisExp *v = new ThisExp(0);
v->type = vthis->type;
e = new AssertExp(loc, v, NULL);
// LDC: check for null this
v = new ThisExp(0);
v->type = vthis->type;
v->var = vthis;
NullExp *nv = new NullExp(0);
nv->type = v->type;
IdentityExp *ie = new IdentityExp(TOKnotidentity, 0, v, nv);
ie->type = Type::tbool;
Expression *se = new StringExp(0, (char *)"null this");
se = se->semantic(sc);
se->type = Type::tchar->arrayOf();
e = new AssertExp(loc, v, se);
ee = new AssertExp(loc, ie, se);
}
if (ee)
{
ExpStatement *s = new ExpStatement(0, ee);
a->push(s);
}
if (e)
{
ExpStatement *s = new ExpStatement(0, e);

View File

@@ -1753,9 +1753,8 @@ DValue* AssertExp::toElem(IRState* p)
LLValue* thisarg = p->func()->thisArg;
assert(thisarg && "null thisarg, but we're in assert(this) exp;");
LLValue* thisptr = DtoLoad(p->func()->thisArg);
LLValue* thisnotnull = p->ir->CreateIsNotNull(thisptr);
cond = new DImValue(Type::tbool, thisnotnull);
condty = Type::tbool;
condty = e1->type->toBasetype();
cond = new DImValue(condty, thisptr);
}
else
{