diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2020-01-01 10:01:49 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-01 10:01:49 +0100 |
commit | c3344862b0d6061cc1581f29c81b29b75c78615a (patch) | |
tree | 75661179ec450bb4e2783603c09f4304dfe42a45 /lib/system.nim | |
parent | 8a63caca07349742d071dcd3a7d3e3055fe617cf (diff) | |
download | Nim-c3344862b0d6061cc1581f29c81b29b75c78615a.tar.gz |
--exception:goto switch for deterministic exception handling (#12977)
This implements "deterministic" exception handling for Nim based on goto instead of setjmp. This means raising an exception is much cheaper than in C++'s table based implementations. Supports hard realtime systems. Default for --gc:arc and the C target because it's generally a good idea and arc is all about deterministic behavior. Note: This implies that fatal runtime traps are not catchable anymore! This needs to be documented.
Diffstat (limited to 'lib/system.nim')
-rw-r--r-- | lib/system.nim | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/lib/system.nim b/lib/system.nim index 58250db3f..838205c57 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -3105,7 +3105,7 @@ when not defined(js): when defined(nimV2): type TNimNode {.compilerproc.} = object # to keep the code generator simple - DestructorProc = proc (p: pointer) {.nimcall, benign.} + DestructorProc = proc (p: pointer) {.nimcall, benign, raises: [].} TNimType {.compilerproc.} = object destructor: pointer size: int @@ -3120,6 +3120,12 @@ when not defined(js): {.pop.} +when not defined(js) and not defined(nimscript): + proc writeStackTrace*() {.tags: [], gcsafe, raises: [].} + ## Writes the current stack trace to ``stderr``. This is only works + ## for debug builds. Since it's usually used for debugging, this + ## is proclaimed to have no IO effect! + when not declared(sysFatal): include "system/fatal" @@ -3693,10 +3699,6 @@ when not defined(JS): #and not defined(nimscript): proc unsetControlCHook*() ## Reverts a call to setControlCHook. - proc writeStackTrace*() {.tags: [], gcsafe.} - ## Writes the current stack trace to ``stderr``. This is only works - ## for debug builds. Since it's usually used for debugging, this - ## is proclaimed to have no IO effect! when hostOS != "standalone": proc getStackTrace*(): string {.gcsafe.} ## Gets the current stack trace. This only works for debug builds. |