diff --git a/lib/std/assertions.nim b/lib/std/assertions.nim index a39aee6c8003..03bab1b1b014 100644 --- a/lib/std/assertions.nim +++ b/lib/std/assertions.nim @@ -9,8 +9,6 @@ ## This module implements assertion handling. -import system/fatal - import std/private/miscdollars # --------------------------------------------------------------------------- # helpers @@ -30,7 +28,7 @@ when not defined(nimHasSinkInference): proc raiseAssert*(msg: string) {.noinline, noreturn, nosinks.} = ## Raises an `AssertionDefect` with `msg`. - sysFatal(AssertionDefect, msg) + raise newException(AssertionDefect, msg) proc failedAssertImpl*(msg: string) {.raises: [], tags: [].} = ## Raises an `AssertionDefect` with `msg`, but this is hidden diff --git a/lib/system.nim b/lib/system.nim index e84971aa2eeb..c670293d5a44 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -1637,13 +1637,8 @@ when not defined(nimscript): ## for debug builds. Since it's usually used for debugging, this ## is proclaimed to have no IO effect! - -when defined(nimHasExceptionsQuery): - const gotoBasedExceptions = compileOption("exceptions", "goto") -else: - const gotoBasedExceptions = false - -import system/fatal +when not declared(sysFatal): + include "system/fatal" when not defined(nimscript): {.push stackTrace: off, profiler: off.} @@ -1656,6 +1651,12 @@ when not defined(nimscript): when defined(nimV2): include system/arc +template newException*(exceptn: typedesc, message: string; + parentException: ref Exception = nil): untyped = + ## Creates an exception object of type `exceptn` and sets its `msg` field + ## to `message`. Returns the new exception object. + (ref exceptn)(msg: message, parent: parentException) + when not defined(nimPreviewSlimSystem): {.deprecated: "assertions is about to move out of system; use `-d:nimPreviewSlimSystem` and import `std/assertions`".} import std/assertions @@ -1863,12 +1864,6 @@ proc debugEcho*(x: varargs[typed, `$`]) {.magic: "Echo", noSideEffect, ## for debugging routines marked as `noSideEffect ## `_. -template newException*(exceptn: typedesc, message: string; - parentException: ref Exception = nil): untyped = - ## Creates an exception object of type `exceptn` and sets its `msg` field - ## to `message`. Returns the new exception object. - (ref exceptn)(msg: message, parent: parentException) - when hostOS == "standalone" and defined(nogc): proc nimToCStringConv(s: NimString): cstring {.compilerproc, inline.} = if s == nil or s.len == 0: result = cstring"" diff --git a/lib/system/fatal.nim b/lib/system/fatal.nim index 6e2edf573456..c01787a32661 100644 --- a/lib/system/fatal.nim +++ b/lib/system/fatal.nim @@ -9,22 +9,27 @@ {.push profiler: off.} +when defined(nimHasExceptionsQuery): + const gotoBasedExceptions = compileOption("exceptions", "goto") +else: + const gotoBasedExceptions = false + when hostOS == "standalone": include "$projectpath/panicoverride" - func sysFatal*(exceptn: typedesc, message: string) {.inline.} = + func sysFatal(exceptn: typedesc, message: string) {.inline.} = panic(message) - func sysFatal*(exceptn: typedesc, message, arg: string) {.inline.} = + func sysFatal(exceptn: typedesc, message, arg: string) {.inline.} = rawoutput(message) panic(arg) elif (defined(nimQuirky) or defined(nimPanics)) and not defined(nimscript): - import system/ansi_c + import ansi_c func name(t: typedesc): string {.magic: "TypeTrait".} - func sysFatal*(exceptn: typedesc, message, arg: string) {.inline, noreturn.} = + func sysFatal(exceptn: typedesc, message, arg: string) {.inline, noreturn.} = when nimvm: # TODO when doAssertRaises works in CT, add a test for it raise (ref exceptn)(msg: message & arg) @@ -41,14 +46,14 @@ elif (defined(nimQuirky) or defined(nimPanics)) and not defined(nimscript): cstderr.rawWrite buf quit 1 - func sysFatal*(exceptn: typedesc, message: string) {.inline, noreturn.} = + func sysFatal(exceptn: typedesc, message: string) {.inline, noreturn.} = sysFatal(exceptn, message, "") else: - func sysFatal*(exceptn: typedesc, message: string) {.inline, noreturn.} = + func sysFatal(exceptn: typedesc, message: string) {.inline, noreturn.} = raise (ref exceptn)(msg: message) - func sysFatal*(exceptn: typedesc, message, arg: string) {.inline, noreturn.} = + func sysFatal(exceptn: typedesc, message, arg: string) {.inline, noreturn.} = raise (ref exceptn)(msg: message & arg) {.pop.} diff --git a/tests/assert/tassert_c.nim b/tests/assert/tassert_c.nim index 5c8f529adf44..110a9aabf6d1 100644 --- a/tests/assert/tassert_c.nim +++ b/tests/assert/tassert_c.nim @@ -8,7 +8,7 @@ tassert_c.nim(35) tassert_c tassert_c.nim(34) foo assertions.nim(*) failedAssertImpl assertions.nim(*) raiseAssert -fatal.nim(*) sysFatal""" +""" proc tmatch(x, p: string): bool = var i = 0 diff --git a/tests/errmsgs/t9768.nim b/tests/errmsgs/t9768.nim index b72a158c7573..94def90f0726 100644 --- a/tests/errmsgs/t9768.nim +++ b/tests/errmsgs/t9768.nim @@ -1,10 +1,10 @@ discard """ - errormsg: "unhandled exception:" - file: "system/fatal.nim" + errormsg: "unhandled exception: t9768.nim(24, 12) `a < 4` [AssertionDefect]" + file: "std/assertions.nim" nimout: ''' stack trace: (most recent call last) -t9768.nim(28, 33) main -t9768.nim(23, 11) foo1 +t9768.nim(29, 33) main +t9768.nim(24, 11) foo1 ''' """ @@ -17,6 +17,7 @@ t9768.nim(23, 11) foo1 + ## line 20 proc foo1(a: int): auto =