Markos Zaharioudakis has proposed merging lp:~zorba-coders/zorba/markos-scratch 
into lp:zorba.

Requested reviews:
  Markos Zaharioudakis (markos-za)

For more details, see:
https://code.launchpad.net/~zorba-coders/zorba/markos-scratch/+merge/88588

fixed bug in detecting mutually recursive functions
-- 
https://code.launchpad.net/~zorba-coders/zorba/markos-scratch/+merge/88588
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'src/compiler/rewriter/tools/udf_graph.cpp'
--- src/compiler/rewriter/tools/udf_graph.cpp	2011-10-03 09:18:49 +0000
+++ src/compiler/rewriter/tools/udf_graph.cpp	2012-01-14 22:06:25 +0000
@@ -114,7 +114,9 @@
 
     if (udf != NULL)
     {
-      if (std::find(callChain.begin(), callChain.end(), udf) == callChain.end())
+      std::vector<user_function*>::const_iterator cycle;
+
+      if ((cycle = std::find(callChain.begin(), callChain.end(), udf)) == callChain.end())
       {
         bool found = theNodes.exists(udf);
 
@@ -134,11 +136,11 @@
       else
       {
         // A recursive function call.
-        std::vector<user_function*>::const_iterator ite = callChain.begin();
+        std::vector<user_function*>::const_iterator ite = cycle;
         std::vector<user_function*>::const_iterator end = callChain.end();
-        for (++ite; ite != end; ++ite)
+        for (; ite != end; ++ite)
         {
-          (*ite)->addMutuallyRecursiveUDFs(callChain);
+          (*ite)->addMutuallyRecursiveUDFs(callChain, cycle);
         }
       }
     }

=== modified file 'src/functions/udf.cpp'
--- src/functions/udf.cpp	2012-01-11 17:30:25 +0000
+++ src/functions/udf.cpp	2012-01-14 22:06:25 +0000
@@ -240,10 +240,12 @@
 /*******************************************************************************
 
 ********************************************************************************/
-void user_function::addMutuallyRecursiveUDFs(const std::vector<user_function*>& udfs)
+void user_function::addMutuallyRecursiveUDFs(
+    const std::vector<user_function*>& udfs,
+    const std::vector<user_function*>::const_iterator& cycle)
 {
   theMutuallyRecursiveUDFs.insert(theMutuallyRecursiveUDFs.end(),
-                                  udfs.begin() + 1,
+                                  cycle,
                                   udfs.end());
 }
 

=== modified file 'src/functions/udf.h'
--- src/functions/udf.h	2012-01-11 17:30:25 +0000
+++ src/functions/udf.h	2012-01-14 22:06:25 +0000
@@ -173,7 +173,9 @@
 
   bool isOptimized() const { return theIsOptimized; }
 
-  void addMutuallyRecursiveUDFs(const std::vector<user_function*>& udfs);
+  void addMutuallyRecursiveUDFs(
+      const std::vector<user_function*>& udfs,
+      const std::vector<user_function*>::const_iterator& cycle);
 
   bool isMutuallyRecursiveWith(const user_function* udf);
 

-- 
Mailing list: https://launchpad.net/~zorba-coders
Post to     : zorba-coders@lists.launchpad.net
Unsubscribe : https://launchpad.net/~zorba-coders
More help   : https://help.launchpad.net/ListHelp

Reply via email to