1#
2#
3#            Nim's Runtime Library
4#        (c) Copyright 2019 Andreas Rumpf
5#
6#    See the file "copying.txt", included in this
7#    distribution, for details about the copyright.
8#
9
10{.push profiler: off.}
11
12when defined(nimHasExceptionsQuery):
13  const gotoBasedExceptions = compileOption("exceptions", "goto")
14else:
15  const gotoBasedExceptions = false
16
17when hostOS == "standalone":
18  include "$projectpath/panicoverride"
19
20  proc sysFatal(exceptn: typedesc, message: string) {.inline.} =
21    panic(message)
22
23  proc sysFatal(exceptn: typedesc, message, arg: string) {.inline.} =
24    rawoutput(message)
25    panic(arg)
26
27elif (defined(nimQuirky) or defined(nimPanics)) and not defined(nimscript):
28  import ansi_c
29
30  proc name(t: typedesc): string {.magic: "TypeTrait".}
31
32  proc sysFatal(exceptn: typedesc, message, arg: string) {.inline, noreturn.} =
33    when nimvm:
34      # TODO when doAssertRaises works in CT, add a test for it
35      raise (ref exceptn)(msg: message & arg)
36    else:
37      writeStackTrace()
38      var buf = newStringOfCap(200)
39      add(buf, "Error: unhandled exception: ")
40      add(buf, message)
41      add(buf, arg)
42      add(buf, " [")
43      add(buf, name exceptn)
44      add(buf, "]\n")
45      cstderr.rawWrite buf
46      quit 1
47
48  proc sysFatal(exceptn: typedesc, message: string) {.inline, noreturn.} =
49    sysFatal(exceptn, message, "")
50
51else:
52  proc sysFatal(exceptn: typedesc, message: string) {.inline, noreturn.} =
53    raise (ref exceptn)(msg: message)
54
55  proc sysFatal(exceptn: typedesc, message, arg: string) {.inline, noreturn.} =
56    raise (ref exceptn)(msg: message & arg)
57
58{.pop.}
59