feat: use errorcode constant in runtime errors
This commit is contained in:
@@ -3,6 +3,8 @@ package wacc
|
|||||||
import cats.data.Chain
|
import cats.data.Chain
|
||||||
import wacc.assemblyIR._
|
import wacc.assemblyIR._
|
||||||
|
|
||||||
|
val ERROR_CODE = 255
|
||||||
|
|
||||||
sealed trait RuntimeError {
|
sealed trait RuntimeError {
|
||||||
def strLabel: String
|
def strLabel: String
|
||||||
def errStr: String
|
def errStr: String
|
||||||
@@ -33,7 +35,7 @@ object RuntimeError {
|
|||||||
// private val RBP = Register(Q64, BP)
|
// private val RBP = Register(Q64, BP)
|
||||||
private val RSI = Register(Q64, SI)
|
private val RSI = Register(Q64, SI)
|
||||||
// private val RDX = Register(Q64, DX)
|
// private val RDX = Register(Q64, DX)
|
||||||
// private val RCX = Register(Q64, CX)
|
private val RCX = Register(Q64, CX)
|
||||||
|
|
||||||
case object ZeroDivError extends RuntimeError {
|
case object ZeroDivError extends RuntimeError {
|
||||||
val strLabel = ".L._errDivZero_str0"
|
val strLabel = ".L._errDivZero_str0"
|
||||||
@@ -62,7 +64,7 @@ object RuntimeError {
|
|||||||
stackAlign,
|
stackAlign,
|
||||||
Load(RDI, IndexAddress(RIP, LabelArg(BadChrError.strLabel))),
|
Load(RDI, IndexAddress(RIP, LabelArg(BadChrError.strLabel))),
|
||||||
assemblyIR.Call(CLibFunc.PrintF),
|
assemblyIR.Call(CLibFunc.PrintF),
|
||||||
Move(RDI, ImmediateVal(255)),
|
Move(RDI, ImmediateVal(ERROR_CODE)),
|
||||||
assemblyIR.Call(CLibFunc.Exit)
|
assemblyIR.Call(CLibFunc.Exit)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -78,7 +80,7 @@ object RuntimeError {
|
|||||||
stackAlign,
|
stackAlign,
|
||||||
Load(RDI, IndexAddress(RIP, LabelArg(NullPtrError.strLabel))),
|
Load(RDI, IndexAddress(RIP, LabelArg(NullPtrError.strLabel))),
|
||||||
assemblyIR.Call(CLibFunc.PrintF),
|
assemblyIR.Call(CLibFunc.PrintF),
|
||||||
Move(RDI, ImmediateVal(255)),
|
Move(RDI, ImmediateVal(ERROR_CODE)),
|
||||||
assemblyIR.Call(CLibFunc.Exit)
|
assemblyIR.Call(CLibFunc.Exit)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -94,7 +96,7 @@ object RuntimeError {
|
|||||||
stackAlign,
|
stackAlign,
|
||||||
Load(RDI, IndexAddress(RIP, LabelArg(OverflowError.strLabel))),
|
Load(RDI, IndexAddress(RIP, LabelArg(OverflowError.strLabel))),
|
||||||
assemblyIR.Call(CLibFunc.PrintF),
|
assemblyIR.Call(CLibFunc.PrintF),
|
||||||
Move(RDI, ImmediateVal(255)),
|
Move(RDI, ImmediateVal(ERROR_CODE)),
|
||||||
assemblyIR.Call(CLibFunc.Exit)
|
assemblyIR.Call(CLibFunc.Exit)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -108,11 +110,11 @@ object RuntimeError {
|
|||||||
|
|
||||||
def generateHandler: Chain[AsmLine] = Chain(
|
def generateHandler: Chain[AsmLine] = Chain(
|
||||||
LabelDef(OutOfBoundsError.errLabel),
|
LabelDef(OutOfBoundsError.errLabel),
|
||||||
Move(RSI, Register(Q64, CX)),
|
Move(RSI, RCX),
|
||||||
stackAlign,
|
stackAlign,
|
||||||
Load(RDI, IndexAddress(RIP, LabelArg(OutOfBoundsError.strLabel))),
|
Load(RDI, IndexAddress(RIP, LabelArg(OutOfBoundsError.strLabel))),
|
||||||
assemblyIR.Call(CLibFunc.PrintF),
|
assemblyIR.Call(CLibFunc.PrintF),
|
||||||
Move(RDI, ImmediateVal(255)),
|
Move(RDI, ImmediateVal(ERROR_CODE)),
|
||||||
assemblyIR.Call(CLibFunc.Exit)
|
assemblyIR.Call(CLibFunc.Exit)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -127,7 +129,7 @@ object RuntimeError {
|
|||||||
stackAlign,
|
stackAlign,
|
||||||
Load(RDI, IndexAddress(RIP, LabelArg(OutOfMemoryError.strLabel))),
|
Load(RDI, IndexAddress(RIP, LabelArg(OutOfMemoryError.strLabel))),
|
||||||
assemblyIR.Call(CLibFunc.PrintF),
|
assemblyIR.Call(CLibFunc.PrintF),
|
||||||
Move(RDI, ImmediateVal(255)),
|
Move(RDI, ImmediateVal(ERROR_CODE)),
|
||||||
assemblyIR.Call(CLibFunc.Exit)
|
assemblyIR.Call(CLibFunc.Exit)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user