diff --git a/src/main/scala/leon/codegen/CompilationUnit.scala b/src/main/scala/leon/codegen/CompilationUnit.scala index 548e2ab000cccc0459245f76a79809669bcc5ffe..799241c5ccefa76c8e0a4fa7e47d033a90d8d313 100644 --- a/src/main/scala/leon/codegen/CompilationUnit.scala +++ b/src/main/scala/leon/codegen/CompilationUnit.scala @@ -25,7 +25,7 @@ class CompilationUnit(val program: Program, val classes: Map[Definition, ClassFi }.toMap protected[codegen] val loader = { - val l = new CafebabeClassLoader + val l = new CafebabeClassLoader(classOf[CompilationUnit].getClassLoader) classes.values.foreach(l.register(_)) l } @@ -72,6 +72,7 @@ class CompilationUnit(val program: Program, val classes: Map[Definition, ClassFi compileExpression(e, Seq()).evalToJVM(Seq()) } + // Note that this may produce untyped expressions! (typically: sets, maps) private[codegen] def jvmToValue(e: AnyRef): Expr = e match { case i: Integer => IntLiteral(i.toInt) diff --git a/src/main/scala/leon/codegen/CompiledExpression.scala b/src/main/scala/leon/codegen/CompiledExpression.scala index 0ae8f949f253ba305db59543004f29c2d05116a3..02cc93407643cf4fbcaff043b8e9352af2064bc1 100644 --- a/src/main/scala/leon/codegen/CompiledExpression.scala +++ b/src/main/scala/leon/codegen/CompiledExpression.scala @@ -18,6 +18,8 @@ class CompiledExpression(unit: CompilationUnit, cf: ClassFile, expression : Expr private lazy val cl = unit.loader.loadClass(cf.className) private lazy val meth = cl.getMethods()(0) + private val exprType = expression.getType + protected[codegen] def evalToJVM(args: Seq[Expr]): AnyRef = { assert(args.size == argsDecl.size) @@ -29,9 +31,14 @@ class CompiledExpression(unit: CompilationUnit, cf: ClassFile, expression : Expr } // This may throw an exception. We unwrap it if needed. + // We also need to reattach a type in some cases (sets, maps). def eval(args: Seq[Expr]) : Expr = { try { - unit.jvmToValue(evalToJVM(args)) + val result = unit.jvmToValue(evalToJVM(args)) + if(!result.isTyped) { + result.setType(exprType) + } + result } catch { case ite : InvocationTargetException => throw ite.getCause() } diff --git a/src/main/scala/leon/evaluators/CodeGenEvaluator.scala b/src/main/scala/leon/evaluators/CodeGenEvaluator.scala index c9f6bed912c88b5d101027efd0836e1ca6649e85..7202c4ff1575abafceb642d651bbd0afdccc19f8 100644 --- a/src/main/scala/leon/evaluators/CodeGenEvaluator.scala +++ b/src/main/scala/leon/evaluators/CodeGenEvaluator.scala @@ -28,6 +28,7 @@ class CodeGenEvaluator(ctx : LeonContext, val unit : CompilationUnit) extends Ev override def compile(expression : Expr, argorder : Seq[Identifier]) : Option[Seq[Expr]=>EvaluationResult] = { import leon.codegen.runtime.LeonCodeGenRuntimeException + import leon.codegen.runtime.LeonCodeGenEvaluationException val ce = unit.compileExpression(expression, argorder) @@ -41,13 +42,8 @@ class CodeGenEvaluator(ctx : LeonContext, val unit : CompilationUnit) extends Ev case e : LeonCodeGenRuntimeException => EvaluationFailure(e.getMessage) - // Required, because the class may be loaded from a different classloader, - // and the check above would fail. - case t : Throwable if t.getClass.toString.endsWith("LeonCodeGenRuntimeException") => - EvaluationFailure(t.getMessage) - - case t : Throwable if t.getClass.toString.endsWith("LeonCodeGenEvaluationException") => - EvaluationError(t.getMessage) + case e : LeonCodeGenEvaluationException => + EvaluationError(e.getMessage) } }) } diff --git a/src/main/scala/leon/purescala/TypeTrees.scala b/src/main/scala/leon/purescala/TypeTrees.scala index 31906fb14b9316cf406167af096d64962c60ef62..22e1010aeaef831f3957792897d1c639610c8254 100644 --- a/src/main/scala/leon/purescala/TypeTrees.scala +++ b/src/main/scala/leon/purescala/TypeTrees.scala @@ -21,6 +21,8 @@ object TypeTrees { case Some(o) if o != tt => scala.sys.error("Resetting type information! Type [" + o + "] is modified to [" + tt) case _ => this } + + def isTyped : Boolean = (getType != Untyped) } class TypeErrorException(msg: String) extends Exception(msg) diff --git a/unmanaged/common/cafebabe_2.9.2-1.2.jar b/unmanaged/common/cafebabe_2.9.2-1.2.jar index bd36c4eee8b7548a6bb0e4fba9003597fc5bf2f6..7fdd2eae06df631006abc992f29847c84198f9a4 100644 Binary files a/unmanaged/common/cafebabe_2.9.2-1.2.jar and b/unmanaged/common/cafebabe_2.9.2-1.2.jar differ