From c0eae29a415d2a1247a67059e0534cef6e936521 Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Mon, 21 Sep 2020 00:14:39 +0200 Subject: [PATCH] Minor compilation speed optimization --- src/main/scala/millfork/env/Environment.scala | 7 ++++++- src/main/scala/millfork/node/Node.scala | 1 + src/main/scala/millfork/parser/MfParser.scala | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/scala/millfork/env/Environment.scala b/src/main/scala/millfork/env/Environment.scala index e7fb1ed8..5a225469 100644 --- a/src/main/scala/millfork/env/Environment.scala +++ b/src/main/scala/millfork/env/Environment.scala @@ -662,7 +662,12 @@ class Environment(val parent: Option[Environment], val prefix: String, val cpuFa def eval(e: Expression, vars: Map[String, Constant]): Option[Constant] = evalImpl(e, Some(vars)) - def eval(e: Expression): Option[Constant] = evalImpl(e, None) + def eval(e: Expression): Option[Constant] = { + if (e.constantValueCache ne null) return e.constantValueCache + val cv = evalImpl(e, None) + e.constantValueCache = cv + cv + } //noinspection ScalaUnnecessaryParentheses,ZeroIndexToHead private def evalImpl(e: Expression, vv: Option[Map[String, Constant]]): Option[Constant] = try{{ diff --git a/src/main/scala/millfork/node/Node.scala b/src/main/scala/millfork/node/Node.scala index a1679d75..d43d0f67 100644 --- a/src/main/scala/millfork/node/Node.scala +++ b/src/main/scala/millfork/node/Node.scala @@ -54,6 +54,7 @@ sealed trait Expression extends Node { def #-#(that: Expression): Expression = SumExpression(List(false -> this, true -> that), decimal = false) @transient var typeCache: Type = _ + @transient var constantValueCache: Option[Constant] = _ } case class ConstantArrayElementExpression(constant: Constant) extends Expression { diff --git a/src/main/scala/millfork/parser/MfParser.scala b/src/main/scala/millfork/parser/MfParser.scala index b790a6b1..00288236 100644 --- a/src/main/scala/millfork/parser/MfParser.scala +++ b/src/main/scala/millfork/parser/MfParser.scala @@ -806,7 +806,7 @@ object MfParser { val identifierTail: P[String] = CharsWhileIn("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_.1234567890", min = 1).rep(min = 1, sep = "$").! - val identifier: P[String] = (letter ~ ("$".? ~ identifierTail).?).!.opaque("") + val identifier: P[String] = (letter ~ ("$".? ~ identifierTail).?).!.map(_.intern()).opaque("") val doubleQuotedString: P[String] = P("\"" ~/ CharsWhile(c => c != '\"' && c != '\n' && c != '\r').?.! ~ "\"")