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