diff options
author | Pedro Alves <palves@redhat.com> | 2018-07-18 22:55:59 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2018-07-18 22:55:59 +0100 |
commit | 557e56be2648db13cd5d9876f702ba119ee9e7fd (patch) | |
tree | a2da722f2a8bee10199ad77d940bd3f735a1866f /gdb/guile/scm-frame.c | |
parent | 42dc7699a26be0157c438dcaeb89da38287c6d2d (diff) | |
download | binutils-557e56be2648db13cd5d9876f702ba119ee9e7fd.zip binutils-557e56be2648db13cd5d9876f702ba119ee9e7fd.tar.gz binutils-557e56be2648db13cd5d9876f702ba119ee9e7fd.tar.bz2 |
Eliminate most remaining cleanups under gdb/guile/
The main complication with the Guile code is that we have two types of
exceptions to consider. GDB/C++ exceptions, and Guile/SJLJ
exceptions. Code that is facing the Guile interpreter must not throw
GDB exceptions, instead Scheme exceptions must be thrown. Also,
because Guile exceptions are SJLJ based, Guile-facing code must not
use local objects with dtors, unless wrapped in a scope with a
TRY/CATCH, because the dtors won't otherwise be run when a Guile
exceptions is thrown.
This commit adds a new gdbscm_wrap wrapper function than encapsulates
a pattern I noticed in many of the functions using
GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS. The wrapper is written
such that you can pass either a lambda to it, or a function plus a
variable number of forwarded args. I used a lambda when its body
would be reasonably short, and a separate function in the larger
cases.
This also convers a few functions that were using
GDBSCM_HANDLE_GDB_EXCEPTION to use gdbscm_wrap too because they
followed a similar pattern.
A few cases of make_cleanup calls are replaced with explicit xfree
calls. The make_cleanup/do_cleanups calls in those cases are
pointless, because do_cleanups won't be called when a Scheme exception
is thrown.
We also have a couple cases of Guile-facing code using RAII-type
objects to manage memory, but those are incorrect, exactly because
their dtor won't be called if a Guile exception is thrown.
gdb/ChangeLog:
2018-07-18 Pedro Alves <palves@redhat.com>
* guile/guile-internal.h: Add comment about mixing GDB and Scheme
exceptions.
(GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS): Delete.
(gdbscm_wrap): New.
* guile/scm-frame.c (gdbscm_frame_read_register): Use xfree
directly instead of a cleanup.
* guile/scm-math.c (vlscm_unop_gdbthrow): New, factored out from ...
(vlscm_unop): ... this. Reimplement using gdbscm_wrap.
(vlscm_binop_gdbthrow): New, factored out from ...
(vlscm_binop): ... this. Reimplement using gdbscm_wrap.
(vlscm_rich_compare): Use gdbscm_wrap.
* guile/scm-symbol.c (gdbscm_lookup_symbol): Use xfree directly
instead of a cleanup.
(gdbscm_lookup_global_symbol): Use xfree directly instead of a
cleanup.
* guile/scm-type.c (gdbscm_type_field, gdbscm_type_has_field_p):
Use xfree directly instead of a cleanup.
* guile/scm-value.c (gdbscm_make_value, gdbscm_make_lazy_value):
Adjust to use gdbscm_wrap and scoped_value_mark.
(gdbscm_value_optimized_out_p): Adjust to use gdbscm_wrap.
(gdbscm_value_address, gdbscm_value_dereference)
(gdbscm_value_referenced_value): Adjust to use gdbscm_wrap and
scoped_value_mark.
(gdbscm_value_dynamic_type): Use scoped_value_mark.
(vlscm_do_cast, gdbscm_value_field): Adjust to use gdbscm_wrap and
scoped_value_mark.
(gdbscm_value_subscript, gdbscm_value_call): Adjust to use
gdbscm_wrap and scoped_value_mark.
(gdbscm_value_to_string): Use xfree directly instead of a
cleanup. Move 'buffer' unique_ptr to TRY scope.
(gdbscm_value_to_lazy_string): Use xfree directly instead of a
cleanup. Move 'buffer' unique_ptr to TRY scope. Use
scoped_value_mark.
(gdbscm_value_fetch_lazy_x): Use gdbscm_wrap.
(gdbscm_parse_and_eval): Adjust to use gdbscm_wrap and
scoped_value_mark.
(gdbscm_history_ref, gdbscm_history_append_x): Adjust to use
gdbscm_wrap.
Diffstat (limited to 'gdb/guile/scm-frame.c')
-rw-r--r-- | gdb/guile/scm-frame.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/gdb/guile/scm-frame.c b/gdb/guile/scm-frame.c index 7b53967..afd9702 100644 --- a/gdb/guile/scm-frame.c +++ b/gdb/guile/scm-frame.c @@ -783,13 +783,13 @@ gdbscm_frame_read_register (SCM self, SCM register_scm) char *register_str; struct value *value = NULL; struct frame_info *frame = NULL; - struct cleanup *cleanup; frame_smob *f_smob; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); gdbscm_parse_function_args (FUNC_NAME, SCM_ARG2, NULL, "s", register_scm, ®ister_str); - cleanup = make_cleanup (xfree, register_str); + + struct gdb_exception except = exception_none; TRY { @@ -805,13 +805,14 @@ gdbscm_frame_read_register (SCM self, SCM register_scm) value = value_of_register (regnum, frame); } } - CATCH (except, RETURN_MASK_ALL) + CATCH (ex, RETURN_MASK_ALL) { - GDBSCM_HANDLE_GDB_EXCEPTION (except); + except = ex; } END_CATCH - do_cleanups (cleanup); + xfree (register_str); + GDBSCM_HANDLE_GDB_EXCEPTION (except); if (frame == NULL) { |