Mercurial > projects > ldc
diff gen/functions.cpp @ 1464:93644700a0b3
Some minor changes to handling of variables referenced from nested functions in D2 .
Added generation of new 'void*[4] reserved;' !ModuleInfo member .
author | Tomas Lindquist Olsen <tomas.l.olsen gmail com> |
---|---|
date | Wed, 03 Jun 2009 03:04:47 +0200 |
parents | 9a049fd1a014 |
children | b243e28f63d4 |
line wrap: on
line diff
--- a/gen/functions.cpp Wed Jun 03 02:28:48 2009 +0200 +++ b/gen/functions.cpp Wed Jun 03 03:04:47 2009 +0200 @@ -665,7 +665,7 @@ LLValue* thismem = DtoRawAlloca(thisvar->getType(), 0, "this"); // FIXME: align? DtoStore(thisvar, thismem); irfunction->thisArg = thismem; - + assert(!fd->vthis->ir.irLocal); fd->vthis->ir.irLocal = new IrLocal(fd->vthis); fd->vthis->ir.irLocal->value = thismem; @@ -673,14 +673,12 @@ if (global.params.symdebug) DtoDwarfLocalVariable(thismem, fd->vthis); - #if DMDV2 - if (fd->vthis->nestedrefs.dim) - #else + #if DMDV1 if (fd->vthis->nestedref) - #endif { fd->nestedVars.insert(fd->vthis); } + #endif } // give arguments storage @@ -698,14 +696,12 @@ IrLocal* irloc = vd->ir.irLocal; assert(irloc); - #if DMDV2 - if (vd->nestedrefs.dim) - #else + #if DMDV1 if (vd->nestedref) - #endif { fd->nestedVars.insert(vd); } + #endif bool refout = vd->storage_class & (STCref | STCout); bool lazy = vd->storage_class & STClazy; @@ -734,19 +730,27 @@ } // need result variable? (nested) -#if DMDV2 - if (fd->vresult && fd->vresult->nestedrefs.dim) { -#else +#if DMDV1 if (fd->vresult && fd->vresult->nestedref) { -#endif Logger::println("nested vresult value: %s", fd->vresult->toChars()); fd->nestedVars.insert(fd->vresult); } +#endif + +#if DMDV2 + // fill nestedVars + size_t nnest = fd->closureVars.dim; + for (size_t i = 0; i < nnest; ++i) + { + VarDeclaration* vd = (VarDeclaration*)fd->closureVars.data[i]; + fd->nestedVars.insert(vd); + } +#endif DtoCreateNestedContext(fd); #if DMDV2 - if (fd->vresult && fd->vresult->nestedrefs.dim) + if (fd->vresult && fd->vresult->nestedrefs.dim) // FIXME: not sure here :/ #else if (fd->vresult && fd->vresult->nestedref) #endif