Implement tp_richcompare for gdb.Block
[binutils-gdb.git] / gdb / guile / guile-internal.h
blobbe16fee0dd254f775c8554c0c7e0d54c058f7620
1 /* Internal header for GDB/Scheme code.
3 Copyright (C) 2014-2024 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 #ifndef GUILE_GUILE_INTERNAL_H
21 #define GUILE_GUILE_INTERNAL_H
23 /* See README file in this directory for implementation notes, coding
24 conventions, et.al. */
27 #include "hashtab.h"
28 #include "extension-priv.h"
29 #include "symtab.h"
30 #include "libguile.h"
31 #include "objfiles.h"
32 #include "top.h"
34 struct block;
35 struct frame_info;
36 struct objfile;
37 struct symbol;
39 /* A function to pass to the safe-call routines to ignore things like
40 memory errors. */
41 typedef int excp_matcher_func (SCM key);
43 /* Scheme variables to define during initialization. */
45 struct scheme_variable
47 const char *name;
48 SCM value;
49 const char *doc_string;
52 /* End of scheme_variable table mark. */
54 #define END_VARIABLES { NULL, SCM_BOOL_F, NULL }
56 /* Although scm_t_subr is meant to hold a function pointer, at least
57 in some versions of guile, it is actually a typedef to "void *".
58 That means that in C++, an explicit cast is necessary to convert
59 function pointer to scm_t_subr. But a cast also makes it possible
60 to pass function pointers with the wrong type by mistake. So
61 instead of adding such casts throughout, we use 'as_a_scm_t_subr'
62 to do the conversion, which (only) has overloads for function
63 pointer types that are valid.
65 See https://lists.gnu.org/archive/html/guile-devel/2013-03/msg00001.html.
68 static inline scm_t_subr
69 as_a_scm_t_subr (SCM (*func) (void))
71 return (scm_t_subr) func;
74 static inline scm_t_subr
75 as_a_scm_t_subr (SCM (*func) (SCM))
77 return (scm_t_subr) func;
80 static inline scm_t_subr
81 as_a_scm_t_subr (SCM (*func) (SCM, SCM))
83 return (scm_t_subr) func;
86 static inline scm_t_subr
87 as_a_scm_t_subr (SCM (*func) (SCM, SCM, SCM))
89 return (scm_t_subr) func;
92 /* Scheme functions to define during initialization. */
94 struct scheme_function
96 const char *name;
97 int required;
98 int optional;
99 int rest;
100 scm_t_subr func;
101 const char *doc_string;
104 /* End of scheme_function table mark. */
106 #define END_FUNCTIONS { NULL, 0, 0, 0, NULL, NULL }
108 /* Useful for defining a set of constants. */
110 struct scheme_integer_constant
112 const char *name;
113 int value;
116 #define END_INTEGER_CONSTANTS { NULL, 0 }
118 /* Pass this instead of 0 to routines like SCM_ASSERT to indicate the value
119 is not a function argument. */
120 #define GDBSCM_ARG_NONE 0
122 /* Ensure new code doesn't accidentally try to use this. */
123 #undef scm_make_smob_type
124 #define scm_make_smob_type USE_gdbscm_make_smob_type_INSTEAD
126 /* They brought over () == #f from lisp.
127 Let's avoid that for now. */
128 #undef scm_is_bool
129 #undef scm_is_false
130 #undef scm_is_true
131 #define scm_is_bool USE_gdbscm_is_bool_INSTEAD
132 #define scm_is_false USE_gdbscm_is_false_INSTEAD
133 #define scm_is_true USE_gdbscm_is_true_INSTEAD
134 #define gdbscm_is_bool(scm) \
135 (scm_is_eq ((scm), SCM_BOOL_F) || scm_is_eq ((scm), SCM_BOOL_T))
136 #define gdbscm_is_false(scm) scm_is_eq ((scm), SCM_BOOL_F)
137 #define gdbscm_is_true(scm) (!gdbscm_is_false (scm))
139 #ifndef HAVE_SCM_NEW_SMOB
141 /* Guile <= 2.0.5 did not provide this function, so provide it here. */
143 static inline SCM
144 scm_new_smob (scm_t_bits tc, scm_t_bits data)
146 SCM_RETURN_NEWSMOB (tc, data);
149 #endif
151 /* Function name that is passed around in case an error needs to be reported.
152 __func is in C99, but we provide a wrapper "just in case",
153 and because FUNC_NAME is the canonical value used in guile sources.
154 IWBN to use the Scheme version of the name (e.g. foo-bar vs foo_bar),
155 but let's KISS for now. */
156 #define FUNC_NAME __func__
158 extern const char gdbscm_module_name[];
159 extern const char gdbscm_init_module_name[];
161 extern int gdb_scheme_initialized;
163 extern int gdbscm_guile_major_version;
164 extern int gdbscm_guile_minor_version;
165 extern int gdbscm_guile_micro_version;
167 extern const char gdbscm_print_excp_none[];
168 extern const char gdbscm_print_excp_full[];
169 extern const char gdbscm_print_excp_message[];
170 extern const char *gdbscm_print_excp;
172 extern SCM gdbscm_documentation_symbol;
173 extern SCM gdbscm_invalid_object_error_symbol;
175 extern SCM gdbscm_map_string;
176 extern SCM gdbscm_array_string;
177 extern SCM gdbscm_string_string;
179 /* scm-utils.c */
181 extern void gdbscm_define_variables (const scheme_variable *, int is_public);
183 extern void gdbscm_define_functions (const scheme_function *, int is_public);
185 extern void gdbscm_define_integer_constants (const scheme_integer_constant *,
186 int is_public);
188 extern void gdbscm_printf (SCM port, const char *format, ...)
189 ATTRIBUTE_PRINTF (2, 3);
191 extern void gdbscm_debug_display (SCM obj);
193 extern void gdbscm_debug_write (SCM obj);
195 extern void gdbscm_parse_function_args (const char *function_name,
196 int beginning_arg_pos,
197 const SCM *keywords,
198 const char *format, ...);
200 extern SCM gdbscm_scm_from_longest (LONGEST l);
202 extern LONGEST gdbscm_scm_to_longest (SCM l);
204 extern SCM gdbscm_scm_from_ulongest (ULONGEST l);
206 extern ULONGEST gdbscm_scm_to_ulongest (SCM u);
208 extern void gdbscm_dynwind_xfree (void *ptr);
210 extern int gdbscm_is_procedure (SCM proc);
212 extern char *gdbscm_gc_xstrdup (const char *);
214 extern const char * const *gdbscm_gc_dup_argv (char **argv);
216 extern int gdbscm_guile_version_is_at_least (int major, int minor, int micro);
218 /* GDB smobs, from scm-gsmob.c */
220 /* All gdb smobs must contain one of the following as the first member:
221 gdb_smob, chained_gdb_smob, or eqable_gdb_smob.
223 Chained GDB smobs should have chained_gdb_smob as their first member. The
224 next,prev members of chained_gdb_smob allow for chaining gsmobs together so
225 that, for example, when an objfile is deleted we can clean up all smobs that
226 reference it.
228 Eq-able GDB smobs should have eqable_gdb_smob as their first member. The
229 containing_scm member of eqable_gdb_smob allows for returning the same gsmob
230 instead of creating a new one, allowing them to be eq?-able.
232 All other smobs should have gdb_smob as their first member.
233 FIXME: dje/2014-05-26: gdb_smob was useful during early development as a
234 "baseclass" for all gdb smobs. If it's still unused by gdb 8.0 delete it.
236 IMPORTANT: chained_gdb_smob and eqable_gdb-smob are "subclasses" of
237 gdb_smob. The layout of chained_gdb_smob,eqable_gdb_smob must match
238 gdb_smob as if it is a subclass. To that end we use macro GDB_SMOB_HEAD
239 to ensure this. */
241 #define GDB_SMOB_HEAD \
242 int empty_base_class;
244 struct gdb_smob
246 GDB_SMOB_HEAD
249 struct chained_gdb_smob
251 GDB_SMOB_HEAD
253 chained_gdb_smob *prev;
254 chained_gdb_smob *next;
257 struct eqable_gdb_smob
259 GDB_SMOB_HEAD
261 /* The object we are contained in.
262 This can be used for several purposes.
263 This is used by the eq? machinery: We need to be able to see if we have
264 already created an object for a symbol, and if so use that SCM.
265 This may also be used to protect the smob from GC if there is
266 a reference to this smob from outside of GC space (i.e., from gdb).
267 This can also be used in place of chained_gdb_smob where we need to
268 keep track of objfile referencing objects. When the objfile is deleted
269 we need to invalidate the objects: we can do that using the same hashtab
270 used to record the smob for eq-ability. */
271 SCM containing_scm;
274 #undef GDB_SMOB_HEAD
276 struct objfile;
278 /* A predicate that returns non-zero if an object is a particular kind
279 of gsmob. */
280 typedef int (gsmob_pred_func) (SCM);
282 extern scm_t_bits gdbscm_make_smob_type (const char *name, size_t size);
284 extern void gdbscm_init_gsmob (gdb_smob *base);
286 extern void gdbscm_init_chained_gsmob (chained_gdb_smob *base);
288 extern void gdbscm_init_eqable_gsmob (eqable_gdb_smob *base,
289 SCM containing_scm);
291 extern htab_t gdbscm_create_eqable_gsmob_ptr_map (htab_hash hash_fn,
292 htab_eq eq_fn);
294 extern eqable_gdb_smob **gdbscm_find_eqable_gsmob_ptr_slot
295 (htab_t htab, eqable_gdb_smob *base);
297 extern void gdbscm_fill_eqable_gsmob_ptr_slot (eqable_gdb_smob **slot,
298 eqable_gdb_smob *base);
300 extern void gdbscm_clear_eqable_gsmob_ptr_slot (htab_t htab,
301 eqable_gdb_smob *base);
303 /* Exceptions and calling out to Guile. */
305 /* scm-exception.c */
307 extern SCM gdbscm_make_exception (SCM tag, SCM args);
309 extern int gdbscm_is_exception (SCM scm);
311 extern SCM gdbscm_exception_key (SCM excp);
313 extern SCM gdbscm_exception_args (SCM excp);
315 extern SCM gdbscm_make_exception_with_stack (SCM key, SCM args, SCM stack);
317 extern SCM gdbscm_make_error_scm (SCM key, SCM subr, SCM message,
318 SCM args, SCM data);
320 extern SCM gdbscm_make_error (SCM key, const char *subr, const char *message,
321 SCM args, SCM data);
323 extern SCM gdbscm_make_type_error (const char *subr, int arg_pos,
324 SCM bad_value, const char *expected_type);
326 extern SCM gdbscm_make_invalid_object_error (const char *subr, int arg_pos,
327 SCM bad_value, const char *error);
329 extern void gdbscm_invalid_object_error (const char *subr, int arg_pos,
330 SCM bad_value, const char *error)
331 ATTRIBUTE_NORETURN;
333 extern SCM gdbscm_make_out_of_range_error (const char *subr, int arg_pos,
334 SCM bad_value, const char *error);
336 extern void gdbscm_out_of_range_error (const char *subr, int arg_pos,
337 SCM bad_value, const char *error)
338 ATTRIBUTE_NORETURN;
340 extern SCM gdbscm_make_misc_error (const char *subr, int arg_pos,
341 SCM bad_value, const char *error);
343 extern void gdbscm_misc_error (const char *subr, int arg_pos,
344 SCM bad_value, const char *error)
345 ATTRIBUTE_NORETURN;
347 extern void gdbscm_throw (SCM exception) ATTRIBUTE_NORETURN;
349 struct gdbscm_gdb_exception;
350 extern SCM gdbscm_scm_from_gdb_exception
351 (const gdbscm_gdb_exception &exception);
353 extern void gdbscm_throw_gdb_exception (gdbscm_gdb_exception exception)
354 ATTRIBUTE_NORETURN;
356 extern void gdbscm_print_exception_with_stack (SCM port, SCM stack,
357 SCM key, SCM args);
359 extern void gdbscm_print_gdb_exception (SCM port, SCM exception);
361 extern gdb::unique_xmalloc_ptr<char> gdbscm_exception_message_to_string
362 (SCM exception);
364 extern excp_matcher_func gdbscm_memory_error_p;
366 extern excp_matcher_func gdbscm_user_error_p;
368 extern SCM gdbscm_make_memory_error (const char *subr, const char *msg,
369 SCM args);
371 extern void gdbscm_memory_error (const char *subr, const char *msg, SCM args)
372 ATTRIBUTE_NORETURN;
374 /* scm-safe-call.c */
376 extern const char *gdbscm_with_guile (const char *(*func) (void *), void *data);
378 extern SCM gdbscm_call_guile (SCM (*func) (void *), void *data,
379 excp_matcher_func *ok_excps);
381 extern SCM gdbscm_safe_call_0 (SCM proc, excp_matcher_func *ok_excps);
383 extern SCM gdbscm_safe_call_1 (SCM proc, SCM arg0,
384 excp_matcher_func *ok_excps);
386 extern SCM gdbscm_safe_call_2 (SCM proc, SCM arg0, SCM arg1,
387 excp_matcher_func *ok_excps);
389 extern SCM gdbscm_safe_call_3 (SCM proc, SCM arg0, SCM arg1, SCM arg2,
390 excp_matcher_func *ok_excps);
392 extern SCM gdbscm_safe_call_4 (SCM proc, SCM arg0, SCM arg1, SCM arg2,
393 SCM arg3,
394 excp_matcher_func *ok_excps);
396 extern SCM gdbscm_safe_apply_1 (SCM proc, SCM arg0, SCM args,
397 excp_matcher_func *ok_excps);
399 extern SCM gdbscm_unsafe_call_1 (SCM proc, SCM arg0);
401 extern gdb::unique_xmalloc_ptr<char> gdbscm_safe_eval_string
402 (const char *string, int display_result);
404 extern gdb::unique_xmalloc_ptr<char> gdbscm_safe_source_script
405 (const char *filename);
407 extern void gdbscm_enter_repl (void);
409 /* Interface to various GDB objects, in alphabetical order. */
411 /* scm-arch.c */
413 struct arch_smob;
415 extern struct gdbarch *arscm_get_gdbarch (arch_smob *a_smob);
417 extern arch_smob *arscm_get_arch_smob_arg_unsafe (SCM arch_scm, int arg_pos,
418 const char *func_name);
420 extern SCM arscm_scm_from_arch (struct gdbarch *gdbarch);
422 /* scm-block.c */
424 extern SCM bkscm_scm_from_block (const struct block *block,
425 struct objfile *objfile);
427 extern const struct block *bkscm_scm_to_block
428 (SCM block_scm, int arg_pos, const char *func_name, SCM *excp);
430 /* scm-cmd.c */
432 extern char *gdbscm_parse_command_name (const char *name,
433 const char *func_name, int arg_pos,
434 struct cmd_list_element ***base_list,
435 struct cmd_list_element **start_list);
437 extern int gdbscm_valid_command_class_p (int command_class);
439 extern char *gdbscm_canonicalize_command_name (const char *name,
440 int want_trailing_space);
442 /* scm-frame.c */
444 struct frame_smob;
446 extern int frscm_is_frame (SCM scm);
448 extern frame_smob *frscm_get_frame_smob_arg_unsafe (SCM frame_scm, int arg_pos,
449 const char *func_name);
451 extern struct frame_info_ptr frscm_frame_smob_to_frame (frame_smob *);
453 /* scm-iterator.c */
455 struct iterator_smob;
457 extern SCM itscm_iterator_smob_object (iterator_smob *i_smob);
459 extern SCM itscm_iterator_smob_progress (iterator_smob *i_smob);
461 extern void itscm_set_iterator_smob_progress_x (iterator_smob *i_smob,
462 SCM progress);
464 extern const char *itscm_iterator_smob_name (void);
466 extern SCM gdbscm_make_iterator (SCM object, SCM progress, SCM next);
468 extern int itscm_is_iterator (SCM scm);
470 extern SCM gdbscm_end_of_iteration (void);
472 extern int itscm_is_end_of_iteration (SCM obj);
474 extern SCM itscm_safe_call_next_x (SCM iter, excp_matcher_func *ok_excps);
476 extern SCM itscm_get_iterator_arg_unsafe (SCM self, int arg_pos,
477 const char *func_name);
479 /* scm-lazy-string.c */
481 extern int lsscm_is_lazy_string (SCM scm);
483 extern SCM lsscm_make_lazy_string (CORE_ADDR address, int length,
484 const char *encoding, struct type *type);
486 extern struct value *lsscm_safe_lazy_string_to_value (SCM string,
487 int arg_pos,
488 const char *func_name,
489 SCM *except_scmp);
491 extern void lsscm_val_print_lazy_string
492 (SCM string, struct ui_file *stream,
493 const struct value_print_options *options);
495 /* scm-objfile.c */
497 struct objfile_smob;
499 extern SCM ofscm_objfile_smob_pretty_printers (objfile_smob *o_smob);
501 extern objfile_smob *ofscm_objfile_smob_from_objfile (struct objfile *objfile);
503 extern SCM ofscm_scm_from_objfile (struct objfile *objfile);
505 /* scm-progspace.c */
507 struct pspace_smob;
509 extern SCM psscm_pspace_smob_pretty_printers (const pspace_smob *);
511 extern pspace_smob *psscm_pspace_smob_from_pspace (struct program_space *);
513 extern SCM psscm_scm_from_pspace (struct program_space *);
515 /* scm-string.c */
517 extern int gdbscm_scm_string_to_int (SCM string);
519 extern gdb::unique_xmalloc_ptr<char> gdbscm_scm_to_c_string (SCM string);
521 extern SCM gdbscm_scm_from_c_string (const char *string);
523 extern SCM gdbscm_scm_from_printf (const char *format, ...)
524 ATTRIBUTE_PRINTF (1, 2);
526 extern gdb::unique_xmalloc_ptr<char> gdbscm_scm_to_string
527 (SCM string, size_t *lenp, const char *charset, int strict, SCM *except_scmp);
529 extern SCM gdbscm_scm_from_string (const char *string, size_t len,
530 const char *charset, int strict);
532 extern gdb::unique_xmalloc_ptr<char> gdbscm_scm_to_host_string
533 (SCM string, size_t *lenp, SCM *except);
535 extern SCM gdbscm_scm_from_host_string (const char *string, size_t len);
537 /* scm-symbol.c */
539 extern int syscm_is_symbol (SCM scm);
541 extern SCM syscm_scm_from_symbol (struct symbol *symbol);
543 extern struct symbol *syscm_get_valid_symbol_arg_unsafe
544 (SCM self, int arg_pos, const char *func_name);
546 /* scm-symtab.c */
548 extern SCM stscm_scm_from_symtab (struct symtab *symtab);
550 extern SCM stscm_scm_from_sal (struct symtab_and_line sal);
552 /* scm-type.c */
554 struct type_smob;
556 extern int tyscm_is_type (SCM scm);
558 extern SCM tyscm_scm_from_type (struct type *type);
560 extern type_smob *tyscm_get_type_smob_arg_unsafe (SCM type_scm, int arg_pos,
561 const char *func_name);
563 extern struct type *tyscm_scm_to_type (SCM t_scm);
565 extern struct type *tyscm_type_smob_type (type_smob *t_smob);
567 extern SCM tyscm_scm_from_field (SCM type_scm, int field_num);
569 /* scm-value.c */
571 extern struct value *vlscm_scm_to_value (SCM scm);
573 extern int vlscm_is_value (SCM scm);
575 extern SCM vlscm_scm_from_value (struct value *value);
576 extern SCM vlscm_scm_from_value_no_release (struct value *value);
578 extern struct value *vlscm_convert_typed_value_from_scheme
579 (const char *func_name, int obj_arg_pos, SCM obj,
580 int type_arg_pos, SCM type_scm, struct type *type, SCM *except_scmp,
581 struct gdbarch *gdbarch, const struct language_defn *language);
583 extern struct value *vlscm_convert_value_from_scheme
584 (const char *func_name, int obj_arg_pos, SCM obj, SCM *except_scmp,
585 struct gdbarch *gdbarch, const struct language_defn *language);
587 /* stript_lang methods */
589 extern objfile_script_sourcer_func gdbscm_source_objfile_script;
590 extern objfile_script_executor_func gdbscm_execute_objfile_script;
592 /* Return true if auto-loading Guile scripts is enabled.
593 This is the extension_language_script_ops.auto_load_enabled "method". */
595 extern bool gdbscm_auto_load_enabled (const struct extension_language_defn *);
597 extern void gdbscm_preserve_values
598 (const struct extension_language_defn *,
599 struct objfile *, htab_t copied_types);
601 extern enum ext_lang_rc gdbscm_apply_val_pretty_printer
602 (const struct extension_language_defn *,
603 struct value *val,
604 struct ui_file *stream, int recurse,
605 const struct value_print_options *options,
606 const struct language_defn *language);
608 extern int gdbscm_breakpoint_has_cond (const struct extension_language_defn *,
609 struct breakpoint *b);
611 extern enum ext_lang_bp_stop gdbscm_breakpoint_cond_says_stop
612 (const struct extension_language_defn *, struct breakpoint *b);
614 /* Initializers for each piece of Scheme support, in alphabetical order. */
616 extern void gdbscm_initialize_arches (void);
617 extern void gdbscm_initialize_auto_load (void);
618 extern void gdbscm_initialize_blocks (void);
619 extern void gdbscm_initialize_breakpoints (void);
620 extern void gdbscm_initialize_commands (void);
621 extern void gdbscm_initialize_disasm (void);
622 extern void gdbscm_initialize_exceptions (void);
623 extern void gdbscm_initialize_frames (void);
624 extern void gdbscm_initialize_iterators (void);
625 extern void gdbscm_initialize_lazy_strings (void);
626 extern void gdbscm_initialize_math (void);
627 extern void gdbscm_initialize_objfiles (void);
628 extern void gdbscm_initialize_pretty_printers (void);
629 extern void gdbscm_initialize_parameters (void);
630 extern void gdbscm_initialize_ports (void);
631 extern void gdbscm_initialize_pspaces (void);
632 extern void gdbscm_initialize_smobs (void);
633 extern void gdbscm_initialize_strings (void);
634 extern void gdbscm_initialize_symbols (void);
635 extern void gdbscm_initialize_symtabs (void);
636 extern void gdbscm_initialize_types (void);
637 extern void gdbscm_initialize_values (void);
640 /* A complication with the Guile code is that we have two types of
641 exceptions to consider. GDB/C++ exceptions, and Guile/SJLJ
642 exceptions. Code that is facing the Guile interpreter must not
643 throw GDB exceptions, instead Scheme exceptions must be thrown.
644 Also, because Guile exceptions are SJLJ based, Guile-facing code
645 must not use local objects with dtors, unless wrapped in a scope
646 with a TRY/CATCH, because the dtors won't otherwise be run when a
647 Guile exceptions is thrown. */
649 /* This is a destructor-less clone of gdb_exception. */
651 struct gdbscm_gdb_exception
653 enum return_reason reason;
654 enum errors error;
655 /* The message is xmalloc'd. */
656 char *message;
659 /* Return a gdbscm_gdb_exception representing EXC. */
661 inline gdbscm_gdb_exception
662 unpack (const gdb_exception &exc)
664 gdbscm_gdb_exception result;
665 result.reason = exc.reason;
666 result.error = exc.error;
667 if (exc.message == nullptr)
668 result.message = nullptr;
669 else
670 result.message = xstrdup (exc.message->c_str ());
671 /* The message should be NULL iff the reason is zero. */
672 gdb_assert ((result.reason == 0) == (result.message == nullptr));
673 return result;
676 /* Use this after a TRY/CATCH to throw the appropriate Scheme
677 exception if a GDB error occurred. */
679 #define GDBSCM_HANDLE_GDB_EXCEPTION(exception) \
680 do { \
681 if (exception.reason < 0) \
683 gdbscm_throw_gdb_exception (exception); \
684 /*NOTREACHED */ \
686 } while (0)
688 /* Use this to wrap a callable to throw the appropriate Scheme
689 exception if the callable throws a GDB error. ARGS are forwarded
690 to FUNC. Returns the result of FUNC, unless FUNC returns a Scheme
691 exception, in which case that exception is thrown. Note that while
692 the callable is free to use objects of types with destructors,
693 because GDB errors are C++ exceptions, the caller of gdbscm_wrap
694 must not use such objects, because their destructors would not be
695 called when a Scheme exception is thrown. */
697 template<typename Function, typename... Args>
699 gdbscm_wrap (Function &&func, Args &&... args)
701 SCM result = SCM_BOOL_F;
702 gdbscm_gdb_exception exc {};
706 result = func (std::forward<Args> (args)...);
708 catch (const gdb_exception_forced_quit &e)
710 quit_force (NULL, 0);
712 catch (const gdb_exception &except)
714 exc = unpack (except);
717 GDBSCM_HANDLE_GDB_EXCEPTION (exc);
719 if (gdbscm_is_exception (result))
720 gdbscm_throw (result);
722 return result;
725 #endif /* GUILE_GUILE_INTERNAL_H */