Update of /cvsroot/monetdb/pathfinder/compiler/core
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv11473/core

Modified Files:
      Tag: XQuery_0-22
        coreopt.brg 
Log Message:
-- Bugfix: Avoid expanding variables into a different nesting level.

   (The change of the base level was not visible in the return part of a 
for-loop.)


Index: coreopt.brg
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/core/coreopt.brg,v
retrieving revision 1.57.2.1
retrieving revision 1.57.2.2
diff -u -d -r1.57.2.1 -r1.57.2.2
--- coreopt.brg 8 Feb 2008 13:46:37 -0000       1.57.2.1
+++ coreopt.brg 21 Feb 2008 16:23:28 -0000      1.57.2.2
@@ -539,6 +539,7 @@
                  */
                 *p = *R(p);
 
+
                 rewritten = true;
                 break;
 
@@ -1466,7 +1467,7 @@
    store the number of references in the same nesting depth. If the
    variables are referenced in a nested scope their counter is set to
    -1 to indicate that the may not be rewritten. */
-static void
+static char
 collect_var_usage (PFcnode_t *c, char base, PFcnode_t *parent, int child)
 {
     switch (c->kind) {
@@ -1497,8 +1498,8 @@
         case c_flwr:
         {
             char old_base = base;
-            collect_var_usage (L(c), base, c, 0);
-            collect_var_usage (R(c), base, c, 1);
+            base = collect_var_usage (L(c), base, c, 0);
+            base = collect_var_usage (R(c), base, c, 1);
             /* reset all new scopes introduced by a for loop */
             base = old_base;
         } break;
@@ -1506,7 +1507,7 @@
         case c_let:
             assert (L(c)->kind == c_letbind);
             
-            collect_var_usage (LR(c), base, L(c), 1);
+            base = collect_var_usage (LR(c), base, L(c), 1);
             
             /* add variable to the environment */
             *((bind_t *) PFarray_add (unused_var_env))
@@ -1518,7 +1519,7 @@
             /* record the current scope */
             LL(c)->sem.var->base = base;
 
-            collect_var_usage (R(c), base, c, 1);
+            base = collect_var_usage (R(c), base, c, 1);
             break;
             
         case c_for:
@@ -1526,7 +1527,7 @@
                     LL(c)->kind == c_forvars &&
                     LLL(c)->kind == c_var);
             
-            collect_var_usage (LR(c), base, L(c), 1);
+            base = collect_var_usage (LR(c), base, L(c), 1);
             
             /* a for loop increases the nesting depth */
             base++;
@@ -1543,30 +1544,43 @@
                 LLR(c)->sem.var->base = base;
             }
             
-            collect_var_usage (R(c), base, c, 1);
+            base = collect_var_usage (R(c), base, c, 1);
             break;
             
         case c_main:
             /* first collect global variables before
                analyzing user-defined functions */
-            collect_var_usage (R(c), base, c, 1);
-            collect_var_usage (L(c), base, c, 0);
+            base = collect_var_usage (R(c), base, c, 1);
+            base = collect_var_usage (L(c), base, c, 0);
             break;
             
         case c_recursion:
             /* ignore recursion variable */
-            collect_var_usage (R(c), base, c, 1);
+            base = collect_var_usage (R(c), base, c, 1);
             break;
+
+        case c_seed:
+        {
+            char old_base = base;
+            base = collect_var_usage (L(c), base, c, 0);
+            base++;
+            /* avoid that let bindings are expanded
+               into the recursion body */
+            base = collect_var_usage (R(c), base, c, 1);
+            /* reset all new scopes introduced by a for loop */
+            base = old_base;
+        }   break;
             
         case c_param: 
             /* ignore used-defined function variables */
-            collect_var_usage (L(c), base, c, 0);
+            base = collect_var_usage (L(c), base, c, 0);
             break;
             
         default:
             for (unsigned int i = 0; i < PFCNODE_MAXCHILD && c->child[i]; i++)
-                collect_var_usage (c->child[i], base, c, i);
+                base = collect_var_usage (c->child[i], base, c, i);
     }
+    return base;
 }
 
 /**
@@ -1616,7 +1630,7 @@
         collect_var_usage (r, 0, NULL, -1);
 
         /* remove all unused variables and expand variables 
-           that are referenced only once in the same nesting depth*/
+           that are referenced only once in the same nesting depth */
         for (unsigned int i = PFarray_last (unused_var_env); i > 0; i--) {
             var = ((bind_t *) PFarray_at (unused_var_env, i-1))->var;
             p = ((bind_t *) PFarray_at (unused_var_env, i-1))->atom;


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Monetdb-pf-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-pf-checkins

Reply via email to