# HG changeset patch # User Tomas Lindquist Olsen # Date 1241909169 -7200 # Node ID a41a40deff734369029d61a64c260a49e5d41008 # Parent 5a9dc345c70ad1ce87fd0001c500707fac9ae66e 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! diff -r 5a9dc345c70a -r a41a40deff73 dmd/func.c --- a/dmd/func.c Sat May 09 20:13:05 2009 +0200 +++ b/dmd/func.c Sun May 10 00:46:09 2009 +0200 @@ -1232,6 +1232,7 @@ if (addPreInvariant()) { Expression *e = NULL; + Expression *ee = NULL; if (isDtorDeclaration()) { // Call invariant directly only if it exists @@ -1256,11 +1257,30 @@ { // 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); diff -r 5a9dc345c70a -r a41a40deff73 gen/toir.cpp --- a/gen/toir.cpp Sat May 09 20:13:05 2009 +0200 +++ b/gen/toir.cpp Sun May 10 00:46:09 2009 +0200 @@ -1753,9 +1753,8 @@ 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 {