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. > 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). 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. Chris