BetterC + Windows + setjmp longjmp
Diederik de Groot
ddegroot at talon.nl
Thu Sep 20 15:50:16 UTC 2018
On Thursday, 20 September 2018 at 12:11:55 UTC, SrMordred wrote:
> Ok, after a better look at the sources I finally got it:
>
> setjmp is a macro.
> the true function signature is "int _setjmp(jmp_buf, void*)"
>
> the void* is the current function address which in mingw
> sources are capture by "__builtin_frame_address(0)".
>
> And I did´t look yet to see if Dlang have an equivalent.
> but calling _setjmp(jmp_buf, null); the simple examples are
> working :)
Nice to see you managed to figure it all out, congrats!
So it now looks something like this ?:
version(Windows) {
version(X86)
enum _JBLEN = 64;
else version(X86_64)
enum _JBLEN = 256;
else version(IA64)
enum _JBLEN = 528;
alias ubyte[_JBLEN] jmp_buf;
extern (C) {
int _setjmp(ref jmp_buf, null);
void longjmp(ref jmp_buf, int);
}
alias _setjmp setjmp;
}
Hopefully you will be able to merge the two examples and create a
nice druntime PR out of it. The
https://forum.dlang.org/post/mmxwhdypncaeikknlpyq@forum.dlang.org
version does look a lot cleaner (but also a little more cryptic).
Might be wise to follow the core.sys.posix.setjmp.d
implementation. If available, maybe also add the sigsetjmp /
siglonggmp and sigaction versions (if available on windows).
Good luck !
More information about the Digitalmars-d-learn
mailing list