Skip to content
Snippets Groups Projects
Commit c26f5420 authored by Mikaël Mayer's avatar Mikaël Mayer
Browse files

Reduced the AbstractEvaluator's overhead by simplifying some expressions in the pattern matching.

parent a8a1e695
No related branches found
No related tags found
No related merge requests found
...@@ -57,6 +57,8 @@ class AbstractEvaluator(ctx: LeonContext, prog: Program) extends ContextualEvalu ...@@ -57,6 +57,8 @@ class AbstractEvaluator(ctx: LeonContext, prog: Program) extends ContextualEvalu
override val description: String = "Evaluates string programs but keeps the formula which generated the value" override val description: String = "Evaluates string programs but keeps the formula which generated the value"
override val name: String = "Abstract evaluator" override val name: String = "Abstract evaluator"
/** True if CaseClassSelector(...CaseClass(...)) have to be simplified. */
var evaluateCaseClassSelector = true
protected def e(expr: Expr)(implicit rctx: RC, gctx: GC): (Expr, Expr) = { protected def e(expr: Expr)(implicit rctx: RC, gctx: GC): (Expr, Expr) = {
implicit def aToC: AbstractEvaluator.this.underlying.RC = DefaultRecContext(rctx.mappings) implicit def aToC: AbstractEvaluator.this.underlying.RC = DefaultRecContext(rctx.mappings)
...@@ -165,7 +167,13 @@ class AbstractEvaluator(ctx: LeonContext, prog: Program) extends ContextualEvalu ...@@ -165,7 +167,13 @@ class AbstractEvaluator(ctx: LeonContext, prog: Program) extends ContextualEvalu
case (CaseClassPattern(ob, pct, subs), CaseClass(ct, args)) => case (CaseClassPattern(ob, pct, subs), CaseClass(ct, args)) =>
if (pct == ct) { if (pct == ct) {
val res = (subs zip args zip ct.classDef.fieldsIds).map{ val res = (subs zip args zip ct.classDef.fieldsIds).map{
case ((s, a), id) => matchesPattern(s, a, CaseClassSelector(ct, exprFromScrut, id)) case ((s, a), id) =>
exprFromScrut match {
case CaseClass(ct, args) if evaluateCaseClassSelector =>
matchesPattern(s, a, args(ct.classDef.selectorID2Index(id)))
case _ =>
matchesPattern(s, a, CaseClassSelector(ct, exprFromScrut, id))
}
} }
if (res.forall(_.isDefined)) { if (res.forall(_.isDefined)) {
Some(obind(ob, expr, exprFromScrut) ++ res.flatten.flatten) Some(obind(ob, expr, exprFromScrut) ++ res.flatten.flatten)
...@@ -193,7 +201,15 @@ class AbstractEvaluator(ctx: LeonContext, prog: Program) extends ContextualEvalu ...@@ -193,7 +201,15 @@ class AbstractEvaluator(ctx: LeonContext, prog: Program) extends ContextualEvalu
} }
case (TuplePattern(ob, subs), Tuple(args)) => case (TuplePattern(ob, subs), Tuple(args)) =>
if (subs.size == args.size) { if (subs.size == args.size) {
val res = (subs zip args).zipWithIndex.map{ case ((s, a), i) => matchesPattern(s, a, TupleSelect(exprFromScrut, i + 1)) } val res = (subs zip args).zipWithIndex.map{
case ((s, a), i) =>
exprFromScrut match {
case TupleSelect(Tuple(args), i) if evaluateCaseClassSelector=>
matchesPattern(s, a, args(i - 1))
case _ =>
matchesPattern(s, a, TupleSelect(exprFromScrut, i + 1))
}
}
if (res.forall(_.isDefined)) { if (res.forall(_.isDefined)) {
Some(obind(ob, expr, exprFromScrut) ++ res.flatten.flatten) Some(obind(ob, expr, exprFromScrut) ++ res.flatten.flatten)
} else { } else {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment