/* Python interface to breakpoints
- Copyright (C) 2008-2019 Free Software Foundation, Inc.
+ Copyright (C) 2008-2020 Free Software Foundation, Inc.
This file is part of GDB.
else
disable_breakpoint (self_bp->bp);
}
- catch (const gdb_exception_RETURN_MASK_ALL &except)
+ catch (const gdb_exception &except)
{
GDB_PY_SET_HANDLE_EXCEPTION (except);
}
{
valid_id = valid_task_id (id);
}
- catch (const gdb_exception_RETURN_MASK_ALL &except)
+ catch (const gdb_exception &except)
{
GDB_PY_SET_HANDLE_EXCEPTION (except);
}
{
delete_breakpoint (self_bp->bp);
}
- catch (const gdb_exception_RETURN_MASK_ALL &except)
+ catch (const gdb_exception &except)
{
GDB_PY_HANDLE_EXCEPTION (except);
}
{
set_ignore_count (self_bp->number, (int) value, 0);
}
- catch (const gdb_exception_RETURN_MASK_ALL &except)
+ catch (const gdb_exception &except)
{
GDB_PY_SET_HANDLE_EXCEPTION (except);
}
static PyObject *
bppy_get_location (PyObject *self, void *closure)
{
- const char *str;
gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
BPPY_REQUIRE_VALID (obj);
if (obj->bp->type != bp_breakpoint)
Py_RETURN_NONE;
- struct event_location *location = obj->bp->location.get ();
- /* "catch throw" makes a breakpoint of type bp_breakpoint that does
- not have a location. */
- if (location == nullptr)
- Py_RETURN_NONE;
- str = event_location_to_string (location);
+ const char *str = event_location_to_string (obj->bp->location.get ());
if (! str)
str = "";
return host_string_to_python_string (str).release ();
gdb::unique_xmalloc_ptr<char> exp_holder;
const char *exp = NULL;
gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
- struct gdb_exception except = exception_none;
+ struct gdb_exception except;
BPPY_SET_REQUIRE_VALID (self_bp);
{
set_breakpoint_condition (self_bp->bp, exp, 0);
}
- catch (const gdb_exception_RETURN_MASK_ALL &ex)
+ catch (gdb_exception &ex)
{
- except = ex;
+ except = std::move (ex);
}
GDB_PY_SET_HANDLE_EXCEPTION (except);
{
print_command_lines (current_uiout, breakpoint_commands (bp), 0);
}
- catch (const gdb_exception_RETURN_MASK_ALL &except)
+ catch (const gdb_exception &except)
{
current_uiout->redirect (NULL);
gdbpy_convert_exception (except);
bppy_set_commands (PyObject *self, PyObject *newvalue, void *closure)
{
gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
- struct gdb_exception except = exception_none;
+ struct gdb_exception except;
BPPY_SET_REQUIRE_VALID (self_bp);
counted_command_line lines = read_command_lines_1 (reader, 1, nullptr);
breakpoint_set_commands (self_bp->bp, std::move (lines));
}
- catch (const gdb_exception_RETURN_MASK_ALL &ex)
+ catch (gdb_exception &ex)
{
- except = ex;
+ except = std::move (ex);
}
GDB_PY_SET_HANDLE_EXCEPTION (except);
location = new_explicit_location (&explicit_loc);
}
+ const struct breakpoint_ops *ops =
+ breakpoint_ops_for_event_location (location.get (), false);
+
create_breakpoint (python_gdbarch,
location.get (), NULL, -1, NULL,
0,
temporary_bp, bp_breakpoint,
0,
AUTO_BOOLEAN_TRUE,
- &bkpt_breakpoint_ops,
+ ops,
0, 1, internal_bp, 0);
break;
}
error(_("Do not understand breakpoint type to set."));
}
}
- catch (const gdb_exception_RETURN_MASK_ALL &except)
+ catch (const gdb_exception &except)
{
bppy_pending_object = NULL;
gdbpy_convert_exception (except);
\f
-static int
-build_bp_list (struct breakpoint *b, void *arg)
+static bool
+build_bp_list (struct breakpoint *b, PyObject *list)
{
- PyObject *list = (PyObject *) arg;
PyObject *bp = (PyObject *) b->py_bp_object;
int iserr = 0;
iserr = PyList_Append (list, bp);
if (iserr == -1)
- return 1;
+ return true;
- return 0;
+ return false;
}
/* Static function to return a tuple holding all breakpoints. */
/* If iterate_over_breakpoints returns non NULL it signals an error
condition. In that case abandon building the list and return
NULL. */
- if (iterate_over_breakpoints (build_bp_list, list.get ()) != NULL)
+ auto callback = [&] (breakpoint *bp)
+ {
+ return build_bp_list(bp, list.get ());
+ };
+ if (iterate_over_breakpoints (callback) != NULL)
return NULL;
return PyList_AsTuple (list.get ());
gdbpy_breakpoint_created (struct breakpoint *bp)
{
gdbpy_breakpoint_object *newbp;
- PyGILState_STATE state;
if (!user_breakpoint_p (bp) && bppy_pending_object == NULL)
return;
&& bp->type != bp_access_watchpoint)
return;
- state = PyGILState_Ensure ();
+ struct gdbarch *garch = bp->gdbarch ? bp->gdbarch : get_current_arch ();
+ gdbpy_enter enter_py (garch, current_language);
if (bppy_pending_object)
{
newbp = bppy_pending_object;
+ Py_INCREF (newbp);
bppy_pending_object = NULL;
}
else
newbp->bp = bp;
newbp->bp->py_bp_object = newbp;
newbp->is_finish_bp = 0;
- Py_INCREF (newbp);
++bppy_live;
}
else
gdb_py_events.breakpoint_created) < 0)
gdbpy_print_stack ();
}
-
- PyGILState_Release (state);
}
/* Callback that is used when a breakpoint is deleted. This will
gdbpy_breakpoint_deleted (struct breakpoint *b)
{
int num = b->number;
- PyGILState_STATE state;
struct breakpoint *bp = NULL;
- state = PyGILState_Ensure ();
bp = get_breakpoint (num);
if (bp)
{
+ struct gdbarch *garch = bp->gdbarch ? bp->gdbarch : get_current_arch ();
+ gdbpy_enter enter_py (garch, current_language);
+
gdbpy_ref<gdbpy_breakpoint_object> bp_obj (bp->py_bp_object);
if (bp_obj != NULL)
{
--bppy_live;
}
}
- PyGILState_Release (state);
}
/* Callback that is used when a breakpoint is modified. */
gdbpy_breakpoint_modified (struct breakpoint *b)
{
int num = b->number;
- PyGILState_STATE state;
struct breakpoint *bp = NULL;
- state = PyGILState_Ensure ();
bp = get_breakpoint (num);
if (bp)
{
+ struct gdbarch *garch = bp->gdbarch ? bp->gdbarch : get_current_arch ();
+ gdbpy_enter enter_py (garch, current_language);
+
PyObject *bp_obj = (PyObject *) bp->py_bp_object;
if (bp_obj)
{
}
}
}
- PyGILState_Release (state);
}
\f