From 58343a96019876ca64a04cf2409d2d349ef31fe4 Mon Sep 17 00:00:00 2001
From: Nicolas Voirol <voirol.nicolas@gmail.com>
Date: Wed, 10 Feb 2016 15:40:28 +0100
Subject: [PATCH] Partial fix for extern evaluation in CodeGen

---
 .../scala/leon/codegen/CodeGeneration.scala   |  5 ++++
 .../evaluators/EvaluatorSuite.scala           | 25 +++----------------
 2 files changed, 9 insertions(+), 21 deletions(-)

diff --git a/src/main/scala/leon/codegen/CodeGeneration.scala b/src/main/scala/leon/codegen/CodeGeneration.scala
index 9030ba304..4cfbc037c 100644
--- a/src/main/scala/leon/codegen/CodeGeneration.scala
+++ b/src/main/scala/leon/codegen/CodeGeneration.scala
@@ -682,6 +682,11 @@ trait CodeGeneration {
         load(monitorID, ch)
 
         ch << Ldc(id)
+        if (tfd.fd.tparams.nonEmpty) {
+          loadTypes(tfd.tps, ch)
+        } else {
+          ch << Ldc(0) << NewArray.primitive("T_INT")
+        }
 
         ch << Ldc(as.size)
         ch << NewArray(ObjectClass)
diff --git a/src/test/scala/leon/integration/evaluators/EvaluatorSuite.scala b/src/test/scala/leon/integration/evaluators/EvaluatorSuite.scala
index 84b0087ca..812cf88ea 100644
--- a/src/test/scala/leon/integration/evaluators/EvaluatorSuite.scala
+++ b/src/test/scala/leon/integration/evaluators/EvaluatorSuite.scala
@@ -369,28 +369,11 @@ class EvaluatorSuite extends LeonTestSuiteWithProgram with ExpressionsDSL {
   }
 
   test("Lambda functions") { implicit fix =>
-    def checkLambda(e: Evaluator, in: Expr, out: PartialFunction[Expr, Boolean]) {
-      val res = eval(e, in).success
-      if (!out.isDefinedAt(res) || !out(res))
-        throw new AssertionError(s"Evaluation of '$in' with evaluator '${e.name}' produced invalid '$res'.")
-    }
-
-    val ONE = bi(1)
-    val TWO = bi(2)
-
     for(e <- allEvaluators) {
-      checkLambda(e, fcall("Lambda.foo1")(), {
-        case Lambda(Seq(vd), Variable(id)) if vd.id == id => true 
-      })
-      checkLambda(e, fcall("Lambda.foo2")(), {
-        case Lambda(Seq(vd), Plus(ONE, Variable(id))) if vd.id == id => true
-      })
-      checkLambda(e, fcall("Lambda.foo3")(), {
-        case Lambda(Seq(vx, vy), Plus(Plus(Variable(x), ONE), Plus(Variable(y), TWO))) if vx.id == x && vy.id == y => true 
-      })
-      checkLambda(e, fcall("Lambda.foo4")(TWO), {
-        case Lambda(Seq(vd), Plus(Variable(id), TWO)) if vd.id == id => true 
-      })
+      eval(e, Application(fcall("Lambda.foo1")(), Seq(bi(1))))        === bi(1)
+      eval(e, Application(fcall("Lambda.foo2")(), Seq(bi(1))))        === bi(2)
+      eval(e, Application(fcall("Lambda.foo3")(), Seq(bi(1), bi(2)))) === bi(6)
+      eval(e, Application(fcall("Lambda.foo4")(bi(2)), Seq(bi(1))))   === bi(3)
     }
   }
 
-- 
GitLab