feat: implements outofmemoryerror handling
This commit is contained in:
@@ -117,6 +117,22 @@ object RuntimeError {
|
||||
)
|
||||
}
|
||||
|
||||
case object OutOfMemoryError extends RuntimeError {
|
||||
val strLabel = ".L._errOutOfMemory_str0"
|
||||
val errStr = "fatal error: out of memory"
|
||||
val errLabel = ".L._errOutOfMemory"
|
||||
|
||||
def generateHandler: Chain[AsmLine] = Chain(
|
||||
LabelDef(OutOfMemoryError.errLabel),
|
||||
stackAlign,
|
||||
Load(RDI, IndexAddress(RIP, LabelArg(OutOfMemoryError.strLabel))),
|
||||
assemblyIR.Call(CLibFunc.PrintF),
|
||||
Move(RDI, ImmediateVal(255)),
|
||||
assemblyIR.Call(CLibFunc.Exit)
|
||||
)
|
||||
}
|
||||
|
||||
val all: Chain[RuntimeError] =
|
||||
Chain(ZeroDivError, BadChrError, NullPtrError, OverflowError, OutOfBoundsError)
|
||||
Chain(ZeroDivError, BadChrError, NullPtrError, OverflowError, OutOfBoundsError,
|
||||
OutOfMemoryError)
|
||||
}
|
||||
|
||||
@@ -141,8 +141,13 @@ object asmGenerator {
|
||||
|
||||
chain ++= wrapBuiltinFunc(
|
||||
labelGenerator.getLabel(Builtin.Malloc),
|
||||
Chain(stackAlign, assemblyIR.Call(CLibFunc.Malloc))
|
||||
// Out of memory check is optional
|
||||
Chain(
|
||||
stackAlign,
|
||||
assemblyIR.Call(CLibFunc.Malloc),
|
||||
// Out of memory check
|
||||
Compare(RAX, ImmediateVal(0)),
|
||||
Jump(LabelArg(OutOfMemoryError.errLabel), Cond.Equal)
|
||||
)
|
||||
)
|
||||
|
||||
chain ++= wrapBuiltinFunc(
|
||||
|
||||
Reference in New Issue
Block a user