refactor: redesigned runtime errors with added functionality
This commit is contained in:
@@ -3,7 +3,7 @@ package wacc
|
||||
import scala.collection.mutable.ListBuffer
|
||||
import cats.data.Chain
|
||||
import cats.syntax.foldable._
|
||||
import wacc.RuntimeErrors._
|
||||
import wacc.RuntimeError._
|
||||
|
||||
object asmGenerator {
|
||||
import microWacc._
|
||||
@@ -63,10 +63,7 @@ object asmGenerator {
|
||||
LabelDef(s".L.str$i"),
|
||||
Directive.Asciz(str.escaped)
|
||||
)
|
||||
} ++ zeroDivError.stringDef
|
||||
++ badChrError.stringDef
|
||||
++ nullPtrError.stringDef // TODO COLLATE TO ONE LIST INSTANCE
|
||||
++ overflowError.stringDef
|
||||
} ++ RuntimeError.all.foldMap(_.stringDef)
|
||||
|
||||
Chain(
|
||||
Directive.IntelSyntax,
|
||||
@@ -153,7 +150,7 @@ object asmGenerator {
|
||||
stackAlign,
|
||||
Move(RDI, RAX),
|
||||
Compare(RDI, ImmediateVal(0)),
|
||||
Jump(LabelArg(nullPtrError.errLabel), Cond.Equal),
|
||||
Jump(LabelArg(NullPtrError.errLabel), Cond.Equal),
|
||||
assemblyIR.Call(CLibFunc.Free)
|
||||
)
|
||||
)
|
||||
@@ -170,44 +167,7 @@ object asmGenerator {
|
||||
)
|
||||
)
|
||||
|
||||
chain ++= Chain(
|
||||
// TODO can this be done with a call to generateStmt?
|
||||
// Consider other error cases -> look to generalise
|
||||
LabelDef(zeroDivError.errLabel),
|
||||
stackAlign,
|
||||
Load(RDI, IndexAddress(RIP, LabelArg(zeroDivError.strLabel))),
|
||||
assemblyIR.Call(CLibFunc.PrintF),
|
||||
Move(RDI, ImmediateVal(-1)),
|
||||
assemblyIR.Call(CLibFunc.Exit)
|
||||
)
|
||||
|
||||
chain ++= Chain(
|
||||
LabelDef(badChrError.errLabel),
|
||||
Pop(RSI),
|
||||
stackAlign,
|
||||
Load(RDI, IndexAddress(RIP, LabelArg(badChrError.strLabel))),
|
||||
assemblyIR.Call(CLibFunc.PrintF),
|
||||
Move(RDI, ImmediateVal(255)),
|
||||
assemblyIR.Call(CLibFunc.Exit)
|
||||
)
|
||||
|
||||
chain ++= Chain(
|
||||
LabelDef(nullPtrError.errLabel),
|
||||
stackAlign,
|
||||
Load(RDI, IndexAddress(RIP, LabelArg(nullPtrError.strLabel))),
|
||||
assemblyIR.Call(CLibFunc.PrintF),
|
||||
Move(RDI, ImmediateVal(255)),
|
||||
assemblyIR.Call(CLibFunc.Exit)
|
||||
)
|
||||
|
||||
chain ++= Chain(
|
||||
LabelDef(overflowError.errLabel),
|
||||
stackAlign,
|
||||
Load(RDI, IndexAddress(RIP, LabelArg(overflowError.strLabel))),
|
||||
assemblyIR.Call(CLibFunc.PrintF),
|
||||
Move(RDI, ImmediateVal(255)),
|
||||
assemblyIR.Call(CLibFunc.Exit)
|
||||
)
|
||||
chain ++= RuntimeError.all.foldMap(_.generateHandler)
|
||||
|
||||
chain
|
||||
}
|
||||
@@ -348,7 +308,7 @@ object asmGenerator {
|
||||
chain += Move(EAX, stack.head)
|
||||
chain += And(EAX, ImmediateVal(-128))
|
||||
chain += Compare(EAX, ImmediateVal(0))
|
||||
chain += Jump(LabelArg(badChrError.errLabel), Cond.NotEqual)
|
||||
chain += Jump(LabelArg(BadChrError.errLabel), Cond.NotEqual)
|
||||
case UnaryOperator.Ord => // No op needed
|
||||
case UnaryOperator.Len =>
|
||||
chain += stack.pop(RAX)
|
||||
@@ -357,7 +317,7 @@ object asmGenerator {
|
||||
case UnaryOperator.Negate =>
|
||||
chain += Xor(EAX, EAX)
|
||||
chain += Subtract(EAX, stack.head)
|
||||
chain += Jump(LabelArg(overflowError.errLabel), Cond.Overflow)
|
||||
chain += Jump(LabelArg(OverflowError.errLabel), Cond.Overflow)
|
||||
chain += stack.drop()
|
||||
chain += stack.push(Q64, RAX)
|
||||
case UnaryOperator.Not =>
|
||||
@@ -373,20 +333,20 @@ object asmGenerator {
|
||||
op match {
|
||||
case BinaryOperator.Add =>
|
||||
chain += Add(stack.head, destX)
|
||||
chain += Jump(LabelArg(overflowError.errLabel), Cond.Overflow)
|
||||
chain += Jump(LabelArg(OverflowError.errLabel), Cond.Overflow)
|
||||
case BinaryOperator.Sub =>
|
||||
chain += Subtract(destX, stack.head)
|
||||
chain += stack.drop()
|
||||
chain += stack.push(destX.size, RAX)
|
||||
case BinaryOperator.Mul =>
|
||||
chain += Multiply(destX, stack.head)
|
||||
chain += Jump(LabelArg(overflowError.errLabel), Cond.Overflow)
|
||||
chain += Jump(LabelArg(OverflowError.errLabel), Cond.Overflow)
|
||||
chain += stack.drop()
|
||||
chain += stack.push(destX.size, RAX)
|
||||
|
||||
case BinaryOperator.Div =>
|
||||
chain += Compare(stack.head, ImmediateVal(0))
|
||||
chain += Jump(LabelArg(zeroDivError.errLabel), Cond.Equal)
|
||||
chain += Jump(LabelArg(ZeroDivError.errLabel), Cond.Equal)
|
||||
chain += CDQ()
|
||||
chain += Divide(stack.head)
|
||||
chain += stack.drop()
|
||||
@@ -394,7 +354,7 @@ object asmGenerator {
|
||||
|
||||
case BinaryOperator.Mod =>
|
||||
chain += Compare(stack.head, ImmediateVal(0))
|
||||
chain += Jump(LabelArg(zeroDivError.errLabel), Cond.Equal)
|
||||
chain += Jump(LabelArg(ZeroDivError.errLabel), Cond.Equal)
|
||||
chain += CDQ()
|
||||
chain += Divide(stack.head)
|
||||
chain += stack.drop()
|
||||
@@ -480,7 +440,7 @@ object asmGenerator {
|
||||
chain
|
||||
}
|
||||
|
||||
private def stackAlign: AsmLine = And(Register(Q64, SP), ImmediateVal(-16))
|
||||
def stackAlign: AsmLine = And(Register(Q64, SP), ImmediateVal(-16))
|
||||
private def zeroRest(dest: Dest, size: Size): Chain[AsmLine] = size match {
|
||||
case Q64 | D32 => Chain.empty
|
||||
case _ => Chain.one(And(dest, ImmediateVal((1 << (size.toInt * 8)) - 1)))
|
||||
|
||||
Reference in New Issue
Block a user