From: Taahir Ahmed <ahmed.taahir@gmail.com>
To: guile-devel@gnu.org
Subject: Exception-safety for C++ code integrated with Guile.
Date: Mon, 23 Feb 2015 15:59:43 -0600 [thread overview]
Message-ID: <474913203.jcqxqasMgP@basis> (raw)
[-- Attachment #1: Type: text/plain, Size: 2453 bytes --]
Over the past few days, I've been working on reducing the amount of
defensive coding that is required when writing Guile extensions using
C++.
My primary goal is to ensure that destructors of automatic variables
are called if any Guile non-local control flow passes through a C++
stack frame.
I'm writing to the list for three purposes:
1) To check that I'm not duplicating any other ongoing work,
2) To float two different implementation strategies and see which
one is the best choice going forward, and
3) To get clarification on some issues that I've encountered with a
prototype implementation.
The two major strategies I considered are:
1) Replace all uses of set/longjmp in the Guile source with C++
exceptions. This approach is simple in some ways, and
complicated in others. I would hesitate to pursue this unless
Guile has some sort of longer-term plan to move towards C++.
2) Replace all uses of set/longjmp with replacements (call them
eh_setjmp and eh_longjmp) that are based on libunwind [1].
eh_longjmp uses libunwind to walk up the stack, calling each
frame's personality routine [2]. This approach will requires a
platform that uses DWARF exception handling (i.e., everybody
except non-Cygwin Windows). It has the potential to make calls
to setjmp much faster, but calls to longjmp would take linear (as
opposed to constant) time in the number of stack frames crossed.
I've started working on a proof-of-concept for option 2 (heavily
cribbed from libunwind's own set/longjmp replacement).
However, I've run into an issue --- many of Guile's uses of setjmp
don't conform to the C standard. In particular, after experiencing a
non-local return from setjmp, you're not allowed to access any
non-volatile local variables, but Guile does (see the local variable
mx in eval()).
In effect, Guile is assuming that setjmp saves and restores registers,
but the standard doesn't require that behavior from setjmp. I can
make my setjmp implementation save all registers, but I decided to
first check and see if this was a conscious decision to embrace
nonportability, or an accidental one.
Thanks,
Taahir Ahmed
----------------------------------------------------------------------
[1] http://www.nongnu.org/libunwind/index.html
[2] http://mentorembedded.github.io/cxx-abi/abi-eh.html#base-personality
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 473 bytes --]
next reply other threads:[~2015-02-23 21:59 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-23 21:59 Taahir Ahmed [this message]
2015-02-24 18:52 ` Exception-safety for C++ code integrated with Guile Eli Zaretskii
2015-02-24 19:21 ` Taahir Ahmed
2015-02-24 19:36 ` Eli Zaretskii
2015-02-24 19:59 ` Taahir Ahmed
2015-03-10 21:15 ` Andy Wingo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=474913203.jcqxqasMgP@basis \
--to=ahmed.taahir@gmail.com \
--cc=guile-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).