From 9669e4d87dc015bc404b87556cac17b482b570ff Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Wed, 26 Dec 2018 01:26:12 +0100 Subject: [PATCH] Cache AST typing --- .../scala/millfork/compiler/AbstractExpressionCompiler.scala | 5 ++++- src/main/scala/millfork/node/Node.scala | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/scala/millfork/compiler/AbstractExpressionCompiler.scala b/src/main/scala/millfork/compiler/AbstractExpressionCompiler.scala index c662b48b..625989c4 100644 --- a/src/main/scala/millfork/compiler/AbstractExpressionCompiler.scala +++ b/src/main/scala/millfork/compiler/AbstractExpressionCompiler.scala @@ -194,6 +194,7 @@ object AbstractExpressionCompiler { } def getExpressionType(env: Environment, log: Logger, expr: Expression): Type = { + if (expr.typeCache ne null) expr.typeCache val b = env.get[Type]("byte") val bool = env.get[Type]("bool$") val boolTrue = env.get[Type]("true$") @@ -236,7 +237,7 @@ object AbstractExpressionCompiler { val v = env.get[Type]("void") val w = env.get[Type]("word") - expr match { + val t = expr match { case LiteralExpression(value, size) => size match { case 1 => b @@ -330,6 +331,8 @@ object AbstractExpressionCompiler { lookupFunction(env, log, f).returnType } } + expr.typeCache = t + t } def checkIndexType(ctx: CompilationContext, pointy: Pointy, index: Expression): Unit = { diff --git a/src/main/scala/millfork/node/Node.scala b/src/main/scala/millfork/node/Node.scala index a6e99a3d..4bec2245 100644 --- a/src/main/scala/millfork/node/Node.scala +++ b/src/main/scala/millfork/node/Node.scala @@ -33,6 +33,7 @@ sealed trait Expression extends Node { def getPointies: Seq[String] def isPure: Boolean def getAllIdentifiers: Set[String] + @transient var typeCache: Type = _ } case class ConstantArrayElementExpression(constant: Constant) extends Expression {