From 622632dfb0af78036ee51ade4405699935f0077e Mon Sep 17 00:00:00 2001
From: Nicolas Voirol <voirol.nicolas@gmail.com>
Date: Thu, 28 Apr 2016 10:42:31 +0200
Subject: [PATCH] synchronized evaluator invariant cache & small fix in codegen

---
 src/main/scala/leon/codegen/CompilationUnit.scala | 10 +++++++---
 src/main/scala/leon/evaluators/Evaluator.scala    |  5 +++--
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/src/main/scala/leon/codegen/CompilationUnit.scala b/src/main/scala/leon/codegen/CompilationUnit.scala
index 366feffaf..88f1679bc 100644
--- a/src/main/scala/leon/codegen/CompilationUnit.scala
+++ b/src/main/scala/leon/codegen/CompilationUnit.scala
@@ -213,9 +213,13 @@ class CompilationUnit(val ctx: LeonContext,
     case CaseClass(cct, args) =>
       caseClassConstructor(cct.classDef) match {
         case Some(cons) =>
-          val tpeParam = if (cct.tps.isEmpty) Seq() else Seq(cct.tps.map(registerType).toArray)
-          val jvmArgs = monitor +: (tpeParam ++ args.map(valueToJVM))
-          cons.newInstance(jvmArgs.toArray : _*).asInstanceOf[AnyRef]
+          try {
+            val tpeParam = if (cct.tps.isEmpty) Seq() else Seq(cct.tps.map(registerType).toArray)
+            val jvmArgs = monitor +: (tpeParam ++ args.map(valueToJVM))
+            cons.newInstance(jvmArgs.toArray : _*).asInstanceOf[AnyRef]
+          } catch {
+            case e : java.lang.reflect.InvocationTargetException => throw e.getCause
+          }
         case None =>
           ctx.reporter.fatalError("Case class constructor not found?!?")
       }
diff --git a/src/main/scala/leon/evaluators/Evaluator.scala b/src/main/scala/leon/evaluators/Evaluator.scala
index 5ae1a57a6..c3d4c737f 100644
--- a/src/main/scala/leon/evaluators/Evaluator.scala
+++ b/src/main/scala/leon/evaluators/Evaluator.scala
@@ -138,14 +138,15 @@ object Evaluator {
   case object Pending extends CheckStatus
   case object NoCheck extends CheckStatus
 
-  def invariantCheck(cc: CaseClass): CheckStatus =
+  def invariantCheck(cc: CaseClass): CheckStatus = synchronized {
     if (!cc.ct.classDef.hasInvariant) Complete(true)
     else checkCache.get(cc).getOrElse {
       checkCache(cc) = Pending
       NoCheck
     }
+  }
 
-  def invariantResult(cc: CaseClass, success: Boolean): Unit = {
+  def invariantResult(cc: CaseClass, success: Boolean): Unit = synchronized {
     checkCache(cc) = Complete(success)
   }
 
-- 
GitLab