From cc60855a5c3bea9f71cae1c18bb0b2022202916d Mon Sep 17 00:00:00 2001 From: Etienne Kneuss <colder@php.net> Date: Mon, 18 Nov 2013 14:36:13 +0100 Subject: [PATCH] Duplicate programs to limit side-effects --- src/main/scala/leon/purescala/Definitions.scala | 17 +++++++++++++++++ .../termination/ComplexTerminationChecker.scala | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/scala/leon/purescala/Definitions.scala b/src/main/scala/leon/purescala/Definitions.scala index 62f9ecbd1..0c65ed814 100644 --- a/src/main/scala/leon/purescala/Definitions.scala +++ b/src/main/scala/leon/purescala/Definitions.scala @@ -65,6 +65,13 @@ object Definitions { out.write(ScalaPrinter(this)) out.close } + + def duplicate = { + copy(mainObject = mainObject.copy(defs = mainObject.defs.collect { + case fd: FunDef => fd.duplicate + case d => d + })) + } } object Program { @@ -278,6 +285,16 @@ object Definitions { var parent: Option[FunDef] = None var orig: Option[FunDef] = None + def duplicate: FunDef = { + val fd = new FunDef(id, returnType, args) + fd.body = body + fd.precondition = precondition + fd.postcondition = postcondition + fd.parent = parent + fd.orig = orig + fd + } + def hasImplementation : Boolean = body.isDefined def hasBody = hasImplementation def hasPrecondition : Boolean = precondition.isDefined diff --git a/src/main/scala/leon/termination/ComplexTerminationChecker.scala b/src/main/scala/leon/termination/ComplexTerminationChecker.scala index de9d00cc2..8dcd43fb2 100644 --- a/src/main/scala/leon/termination/ComplexTerminationChecker.scala +++ b/src/main/scala/leon/termination/ComplexTerminationChecker.scala @@ -4,7 +4,8 @@ package termination import purescala.Definitions._ import purescala.Trees._ -class ComplexTerminationChecker(context: LeonContext, program: Program) extends TerminationChecker(context, program) { +class ComplexTerminationChecker(context: LeonContext, _program: Program) extends TerminationChecker(context, _program.duplicate) { + import scala.collection.mutable.{Map => MutableMap} val name = "Complex Termination Checker" -- GitLab