/* Python interface to finish breakpoints
- Copyright (C) 2011-2017 Free Software Foundation, Inc.
+ Copyright (C) 2011-2020 Free Software Foundation, Inc.
This file is part of GDB.
#include "gdbthread.h"
#include "arch-utils.h"
#include "language.h"
-#include "observer.h"
+#include "observable.h"
#include "inferior.h"
#include "block.h"
#include "location.h"
-#include "py-ref.h"
/* Function that is called when a Python finish bp is found out of scope. */
static const char outofscope_func[] = "out_of_scope";
Py_XDECREF (self_bpfinish->function_value);
Py_XDECREF (self_bpfinish->return_type);
Py_XDECREF (self_bpfinish->return_value);
+ Py_TYPE (self)->tp_free (self);
}
/* Triggered when gdbpy_should_stop is about to execute the `stop' callback
if (!self_finishbp->return_type)
return;
- TRY
+ try
{
struct value *function =
value_object_to_value (self_finishbp->function_value);
self_finishbp->return_value = Py_None;
}
}
- CATCH (except, RETURN_MASK_ALL)
+ catch (const gdb_exception &except)
{
gdbpy_convert_exception (except);
gdbpy_print_stack ();
}
- END_CATCH
}
/* Triggered when gdbpy_should_stop has triggered the `stop' callback
bpfinishpy_post_stop_hook (struct gdbpy_breakpoint_object *bp_obj)
{
- TRY
+ try
{
/* Can't delete it here, but it will be removed at the next stop. */
disable_breakpoint (bp_obj->bp);
gdb_assert (bp_obj->bp->disposition == disp_del);
}
- CATCH (except, RETURN_MASK_ALL)
+ catch (const gdb_exception &except)
{
gdbpy_convert_exception (except);
gdbpy_print_stack ();
}
- END_CATCH
}
/* Python function to create a new breakpoint. */
&frame_obj, &internal))
return -1;
- TRY
+ try
{
/* Default frame to newest frame if necessary. */
if (frame_obj == NULL)
}
}
}
- CATCH (except, RETURN_MASK_ALL)
+ catch (const gdb_exception &except)
{
gdbpy_convert_exception (except);
return -1;
}
- END_CATCH
if (PyErr_Occurred ())
return -1;
- thread = ptid_to_global_thread_id (inferior_ptid);
- if (thread == 0)
+ if (inferior_ptid == null_ptid)
{
PyErr_SetString (PyExc_ValueError,
_("No thread currently selected."));
return -1;
}
+ thread = inferior_thread ()->global_num;
+
if (internal)
{
internal_bp = PyObject_IsTrue (internal);
self_bpfinish->return_type = NULL;
self_bpfinish->function_value = NULL;
- TRY
+ try
{
if (get_frame_pc_if_available (frame, &pc))
{
if (function != NULL)
{
struct type *ret_type =
- TYPE_TARGET_TYPE (SYMBOL_TYPE (function));
+ check_typedef (TYPE_TARGET_TYPE (SYMBOL_TYPE (function)));
/* Remember only non-void return types. */
if (TYPE_CODE (ret_type) != TYPE_CODE_VOID)
}
}
}
- CATCH (except, RETURN_MASK_ALL)
+ catch (const gdb_exception &except)
{
/* Just swallow. Either the return type or the function value
remain NULL. */
}
- END_CATCH
if (self_bpfinish->return_type == NULL || self_bpfinish->function_value == NULL)
{
bppy_pending_object->number = -1;
bppy_pending_object->bp = NULL;
- TRY
+ try
{
- struct event_location *location;
- struct cleanup *back_to;
-
/* Set a breakpoint on the return address. */
- location = new_address_location (get_frame_pc (prev_frame), NULL, 0);
- back_to = make_cleanup_delete_event_location (location);
+ event_location_up location
+ = new_address_location (get_frame_pc (prev_frame), NULL, 0);
create_breakpoint (python_gdbarch,
- location, NULL, thread, NULL,
+ location.get (), NULL, thread, NULL,
0,
1 /*temp_flag*/,
bp_breakpoint,
AUTO_BOOLEAN_TRUE,
&bkpt_breakpoint_ops,
0, 1, internal_bp, 0);
- do_cleanups (back_to);
}
- CATCH (except, RETURN_MASK_ALL)
+ catch (const gdb_exception &except)
{
GDB_PY_SET_HANDLE_EXCEPTION (except);
}
- END_CATCH
self_bpfinish->py_bp.bp->frame_id = frame_id;
self_bpfinish->py_bp.is_finish_bp = 1;
/* Callback for `bpfinishpy_detect_out_scope'. Triggers Python's
`B->out_of_scope' function if B is a FinishBreakpoint out of its scope. */
-static int
-bpfinishpy_detect_out_scope_cb (struct breakpoint *b, void *args)
+static bool
+bpfinishpy_detect_out_scope_cb (struct breakpoint *b,
+ struct breakpoint *bp_stopped)
{
- struct breakpoint *bp_stopped = (struct breakpoint *) args;
PyObject *py_bp = (PyObject *) b->py_bp_object;
/* Trigger out_of_scope if this is a FinishBreakpoint and its frame is
/* Check scope if not currently stopped at the FinishBreakpoint. */
if (b != bp_stopped)
{
- TRY
+ try
{
if (b->pspace == current_inferior ()->pspace
&& (!target_has_registers
|| frame_find_by_id (b->frame_id) == NULL))
bpfinishpy_out_of_scope (finish_bp);
}
- CATCH (except, RETURN_MASK_ALL)
+ catch (const gdb_exception &except)
{
gdbpy_convert_exception (except);
gdbpy_print_stack ();
}
- END_CATCH
}
}
{
gdbpy_enter enter_py (get_current_arch (), current_language);
- iterate_over_breakpoints (bpfinishpy_detect_out_scope_cb,
- bs == NULL ? NULL : bs->breakpoint_at);
+ iterate_over_breakpoints ([&] (breakpoint *bp)
+ {
+ return bpfinishpy_detect_out_scope_cb
+ (bp, bs == NULL ? NULL : bs->breakpoint_at);
+ });
}
/* Attached to `exit' notifications, triggers all the necessary out of
{
gdbpy_enter enter_py (target_gdbarch (), current_language);
- iterate_over_breakpoints (bpfinishpy_detect_out_scope_cb, NULL);
+ iterate_over_breakpoints ([&] (breakpoint *bp)
+ {
+ return bpfinishpy_detect_out_scope_cb (bp, nullptr);
+ });
}
/* Initialize the Python finish breakpoint code. */
(PyObject *) &finish_breakpoint_object_type) < 0)
return -1;
- observer_attach_normal_stop (bpfinishpy_handle_stop);
- observer_attach_inferior_exit (bpfinishpy_handle_exit);
+ gdb::observers::normal_stop.attach (bpfinishpy_handle_stop);
+ gdb::observers::inferior_exit.attach (bpfinishpy_handle_exit);
return 0;
}