Files
Nim/lib/system/fatal.nim

68 lines
2.1 KiB
Nim

#
#
# Nim's Runtime Library
# (c) Copyright 2019 Andreas Rumpf
#
# See the file "copying.txt", included in this
# distribution, for details about the copyright.
#
{.push profiler: off.}
const
gotoBasedExceptions = compileOption("exceptions", "goto")
quirkyExceptions = compileOption("exceptions", "quirky")
when hostOS == "standalone":
# These procs are defined in panicoverride.nim, which gets included at end
# of system.nim with exportc.
proc nimPanic(msg: string) {.importc: "nimPanic", noreturn.}
proc nimRawoutput(msg: string) {.importc: "nimRawoutput".}
proc sysFatal(exceptn: typedesc[Defect], message: string) {.inline, noreturn, raises: [], tags: [].} =
{.cast(noSideEffect).}:
{.cast(raises: []).}:
{.cast(tags: []).}:
nimPanic(message)
proc sysFatal(exceptn: typedesc[Defect], message, arg: string) {.inline, noreturn, raises: [], tags: [].} =
{.cast(noSideEffect).}:
{.cast(raises: []).}:
{.cast(tags: []).}:
nimRawoutput(message)
nimPanic(arg)
elif quirkyExceptions and not defined(nimscript):
import ansi_c
func name(t: typedesc): string {.magic: "TypeTrait".}
func sysFatal(exceptn: typedesc[Defect], message, arg: string) {.inline, noreturn.} =
when nimvm:
# TODO when doAssertRaises works in CT, add a test for it
raise (ref exceptn)(msg: message & arg)
else:
{.noSideEffect.}:
writeStackTrace()
var buf = newStringOfCap(200)
add(buf, "Error: unhandled exception: ")
add(buf, message)
add(buf, arg)
add(buf, " [")
add(buf, name exceptn)
add(buf, "]\n")
cstderr.rawWrite buf
rawQuit 1
func sysFatal(exceptn: typedesc[Defect], message: string) {.inline, noreturn.} =
sysFatal(exceptn, message, "")
else:
func sysFatal(exceptn: typedesc[Defect], message: string) {.inline, noreturn.} =
raise (ref exceptn)(msg: message)
func sysFatal(exceptn: typedesc[Defect], message, arg: string) {.inline, noreturn.} =
raise (ref exceptn)(msg: message & arg)
{.pop.}