From 30c979cc3906c145940bbb787f1d8e7a028eb61e Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Fri, 12 Oct 2018 00:00:41 +0200 Subject: [PATCH] Fix badly handled stack overflow --- src/main/scala/millfork/error/ConsoleLogger.scala | 1 + src/main/scala/millfork/output/AbstractAssembler.scala | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/src/main/scala/millfork/error/ConsoleLogger.scala b/src/main/scala/millfork/error/ConsoleLogger.scala index a934303b..827e9c11 100644 --- a/src/main/scala/millfork/error/ConsoleLogger.scala +++ b/src/main/scala/millfork/error/ConsoleLogger.scala @@ -33,6 +33,7 @@ class ConsoleLogger extends Logger { } } + @inline def f(position: Option[Position]): String = position.fold("")(p => s"(${p.moduleName}:${p.line}:${p.column}) ") override def info(msg: String, position: Option[Position] = None): Unit = { diff --git a/src/main/scala/millfork/output/AbstractAssembler.scala b/src/main/scala/millfork/output/AbstractAssembler.scala index 57c71cc4..faeee935 100644 --- a/src/main/scala/millfork/output/AbstractAssembler.scala +++ b/src/main/scala/millfork/output/AbstractAssembler.scala @@ -79,7 +79,13 @@ abstract class AbstractAssembler[T <: AbstractCode](private val program: Program } } + var stackProbeCount = 0 + def deepConstResolve(c: Constant): Long = { + def stackProbe(n: Int): Int = { + stackProbeCount += 1 + if (n == 0) 0 else stackProbe(n - 1) + 1 + } c match { case NumericConstant(v, _) => v case AssertByte(inner) => @@ -100,6 +106,7 @@ abstract class AbstractAssembler[T <: AbstractCode](private val program: Program val x5 = env.maybeGet[RelativeVariable](th.name).map(_.address) val x6 = env.maybeGet[ConstantThing](th.name.stripSuffix(".array") + ".addr").map(_.value) val x = x1.orElse(x2).orElse(x3).orElse(x4).orElse(x5).orElse(x6) + stackProbe(700) x match { case Some(cc) => deepConstResolve(cc)