# HG changeset patch # User lindquist # Date 1213328848 -7200 # Node ID 2e652b8ad1fd0ec3a47e5cb1f443de4ddc251176 # Parent 8dbddae0915259c600b485df57d22577ef362696 [svn r277] Fixed a nasty bug in delegate expressions. Context pointers to nested functions of the parent, from inside a nested function were invalid. diff -r 8dbddae09152 -r 2e652b8ad1fd gen/toir.cpp --- a/gen/toir.cpp Thu Jun 12 19:59:19 2008 +0200 +++ b/gen/toir.cpp Fri Jun 13 05:47:28 2008 +0200 @@ -2230,13 +2230,12 @@ DValue* u = e1->toElem(p); LLValue* uval; if (DFuncValue* f = u->isFunc()) { - //assert(f->vthis); - //uval = f->vthis; - LLValue* nestvar = p->func()->decl->ir.irFunc->nestedVar; - if (nestvar) - uval = nestvar; + assert(f->func); + LLValue* contextptr = DtoNestedContext(f->func->toParent2()->isFuncDeclaration()); + if (!contextptr) + uval = LLConstant::getNullValue(getVoidPtrType()); else - uval = llvm::ConstantPointerNull::get(int8ptrty); + uval = DtoBitCast(contextptr, getVoidPtrType()); } else { DValue* src = u; diff -r 8dbddae09152 -r 2e652b8ad1fd tangotests/nested1.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tangotests/nested1.d Fri Jun 13 05:47:28 2008 +0200 @@ -0,0 +1,12 @@ +module tangotests.nested1; + +void main() +{ + int i = 42; + assert(i == 42); + void func() + { + assert(i == 42); + } + func(); +} diff -r 8dbddae09152 -r 2e652b8ad1fd tangotests/nested2.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tangotests/nested2.d Fri Jun 13 05:47:28 2008 +0200 @@ -0,0 +1,32 @@ +module tangotests.nested2; + +extern(C) int printf(char*, ...); + +void main() +{ + int var = 2; + + void exec(void delegate() dg) + { + printf("var = %d\n", var); + dg(); + } + + void foo() + { + printf("var = %d\n", var); + assert(var == 5); + } + + void bar() + { + printf("var = %d\n", var); + var += 3; + exec(&foo); + } + + printf("var = %d\n", var); + exec(&bar); + + return 0; +} \ No newline at end of file