guile-user
[Top][All Lists]
Advanced

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

Re: C++ wrap


From: Hans Aberg
Subject: Re: C++ wrap
Date: Tue, 23 Feb 2010 15:10:38 +0100

I have experimented with adding C++ exception handling to the wrap. It seems, using gcc, that it works fine, as long as one does not try to pass a C++ exception through a C function call - then it calls the terminate handler.

So add an exception type to Guile which can hold the thrown data, a pair (key . args) with a predicate
  SCM_API int scm_is_exception(SCM x);
When there is an uncaught exception in a C function returning SCM, it should instead return this exception type with the thrown data. (So there would need to be some variable present, changing the behavior of these C-functions.)

Then write a function (object = C++ version of SCM)
  object rethrow(const object& x) {
    if (scm_is_exception(x))
      throw (exception)x;
    else
      return x;
  }

Then just add this rethrow() to the returns that might be an exception:
number operator/(const number& x, const number& y) { return rethrow(scm_divide(x, y)); }
instead of
number operator/(const number& x, const number& y) { return scm_divide(x, y); }

The code should then look normal:
  try {
    integer x = 1, y = 0;
    integer z = x/y;  // exception
  catch (exception& x) {
    out << "Exception: " << x << newline;
  }

I did some code using scm_internal_catch(), but it takes a body function of only one argument:
  SCM body(void *data);
So I guess one has to fiddle around with passing suitable structs using it. - May try it later.

  Hans






reply via email to

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