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