refactor: use non-singleton labelgenerator (instead use class)

This commit is contained in:
Gleb Koval 2025-02-25 17:10:56 +00:00
parent 5f8b87221c
commit efe9f91303
Signed by: cyclane
GPG Key ID: 15E168A8B332382C

View File

@ -24,21 +24,10 @@ object asmGenerator {
val _8_BIT_MASK = 0xff
object labelGenerator {
var labelVal = -1
def getLabel(): String = {
labelVal += 1
s".L$labelVal"
}
def getLabel(target: CallTarget): String = target match {
case Ident(v, _) => s"wacc_$v"
case Builtin(name) => s"_$name"
}
}
def generateAsm(microProg: Program): List[AsmLine] = {
given stack: Stack = Stack()
given strings: ListBuffer[String] = ListBuffer[String]()
given labelGenerator: LabelGenerator = LabelGenerator()
val Program(funcs, main) = microProg
val progAsm =
@ -76,7 +65,8 @@ object asmGenerator {
def generateBuiltInFuncs()(using
stack: Stack,
strings: ListBuffer[String]
strings: ListBuffer[String],
labelGenerator: LabelGenerator
): List[AsmLine] = {
wrapFunc(
labelGenerator.getLabel(Builtin.Exit),
@ -112,7 +102,11 @@ object asmGenerator {
def generateStmt(
stmt: Stmt
)(using stack: Stack, strings: ListBuffer[String]): List[AsmLine] =
)(using
stack: Stack,
strings: ListBuffer[String],
labelGenerator: LabelGenerator
): List[AsmLine] =
stmt match {
case Assign(lhs, rhs) =>
var dest: () => IndexAddress =
@ -168,7 +162,8 @@ object asmGenerator {
def evalExprOntoStack(expr: Expr)(using
stack: Stack,
strings: ListBuffer[String]
strings: ListBuffer[String],
labelGenerator: LabelGenerator
): List[AsmLine] = {
val out = expr match {
case IntLiter(v) =>
@ -303,7 +298,8 @@ object asmGenerator {
def generateCall(call: microWacc.Call)(using
stack: Stack,
strings: ListBuffer[String]
strings: ListBuffer[String],
labelGenerator: LabelGenerator
): List[AsmLine] = {
val argRegs = List(RDI, RSI, RDX, RCX, R8, R9)
val microWacc.Call(target, args) = call
@ -320,7 +316,8 @@ object asmGenerator {
def generateComparison(x: Expr, y: Expr, cond: Cond)(using
stack: Stack,
strings: ListBuffer[String]
strings: ListBuffer[String],
labelGenerator: LabelGenerator
): List[AsmLine] = {
evalExprOntoStack(x) ++
evalExprOntoStack(y) ++
@ -350,6 +347,18 @@ object asmGenerator {
)
}
class LabelGenerator {
var labelVal = -1
def getLabel(): String = {
labelVal += 1
s".L$labelVal"
}
def getLabel(target: CallTarget): String = target match {
case Ident(v, _) => s"wacc_$v"
case Builtin(name) => s"_$name"
}
}
class Stack {
private val stack = LinkedHashMap[Expr | Int, Int]()
private val RSP = Register(RegSize.R64, RegName.SP)