From 41e3cdff4efd323925f0ca92f6731ec207254517 Mon Sep 17 00:00:00 2001
From: Mirco Dotta <mirco.dotta@gmail.com>
Date: Mon, 6 Jul 2009 14:24:38 +0000
Subject: [PATCH] Generators are now created lazily to avoid filling the stack
 because of recrursive calls in the injected Generator methods

---
 src/funcheck/scalacheck/ForAllTransformer.scala | 2 +-
 src/funcheck/scalacheck/ScalaCheck.scala        | 8 ++++++--
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/funcheck/scalacheck/ForAllTransformer.scala b/src/funcheck/scalacheck/ForAllTransformer.scala
index 356f74303..4731bea36 100644
--- a/src/funcheck/scalacheck/ForAllTransformer.scala
+++ b/src/funcheck/scalacheck/ForAllTransformer.scala
@@ -35,7 +35,7 @@ trait ForAllTransformer extends TypingTransformers
               case tpe @ TypeRef(_,_,ptpes) =>
                 vtpt.tpe match {
                   case TypeRef(_,value,vtpes) =>
-                    val fun: Function = {
+                    var fun: Function = {
                       if(vtpes.size <= 1) {
                         f
                       } else {
diff --git a/src/funcheck/scalacheck/ScalaCheck.scala b/src/funcheck/scalacheck/ScalaCheck.scala
index b1e57db47..17fa79e31 100644
--- a/src/funcheck/scalacheck/ScalaCheck.scala
+++ b/src/funcheck/scalacheck/ScalaCheck.scala
@@ -61,6 +61,8 @@ trait ScalaCheck extends FreshNameCreator {
     def oneOf(generators: List[Symbol]): Tree = 
       Apply(Select(Ident(moduleGenSym), symDecl(moduleGenSym, "oneOf")), generators.map(Ident(_)))
     
+    def lzy(generator: Tree): Tree = 
+      Apply(Select(Ident(moduleGenSym), symDecl(moduleGenSym, "lzy")), List(generator))
     
     /**
      * This creates a Tree node for the call <code>org.scalacheck.Gen.flatMap[T](body)</code>, 
@@ -81,6 +83,8 @@ trait ScalaCheck extends FreshNameCreator {
     def map(qualifier: Tree, body: Tree): Tree = 
       Apply(Select(qualifier, symDecl(classGenSym, "map")), List(body))
      
+    
+    
     /**
      * Utilitary method for creating a method symbol for a <code>org.scalacheck.Gen</codee>
      * generator method. 
@@ -191,7 +195,7 @@ trait ScalaCheck extends FreshNameCreator {
       
       if(cd.symbol.hasFlag(scala.tools.nsc.symtab.Flags.ABSTRACT)) {
         val generators = retTpe.symbol.children.toList.map(s => genSymbolsForType(s.tpe)).flatMap(v=>v)
-        DefDef(genDef, Modifiers(0), List(), Gen.oneOf(generators))
+        DefDef(genDef, Modifiers(0), List(), Gen.lzy(Gen.oneOf(generators)))
       } 
       else {
         
@@ -242,7 +246,7 @@ trait ScalaCheck extends FreshNameCreator {
           }
         }
       
-        body
+        Gen.lzy(body)
       }
     }
    
-- 
GitLab