diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2014-10-02 01:35:59 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2014-10-02 01:35:59 +0200 |
commit | c17c8e9afa6ba6a1000fe82b1c8a7af10e3fc698 (patch) | |
tree | 6ff81df2442dac972f41a0ede4f609ae34c1f312 /lib/system | |
parent | 2154906fc9b02aa660caec738ebc11529e89bfad (diff) | |
parent | cb6441e73d976dcf59b1e55236887fe5d3a1d6ec (diff) | |
download | Nim-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.nim | 21 |
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>".} |