summary refs log tree commit diff stats
path: root/lib/system
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2014-10-02 01:35:59 +0200
committerAndreas Rumpf <rumpf_a@web.de>2014-10-02 01:35:59 +0200
commitc17c8e9afa6ba6a1000fe82b1c8a7af10e3fc698 (patch)
tree6ff81df2442dac972f41a0ede4f609ae34c1f312 /lib/system
parent2154906fc9b02aa660caec738ebc11529e89bfad (diff)
parentcb6441e73d976dcf59b1e55236887fe5d3a1d6ec (diff)
downloadNim-c17c8e9afa6ba6a1000fe82b1c8a7af10e3fc698.tar.gz
Merge pull request #1545 from rbehrends/setjmp-perf
Improve setjmp()/longjmp() performance.
Diffstat (limited to 'lib/system')
-rw-r--r--lib/system/ansi_c.nim21
1 files changed, 17 insertions, 4 deletions
diff --git a/lib/system/ansi_c.nim b/lib/system/ansi_c.nim
index e012697ae..673d55582 100644
--- a/lib/system/ansi_c.nim
+++ b/lib/system/ansi_c.nim
@@ -78,10 +78,23 @@ when defined(macosx):
 else:
   template SIGBUS: expr = SIGSEGV
 
-proc c_longjmp(jmpb: C_JmpBuf, retval: cint) {.
-  header: "<setjmp.h>", importc: "longjmp".}
-proc c_setjmp(jmpb: C_JmpBuf): cint {.
-  header: "<setjmp.h>", importc: "setjmp".}
+when defined(nimSigSetjmp) and not defined(nimStdSetjmp):
+  proc c_longjmp(jmpb: C_JmpBuf, retval: cint) {.
+    header: "<setjmp.h>", importc: "siglongjmp".}
+  template c_setjmp(jmpb: C_JmpBuf): cint =
+    proc c_sigsetjmp(jmpb: C_JmpBuf, savemask: cint): cint {.
+      header: "<setjmp.h>", importc: "sigsetjmp".}
+    c_sigsetjmp(jmpb, 0)
+elif defined(nimRawSetjmp) and not defined(nimStdSetjmp):
+  proc c_longjmp(jmpb: C_JmpBuf, retval: cint) {.
+    header: "<setjmp.h>", importc: "_longjmp".}
+  proc c_setjmp(jmpb: C_JmpBuf): cint {.
+    header: "<setjmp.h>", importc: "_setjmp".}
+else:
+  proc c_longjmp(jmpb: C_JmpBuf, retval: cint) {.
+    header: "<setjmp.h>", importc: "longjmp".}
+  proc c_setjmp(jmpb: C_JmpBuf): cint {.
+    header: "<setjmp.h>", importc: "setjmp".}
 
 proc c_signal(sig: cint, handler: proc (a: cint) {.noconv.}) {.
   importc: "signal", header: "<signal.h>".}