> On 8 Jan 2015, at 01:18, Chris Vine <ch...@cvine.freeserve.co.uk> wrote: > > On Wed, 7 Jan 2015 23:15:07 +0100 > Hans Aberg <haber...@telia.com> wrote: >> >>> On 7 Jan 2015, at 21:24, Ludovic Courtès <l...@gnu.org> wrote: >>> >>> If Scheme code calls C++ code that throws an exception, then the >>> stack will be unwound by libstdc++ and Guile’s ‘dynamic-wind’ >>> handlers and such will not run. >> >> If one tries to pass a C++ exception through Guile code, it will not >> catch in C++ code above it, I think. >> >>> That’s probably the main difficulty. >> >> There is a gcc option, but someone said it does not work well, >> perhaps because any intermediate library and package functions must >> be recompiled as well. > > It may or may not work well with respect to unwinding the stack, but > that misses one half of the point. It won't cause dynwind handlers to > run, whatever recompilation you do.
If you want that, they must be converted somehow. >> Another variation might be compile C as C++, i.e. writing Guile in >> the common C/C++ subset. The Bison skeleton file had that before >> making a genuine C++ one, though it proved too difficult to maintain, >> and in addition, one does not get access to C++ features. >> >>> Likewise when C++ code calls Scheme code. >> >> For this, I made a smob and convert Guile errors to a C++ exception. >> Might be an overhead problem, though. > > It is not just a matter of converting guile exceptions to C++ > exceptions. The issue is that guile propagates its exceptions via long > jumps up the stack, or the equivalent thereof. These will not run > non-trivial destructors for C++ objects taken out of scope by the jump > (and according to the C++ standard, it causes undefined behaviour). Right. > This means that any exception handling has to be localized. > > That is not impossible. There is not that much libguile code needed to > run scheme extension code in a C++ program, if that is what you want to > do. I decided to not pass C++ (non-PODs) objects or exceptions through Guile code. The FAQ I mentioned also deals with how to convert objects to proper C before passing them from C++.