guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Prototype for C++-compatible Guile Exceptions.


From: Taahir Ahmed
Subject: Prototype for C++-compatible Guile Exceptions.
Date: Tue, 14 Jul 2015 13:07:26 -0500

I'm posting these patches to feel out the likelihood of this approach to
C++ exception compatibility ever getting adopted into Guile.  They still
need some work in terms of function documentation, and one test failure.

----------------------------------------------------------------------

Currently, the use of libguile functions from C++ is fraught with
danger.  C++ destructors are not triggered by guile exceptions, and the
dynwind mechanism is ill-suited for application to C++ data structures
(in particular, STL structures).

In my experience, writing a C++ function that takes data from guile code
in a truly safe manner roughly doubles the required amount of code,
because of the generally-required pattern:

    // ...

    // Some code to check that a SCM really is an int.
    int dummy = scm_to_int(my_scm);

    // Below this point, no guile exceptions may be thrown.

    // Now, we can create a std::vector, or what-have-you, and put our
    // int into it.

    std::vector<int> my_vector;
    my_vector.push_back(scm_to_int(my_scm));

    // ...

This sequence of patches addresses this shortcoming by using hidden C++
exceptions to perform the stack unwinding when a guile exception is
thrown, so that the pre-checking demonstrated above is not needed.

# How is this implemented?

This sequence of patches does four things:

  - Enables autotools C++ support.

  - Adds -fexceptions to the compiler command line to enable C++
    exceptions to traverse C stack frames.

  - Adds extern "C" guards to the internal libguile headers.

  - Adds a single C++ source file to libguile that contains set/longjmp
    workalikes for prompt and exception handling.  Prompt and
    exception-related uses of set/longjmp are replaced with these
    functions. (This is the third patch, and the real meat of the work).

# What are the downsides of this prototype implementation?

The use of -fexceptions and a C++ source file limit the choice of
compiler.  GCC, Clang, and ICC should be fine.  I have no idea about
some of the more esoteric compilers.

On most platforms, -fexceptions entails some space overhead.  In my
testing, libguile gets bumped from 4.8 MiB to about 5 MiB.

The last two test cases in test-out-of-memory ("the kicker" and "ouch")
fail.  I'm still investigating the root cause.  All other tests pass.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]