From 2e7b523fa5eb2863a0d43f1e8faba534ab9d4ef5 Mon Sep 17 00:00:00 2001 From: Etienne Kneuss <ekneuss@gmail.com> Date: Thu, 25 Oct 2012 17:27:09 +0200 Subject: [PATCH] Process management, try #2 --- .../scala/leon/synthesis/SynthesisPhase.scala | 31 +++++++++++++++++-- .../scala/leon/synthesis/Synthesizer.scala | 20 +++++++++--- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/main/scala/leon/synthesis/SynthesisPhase.scala b/src/main/scala/leon/synthesis/SynthesisPhase.scala index bf7a62e7e..b21f87ae3 100644 --- a/src/main/scala/leon/synthesis/SynthesisPhase.scala +++ b/src/main/scala/leon/synthesis/SynthesisPhase.scala @@ -14,7 +14,8 @@ object SynthesisPhase extends LeonPhase[Program, PipelineControl] { new FairZ3Solver(quietReporter) ) - val newProgram = new Synthesizer(ctx.reporter, solvers).synthesizeAll(p) + val synth = new Synthesizer(ctx.reporter, solvers) + val solutions = synth.synthesizeAll(p) detectEditor match { case Some(program) => @@ -31,7 +32,31 @@ object SynthesisPhase extends LeonPhase[Program, PipelineControl] { } def openEditor(program: String, path: String) { - val p = sys.process.Process(program+" "+path) - p !< + val proc = Runtime.getRuntime().exec(program+" "+path) + + val errGobbler = new StreamGobbler(proc.getErrorStream(), System.err) + val outGobbler = new StreamGobbler(proc.getInputStream(), System.out) + val inGobbler = new StreamGobbler(System.in, proc.getOutputStream()) + + errGobbler.start() + outGobbler.start() + inGobbler.start() + + proc.waitFor() + errGobbler.join() + outGobbler.join() + } + + import java.io.{InputStream, OutputStream} + class StreamGobbler(is: InputStream, os: OutputStream) extends Thread { + override def run() { + var c: Int = is.read() + while(c != 1) { + os.write(c); + os.flush(); + + c = is.read() + } + } } } diff --git a/src/main/scala/leon/synthesis/Synthesizer.scala b/src/main/scala/leon/synthesis/Synthesizer.scala index 9e02f8025..7e53e3812 100644 --- a/src/main/scala/leon/synthesis/Synthesizer.scala +++ b/src/main/scala/leon/synthesis/Synthesizer.scala @@ -86,8 +86,8 @@ class Synthesizer(val r: Reporter, val solvers: List[Solver]) { (None, Map()) } - def synthesizeAll(program: Program) = { - import purescala.Trees._ + import purescala.Trees._ + def synthesizeAll(program: Program): List[(Choose, Solution)] = { solvers.foreach(_.setProgram(program)) @@ -95,8 +95,10 @@ class Synthesizer(val r: Reporter, val solvers: List[Solver]) { def noop(u:Expr, u2: Expr) = u + var solutions = List[(Choose, Solution)]() + def actOnChoose(f: FunDef)(e: Expr, a: Expr): Expr = e match { - case Choose(vars, pred) => + case ch @ Choose(vars, pred) => val xs = vars val as = (variablesOf(pred)--xs).toList val phi = pred @@ -105,8 +107,11 @@ class Synthesizer(val r: Reporter, val solvers: List[Solver]) { info("") info("In Function "+f.id+":") info("-"*80) + val sol = synthesize(Problem(as, phi, xs), rules) + solutions = (ch, sol) :: solutions + info("Scala code:") info(ScalaPrinter(simplifyLets(sol.toExpr))) @@ -120,6 +125,13 @@ class Synthesizer(val r: Reporter, val solvers: List[Solver]) { treeCatamorphism(x => x, noop, actOnChoose(f), f.body.get) } - program + solutions + } + + def substitueChooses(file: String, sols: List[(Choose, Solution)]) = { + import scala.io.Source + + val src = Source.fromFile(file) + } } -- GitLab