diff --git a/src/main/scala/leon/purescala/Definitions.scala b/src/main/scala/leon/purescala/Definitions.scala index 08d33ccf66b10aab3c05650feede133014d8765b..4ecc8067659de12231d01085b0161966c3f8a7fc 100644 --- a/src/main/scala/leon/purescala/Definitions.scala +++ b/src/main/scala/leon/purescala/Definitions.scala @@ -59,8 +59,7 @@ object Definitions { def toVariable : Variable = Variable(id) } - /** A wrapper for a program. For now a program is simply a single object. The - * name is meaningless and we just use the package name as id. */ + /** A wrapper for a program. For now a program is simply a single object. */ case class Program(units: List[UnitDef]) extends Definition { val id = FreshIdentifier("program") @@ -481,43 +480,19 @@ object Definitions { lazy val returnType: TypeTree = translated(fd.returnType) private var trCache = Map[Expr, Expr]() - private var postCache = Map[Expr, Expr]() - def fullBody = { - val fb = fd.fullBody - trCache.getOrElse(fb, { - val res = translated(fb) - trCache += fb -> res + private def cached(e: Expr): Expr = { + trCache.getOrElse(e, { + val res = translated(e) + trCache += e -> res res }) } - def body = fd.body.map { b => - trCache.getOrElse(b, { - val res = translated(b) - trCache += b -> res - res - }) - } - - def precondition = fd.precondition.map { pre => - trCache.getOrElse(pre, { - val res = translated(pre) - trCache += pre -> res - res - }) - } - - def postcondition = fd.postcondition.map { - case post if typesMap.nonEmpty => - postCache.getOrElse(post, { - val res = instantiateType(post, typesMap, paramsMap) - postCache += (post -> res) - res - }) - - case p => p - } + def fullBody = cached(fd.fullBody) + def body = fd.body map cached + def precondition = fd.precondition map cached + def postcondition = fd.postcondition map cached def hasImplementation = body.isDefined def hasBody = hasImplementation diff --git a/src/main/scala/leon/termination/StructuralSize.scala b/src/main/scala/leon/termination/StructuralSize.scala index 8656a2005ce10781ab219ee703a37d01f4073ba5..a6b08d5986b1cc9dbac5736e273697c6df300298 100644 --- a/src/main/scala/leon/termination/StructuralSize.scala +++ b/src/main/scala/leon/termination/StructuralSize.scala @@ -35,7 +35,7 @@ trait StructuralSize { Variable(x), uminus(Variable(x)) )) - TypedFunDef(absFun, Seq()) // Seq() because no generic type params + absFun.typed } def size(expr: Expr) : Expr = {