1c50c785cSJohn Marino /* Python interface to breakpoints
2c50c785cSJohn Marino
3*ef5ccd6cSJohn Marino Copyright (C) 2008-2013 Free Software Foundation, Inc.
4c50c785cSJohn Marino
5c50c785cSJohn Marino This file is part of GDB.
6c50c785cSJohn Marino
7c50c785cSJohn Marino This program is free software; you can redistribute it and/or modify
8c50c785cSJohn Marino it under the terms of the GNU General Public License as published by
9c50c785cSJohn Marino the Free Software Foundation; either version 3 of the License, or
10c50c785cSJohn Marino (at your option) any later version.
11c50c785cSJohn Marino
12c50c785cSJohn Marino This program is distributed in the hope that it will be useful,
13c50c785cSJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of
14c50c785cSJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15c50c785cSJohn Marino GNU General Public License for more details.
16c50c785cSJohn Marino
17c50c785cSJohn Marino You should have received a copy of the GNU General Public License
18c50c785cSJohn Marino along with this program. If not, see <http://www.gnu.org/licenses/>. */
19c50c785cSJohn Marino
20c50c785cSJohn Marino #include "defs.h"
21c50c785cSJohn Marino #include "value.h"
22c50c785cSJohn Marino #include "exceptions.h"
23c50c785cSJohn Marino #include "python-internal.h"
24*ef5ccd6cSJohn Marino #include "python.h"
25c50c785cSJohn Marino #include "charset.h"
26c50c785cSJohn Marino #include "breakpoint.h"
27c50c785cSJohn Marino #include "gdbcmd.h"
28c50c785cSJohn Marino #include "gdbthread.h"
29c50c785cSJohn Marino #include "observer.h"
30c50c785cSJohn Marino #include "cli/cli-script.h"
31c50c785cSJohn Marino #include "ada-lang.h"
32c50c785cSJohn Marino #include "arch-utils.h"
33c50c785cSJohn Marino #include "language.h"
34c50c785cSJohn Marino
35c50c785cSJohn Marino /* Number of live breakpoints. */
36c50c785cSJohn Marino static int bppy_live;
37c50c785cSJohn Marino
38c50c785cSJohn Marino /* Variables used to pass information between the Breakpoint
39c50c785cSJohn Marino constructor and the breakpoint-created hook function. */
40a45ae5f8SJohn Marino breakpoint_object *bppy_pending_object;
41c50c785cSJohn Marino
42c50c785cSJohn Marino /* Function that is called when a Python condition is evaluated. */
43c50c785cSJohn Marino static char * const stop_func = "stop";
44c50c785cSJohn Marino
45c50c785cSJohn Marino /* This is used to initialize various gdb.bp_* constants. */
46c50c785cSJohn Marino struct pybp_code
47c50c785cSJohn Marino {
48c50c785cSJohn Marino /* The name. */
49c50c785cSJohn Marino const char *name;
50c50c785cSJohn Marino /* The code. */
51*ef5ccd6cSJohn Marino int code;
52c50c785cSJohn Marino };
53c50c785cSJohn Marino
54c50c785cSJohn Marino /* Entries related to the type of user set breakpoints. */
55c50c785cSJohn Marino static struct pybp_code pybp_codes[] =
56c50c785cSJohn Marino {
57c50c785cSJohn Marino { "BP_NONE", bp_none},
58c50c785cSJohn Marino { "BP_BREAKPOINT", bp_breakpoint},
59c50c785cSJohn Marino { "BP_WATCHPOINT", bp_watchpoint},
60c50c785cSJohn Marino { "BP_HARDWARE_WATCHPOINT", bp_hardware_watchpoint},
61c50c785cSJohn Marino { "BP_READ_WATCHPOINT", bp_read_watchpoint},
62c50c785cSJohn Marino { "BP_ACCESS_WATCHPOINT", bp_access_watchpoint},
63c50c785cSJohn Marino {NULL} /* Sentinel. */
64c50c785cSJohn Marino };
65c50c785cSJohn Marino
66c50c785cSJohn Marino /* Entries related to the type of watchpoint. */
67c50c785cSJohn Marino static struct pybp_code pybp_watch_types[] =
68c50c785cSJohn Marino {
69c50c785cSJohn Marino { "WP_READ", hw_read},
70c50c785cSJohn Marino { "WP_WRITE", hw_write},
71c50c785cSJohn Marino { "WP_ACCESS", hw_access},
72c50c785cSJohn Marino {NULL} /* Sentinel. */
73c50c785cSJohn Marino };
74c50c785cSJohn Marino
75c50c785cSJohn Marino /* Python function which checks the validity of a breakpoint object. */
76c50c785cSJohn Marino static PyObject *
bppy_is_valid(PyObject * self,PyObject * args)77c50c785cSJohn Marino bppy_is_valid (PyObject *self, PyObject *args)
78c50c785cSJohn Marino {
79c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
80c50c785cSJohn Marino
81c50c785cSJohn Marino if (self_bp->bp)
82c50c785cSJohn Marino Py_RETURN_TRUE;
83c50c785cSJohn Marino Py_RETURN_FALSE;
84c50c785cSJohn Marino }
85c50c785cSJohn Marino
86c50c785cSJohn Marino /* Python function to test whether or not the breakpoint is enabled. */
87c50c785cSJohn Marino static PyObject *
bppy_get_enabled(PyObject * self,void * closure)88c50c785cSJohn Marino bppy_get_enabled (PyObject *self, void *closure)
89c50c785cSJohn Marino {
90c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
91c50c785cSJohn Marino
92c50c785cSJohn Marino BPPY_REQUIRE_VALID (self_bp);
93c50c785cSJohn Marino if (! self_bp->bp)
94c50c785cSJohn Marino Py_RETURN_FALSE;
95c50c785cSJohn Marino if (self_bp->bp->enable_state == bp_enabled)
96c50c785cSJohn Marino Py_RETURN_TRUE;
97c50c785cSJohn Marino Py_RETURN_FALSE;
98c50c785cSJohn Marino }
99c50c785cSJohn Marino
100c50c785cSJohn Marino /* Python function to test whether or not the breakpoint is silent. */
101c50c785cSJohn Marino static PyObject *
bppy_get_silent(PyObject * self,void * closure)102c50c785cSJohn Marino bppy_get_silent (PyObject *self, void *closure)
103c50c785cSJohn Marino {
104c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
105c50c785cSJohn Marino
106c50c785cSJohn Marino BPPY_REQUIRE_VALID (self_bp);
107c50c785cSJohn Marino if (self_bp->bp->silent)
108c50c785cSJohn Marino Py_RETURN_TRUE;
109c50c785cSJohn Marino Py_RETURN_FALSE;
110c50c785cSJohn Marino }
111c50c785cSJohn Marino
112c50c785cSJohn Marino /* Python function to set the enabled state of a breakpoint. */
113c50c785cSJohn Marino static int
bppy_set_enabled(PyObject * self,PyObject * newvalue,void * closure)114c50c785cSJohn Marino bppy_set_enabled (PyObject *self, PyObject *newvalue, void *closure)
115c50c785cSJohn Marino {
116c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
117c50c785cSJohn Marino int cmp;
118a45ae5f8SJohn Marino volatile struct gdb_exception except;
119c50c785cSJohn Marino
120c50c785cSJohn Marino BPPY_SET_REQUIRE_VALID (self_bp);
121c50c785cSJohn Marino
122c50c785cSJohn Marino if (newvalue == NULL)
123c50c785cSJohn Marino {
124c50c785cSJohn Marino PyErr_SetString (PyExc_TypeError,
125c50c785cSJohn Marino _("Cannot delete `enabled' attribute."));
126c50c785cSJohn Marino
127c50c785cSJohn Marino return -1;
128c50c785cSJohn Marino }
129c50c785cSJohn Marino else if (! PyBool_Check (newvalue))
130c50c785cSJohn Marino {
131c50c785cSJohn Marino PyErr_SetString (PyExc_TypeError,
132c50c785cSJohn Marino _("The value of `enabled' must be a boolean."));
133c50c785cSJohn Marino return -1;
134c50c785cSJohn Marino }
135c50c785cSJohn Marino
136c50c785cSJohn Marino cmp = PyObject_IsTrue (newvalue);
137c50c785cSJohn Marino if (cmp < 0)
138c50c785cSJohn Marino return -1;
139a45ae5f8SJohn Marino
140a45ae5f8SJohn Marino TRY_CATCH (except, RETURN_MASK_ALL)
141a45ae5f8SJohn Marino {
142a45ae5f8SJohn Marino if (cmp == 1)
143c50c785cSJohn Marino enable_breakpoint (self_bp->bp);
144c50c785cSJohn Marino else
145c50c785cSJohn Marino disable_breakpoint (self_bp->bp);
146a45ae5f8SJohn Marino }
147a45ae5f8SJohn Marino GDB_PY_SET_HANDLE_EXCEPTION (except);
148a45ae5f8SJohn Marino
149c50c785cSJohn Marino return 0;
150c50c785cSJohn Marino }
151c50c785cSJohn Marino
152c50c785cSJohn Marino /* Python function to set the 'silent' state of a breakpoint. */
153c50c785cSJohn Marino static int
bppy_set_silent(PyObject * self,PyObject * newvalue,void * closure)154c50c785cSJohn Marino bppy_set_silent (PyObject *self, PyObject *newvalue, void *closure)
155c50c785cSJohn Marino {
156c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
157c50c785cSJohn Marino int cmp;
158c50c785cSJohn Marino
159c50c785cSJohn Marino BPPY_SET_REQUIRE_VALID (self_bp);
160c50c785cSJohn Marino
161c50c785cSJohn Marino if (newvalue == NULL)
162c50c785cSJohn Marino {
163c50c785cSJohn Marino PyErr_SetString (PyExc_TypeError,
164c50c785cSJohn Marino _("Cannot delete `silent' attribute."));
165c50c785cSJohn Marino return -1;
166c50c785cSJohn Marino }
167c50c785cSJohn Marino else if (! PyBool_Check (newvalue))
168c50c785cSJohn Marino {
169c50c785cSJohn Marino PyErr_SetString (PyExc_TypeError,
170c50c785cSJohn Marino _("The value of `silent' must be a boolean."));
171c50c785cSJohn Marino return -1;
172c50c785cSJohn Marino }
173c50c785cSJohn Marino
174c50c785cSJohn Marino cmp = PyObject_IsTrue (newvalue);
175c50c785cSJohn Marino if (cmp < 0)
176c50c785cSJohn Marino return -1;
177c50c785cSJohn Marino else
178c50c785cSJohn Marino breakpoint_set_silent (self_bp->bp, cmp);
179c50c785cSJohn Marino
180c50c785cSJohn Marino return 0;
181c50c785cSJohn Marino }
182c50c785cSJohn Marino
183c50c785cSJohn Marino /* Python function to set the thread of a breakpoint. */
184c50c785cSJohn Marino static int
bppy_set_thread(PyObject * self,PyObject * newvalue,void * closure)185c50c785cSJohn Marino bppy_set_thread (PyObject *self, PyObject *newvalue, void *closure)
186c50c785cSJohn Marino {
187c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
188c50c785cSJohn Marino long id;
189c50c785cSJohn Marino
190c50c785cSJohn Marino BPPY_SET_REQUIRE_VALID (self_bp);
191c50c785cSJohn Marino
192c50c785cSJohn Marino if (newvalue == NULL)
193c50c785cSJohn Marino {
194c50c785cSJohn Marino PyErr_SetString (PyExc_TypeError,
195c50c785cSJohn Marino _("Cannot delete `thread' attribute."));
196c50c785cSJohn Marino return -1;
197c50c785cSJohn Marino }
198c50c785cSJohn Marino else if (PyInt_Check (newvalue))
199c50c785cSJohn Marino {
200c50c785cSJohn Marino if (! gdb_py_int_as_long (newvalue, &id))
201c50c785cSJohn Marino return -1;
202c50c785cSJohn Marino
203c50c785cSJohn Marino if (! valid_thread_id (id))
204c50c785cSJohn Marino {
205c50c785cSJohn Marino PyErr_SetString (PyExc_RuntimeError,
206c50c785cSJohn Marino _("Invalid thread ID."));
207c50c785cSJohn Marino return -1;
208c50c785cSJohn Marino }
209c50c785cSJohn Marino }
210c50c785cSJohn Marino else if (newvalue == Py_None)
211c50c785cSJohn Marino id = -1;
212c50c785cSJohn Marino else
213c50c785cSJohn Marino {
214c50c785cSJohn Marino PyErr_SetString (PyExc_TypeError,
215c50c785cSJohn Marino _("The value of `thread' must be an integer or None."));
216c50c785cSJohn Marino return -1;
217c50c785cSJohn Marino }
218c50c785cSJohn Marino
219c50c785cSJohn Marino breakpoint_set_thread (self_bp->bp, id);
220c50c785cSJohn Marino
221c50c785cSJohn Marino return 0;
222c50c785cSJohn Marino }
223c50c785cSJohn Marino
224c50c785cSJohn Marino /* Python function to set the (Ada) task of a breakpoint. */
225c50c785cSJohn Marino static int
bppy_set_task(PyObject * self,PyObject * newvalue,void * closure)226c50c785cSJohn Marino bppy_set_task (PyObject *self, PyObject *newvalue, void *closure)
227c50c785cSJohn Marino {
228c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
229c50c785cSJohn Marino long id;
230a45ae5f8SJohn Marino int valid_id = 0;
231a45ae5f8SJohn Marino volatile struct gdb_exception except;
232c50c785cSJohn Marino
233c50c785cSJohn Marino BPPY_SET_REQUIRE_VALID (self_bp);
234c50c785cSJohn Marino
235c50c785cSJohn Marino if (newvalue == NULL)
236c50c785cSJohn Marino {
237c50c785cSJohn Marino PyErr_SetString (PyExc_TypeError,
238c50c785cSJohn Marino _("Cannot delete `task' attribute."));
239c50c785cSJohn Marino return -1;
240c50c785cSJohn Marino }
241c50c785cSJohn Marino else if (PyInt_Check (newvalue))
242c50c785cSJohn Marino {
243c50c785cSJohn Marino if (! gdb_py_int_as_long (newvalue, &id))
244c50c785cSJohn Marino return -1;
245c50c785cSJohn Marino
246a45ae5f8SJohn Marino TRY_CATCH (except, RETURN_MASK_ALL)
247a45ae5f8SJohn Marino {
248a45ae5f8SJohn Marino valid_id = valid_task_id (id);
249a45ae5f8SJohn Marino }
250a45ae5f8SJohn Marino GDB_PY_SET_HANDLE_EXCEPTION (except);
251a45ae5f8SJohn Marino
252a45ae5f8SJohn Marino if (! valid_id)
253c50c785cSJohn Marino {
254c50c785cSJohn Marino PyErr_SetString (PyExc_RuntimeError,
255c50c785cSJohn Marino _("Invalid task ID."));
256c50c785cSJohn Marino return -1;
257c50c785cSJohn Marino }
258c50c785cSJohn Marino }
259c50c785cSJohn Marino else if (newvalue == Py_None)
260c50c785cSJohn Marino id = 0;
261c50c785cSJohn Marino else
262c50c785cSJohn Marino {
263c50c785cSJohn Marino PyErr_SetString (PyExc_TypeError,
264c50c785cSJohn Marino _("The value of `task' must be an integer or None."));
265c50c785cSJohn Marino return -1;
266c50c785cSJohn Marino }
267c50c785cSJohn Marino
268c50c785cSJohn Marino breakpoint_set_task (self_bp->bp, id);
269c50c785cSJohn Marino
270c50c785cSJohn Marino return 0;
271c50c785cSJohn Marino }
272c50c785cSJohn Marino
273c50c785cSJohn Marino /* Python function which deletes the underlying GDB breakpoint. This
274c50c785cSJohn Marino triggers the breakpoint_deleted observer which will call
275c50c785cSJohn Marino gdbpy_breakpoint_deleted; that function cleans up the Python
276c50c785cSJohn Marino sections. */
277c50c785cSJohn Marino
278c50c785cSJohn Marino static PyObject *
bppy_delete_breakpoint(PyObject * self,PyObject * args)279c50c785cSJohn Marino bppy_delete_breakpoint (PyObject *self, PyObject *args)
280c50c785cSJohn Marino {
281c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
282a45ae5f8SJohn Marino volatile struct gdb_exception except;
283c50c785cSJohn Marino
284c50c785cSJohn Marino BPPY_REQUIRE_VALID (self_bp);
285c50c785cSJohn Marino
286a45ae5f8SJohn Marino TRY_CATCH (except, RETURN_MASK_ALL)
287a45ae5f8SJohn Marino {
288c50c785cSJohn Marino delete_breakpoint (self_bp->bp);
289a45ae5f8SJohn Marino }
290a45ae5f8SJohn Marino GDB_PY_HANDLE_EXCEPTION (except);
291c50c785cSJohn Marino
292c50c785cSJohn Marino Py_RETURN_NONE;
293c50c785cSJohn Marino }
294c50c785cSJohn Marino
295c50c785cSJohn Marino
296c50c785cSJohn Marino /* Python function to set the ignore count of a breakpoint. */
297c50c785cSJohn Marino static int
bppy_set_ignore_count(PyObject * self,PyObject * newvalue,void * closure)298c50c785cSJohn Marino bppy_set_ignore_count (PyObject *self, PyObject *newvalue, void *closure)
299c50c785cSJohn Marino {
300c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
301c50c785cSJohn Marino long value;
302a45ae5f8SJohn Marino volatile struct gdb_exception except;
303c50c785cSJohn Marino
304c50c785cSJohn Marino BPPY_SET_REQUIRE_VALID (self_bp);
305c50c785cSJohn Marino
306c50c785cSJohn Marino if (newvalue == NULL)
307c50c785cSJohn Marino {
308c50c785cSJohn Marino PyErr_SetString (PyExc_TypeError,
309c50c785cSJohn Marino _("Cannot delete `ignore_count' attribute."));
310c50c785cSJohn Marino return -1;
311c50c785cSJohn Marino }
312c50c785cSJohn Marino else if (! PyInt_Check (newvalue))
313c50c785cSJohn Marino {
314c50c785cSJohn Marino PyErr_SetString (PyExc_TypeError,
315c50c785cSJohn Marino _("The value of `ignore_count' must be an integer."));
316c50c785cSJohn Marino return -1;
317c50c785cSJohn Marino }
318c50c785cSJohn Marino
319c50c785cSJohn Marino if (! gdb_py_int_as_long (newvalue, &value))
320c50c785cSJohn Marino return -1;
321c50c785cSJohn Marino
322c50c785cSJohn Marino if (value < 0)
323c50c785cSJohn Marino value = 0;
324a45ae5f8SJohn Marino
325a45ae5f8SJohn Marino TRY_CATCH (except, RETURN_MASK_ALL)
326a45ae5f8SJohn Marino {
327c50c785cSJohn Marino set_ignore_count (self_bp->number, (int) value, 0);
328a45ae5f8SJohn Marino }
329a45ae5f8SJohn Marino GDB_PY_SET_HANDLE_EXCEPTION (except);
330c50c785cSJohn Marino
331c50c785cSJohn Marino return 0;
332c50c785cSJohn Marino }
333c50c785cSJohn Marino
334c50c785cSJohn Marino /* Python function to set the hit count of a breakpoint. */
335c50c785cSJohn Marino static int
bppy_set_hit_count(PyObject * self,PyObject * newvalue,void * closure)336c50c785cSJohn Marino bppy_set_hit_count (PyObject *self, PyObject *newvalue, void *closure)
337c50c785cSJohn Marino {
338c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
339c50c785cSJohn Marino
340c50c785cSJohn Marino BPPY_SET_REQUIRE_VALID (self_bp);
341c50c785cSJohn Marino
342c50c785cSJohn Marino if (newvalue == NULL)
343c50c785cSJohn Marino {
344c50c785cSJohn Marino PyErr_SetString (PyExc_TypeError,
345c50c785cSJohn Marino _("Cannot delete `hit_count' attribute."));
346c50c785cSJohn Marino return -1;
347c50c785cSJohn Marino }
348c50c785cSJohn Marino else
349c50c785cSJohn Marino {
350c50c785cSJohn Marino long value;
351c50c785cSJohn Marino
352c50c785cSJohn Marino if (! gdb_py_int_as_long (newvalue, &value))
353c50c785cSJohn Marino return -1;
354c50c785cSJohn Marino
355c50c785cSJohn Marino if (value != 0)
356c50c785cSJohn Marino {
357c50c785cSJohn Marino PyErr_SetString (PyExc_AttributeError,
358c50c785cSJohn Marino _("The value of `hit_count' must be zero."));
359c50c785cSJohn Marino return -1;
360c50c785cSJohn Marino }
361c50c785cSJohn Marino }
362c50c785cSJohn Marino
363c50c785cSJohn Marino self_bp->bp->hit_count = 0;
364c50c785cSJohn Marino
365c50c785cSJohn Marino return 0;
366c50c785cSJohn Marino }
367c50c785cSJohn Marino
368c50c785cSJohn Marino /* Python function to get the location of a breakpoint. */
369c50c785cSJohn Marino static PyObject *
bppy_get_location(PyObject * self,void * closure)370c50c785cSJohn Marino bppy_get_location (PyObject *self, void *closure)
371c50c785cSJohn Marino {
372c50c785cSJohn Marino char *str;
373c50c785cSJohn Marino breakpoint_object *obj = (breakpoint_object *) self;
374c50c785cSJohn Marino
375c50c785cSJohn Marino BPPY_REQUIRE_VALID (obj);
376c50c785cSJohn Marino
377c50c785cSJohn Marino if (obj->bp->type != bp_breakpoint)
378c50c785cSJohn Marino Py_RETURN_NONE;
379c50c785cSJohn Marino
380c50c785cSJohn Marino str = obj->bp->addr_string;
381c50c785cSJohn Marino
382c50c785cSJohn Marino if (! str)
383c50c785cSJohn Marino str = "";
384c50c785cSJohn Marino return PyString_Decode (str, strlen (str), host_charset (), NULL);
385c50c785cSJohn Marino }
386c50c785cSJohn Marino
387c50c785cSJohn Marino /* Python function to get the breakpoint expression. */
388c50c785cSJohn Marino static PyObject *
bppy_get_expression(PyObject * self,void * closure)389c50c785cSJohn Marino bppy_get_expression (PyObject *self, void *closure)
390c50c785cSJohn Marino {
391c50c785cSJohn Marino char *str;
392c50c785cSJohn Marino breakpoint_object *obj = (breakpoint_object *) self;
393a45ae5f8SJohn Marino struct watchpoint *wp;
394c50c785cSJohn Marino
395c50c785cSJohn Marino BPPY_REQUIRE_VALID (obj);
396c50c785cSJohn Marino
397a45ae5f8SJohn Marino if (!is_watchpoint (obj->bp))
398c50c785cSJohn Marino Py_RETURN_NONE;
399c50c785cSJohn Marino
400a45ae5f8SJohn Marino wp = (struct watchpoint *) obj->bp;
401a45ae5f8SJohn Marino
402a45ae5f8SJohn Marino str = wp->exp_string;
403c50c785cSJohn Marino if (! str)
404c50c785cSJohn Marino str = "";
405c50c785cSJohn Marino
406c50c785cSJohn Marino return PyString_Decode (str, strlen (str), host_charset (), NULL);
407c50c785cSJohn Marino }
408c50c785cSJohn Marino
409c50c785cSJohn Marino /* Python function to get the condition expression of a breakpoint. */
410c50c785cSJohn Marino static PyObject *
bppy_get_condition(PyObject * self,void * closure)411c50c785cSJohn Marino bppy_get_condition (PyObject *self, void *closure)
412c50c785cSJohn Marino {
413c50c785cSJohn Marino char *str;
414c50c785cSJohn Marino breakpoint_object *obj = (breakpoint_object *) self;
415c50c785cSJohn Marino
416c50c785cSJohn Marino BPPY_REQUIRE_VALID (obj);
417c50c785cSJohn Marino
418c50c785cSJohn Marino str = obj->bp->cond_string;
419c50c785cSJohn Marino if (! str)
420c50c785cSJohn Marino Py_RETURN_NONE;
421c50c785cSJohn Marino
422c50c785cSJohn Marino return PyString_Decode (str, strlen (str), host_charset (), NULL);
423c50c785cSJohn Marino }
424c50c785cSJohn Marino
425c50c785cSJohn Marino /* Returns 0 on success. Returns -1 on error, with a python exception set.
426c50c785cSJohn Marino */
427c50c785cSJohn Marino
428c50c785cSJohn Marino static int
bppy_set_condition(PyObject * self,PyObject * newvalue,void * closure)429c50c785cSJohn Marino bppy_set_condition (PyObject *self, PyObject *newvalue, void *closure)
430c50c785cSJohn Marino {
431c50c785cSJohn Marino char *exp;
432c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
433c50c785cSJohn Marino volatile struct gdb_exception except;
434c50c785cSJohn Marino
435c50c785cSJohn Marino BPPY_SET_REQUIRE_VALID (self_bp);
436c50c785cSJohn Marino
437c50c785cSJohn Marino if (newvalue == NULL)
438c50c785cSJohn Marino {
439c50c785cSJohn Marino PyErr_SetString (PyExc_TypeError,
440c50c785cSJohn Marino _("Cannot delete `condition' attribute."));
441c50c785cSJohn Marino return -1;
442c50c785cSJohn Marino }
443c50c785cSJohn Marino else if (newvalue == Py_None)
444c50c785cSJohn Marino exp = "";
445c50c785cSJohn Marino else
446c50c785cSJohn Marino {
447c50c785cSJohn Marino exp = python_string_to_host_string (newvalue);
448c50c785cSJohn Marino if (exp == NULL)
449c50c785cSJohn Marino return -1;
450c50c785cSJohn Marino }
451c50c785cSJohn Marino
452c50c785cSJohn Marino TRY_CATCH (except, RETURN_MASK_ALL)
453c50c785cSJohn Marino {
454c50c785cSJohn Marino set_breakpoint_condition (self_bp->bp, exp, 0);
455c50c785cSJohn Marino }
456c50c785cSJohn Marino
457c50c785cSJohn Marino if (newvalue != Py_None)
458c50c785cSJohn Marino xfree (exp);
459c50c785cSJohn Marino
460c50c785cSJohn Marino GDB_PY_SET_HANDLE_EXCEPTION (except);
461c50c785cSJohn Marino
462c50c785cSJohn Marino return 0;
463c50c785cSJohn Marino }
464c50c785cSJohn Marino
465c50c785cSJohn Marino /* Python function to get the commands attached to a breakpoint. */
466c50c785cSJohn Marino static PyObject *
bppy_get_commands(PyObject * self,void * closure)467c50c785cSJohn Marino bppy_get_commands (PyObject *self, void *closure)
468c50c785cSJohn Marino {
469c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
470c50c785cSJohn Marino struct breakpoint *bp = self_bp->bp;
471c50c785cSJohn Marino long length;
472c50c785cSJohn Marino volatile struct gdb_exception except;
473c50c785cSJohn Marino struct ui_file *string_file;
474c50c785cSJohn Marino struct cleanup *chain;
475c50c785cSJohn Marino PyObject *result;
476c50c785cSJohn Marino char *cmdstr;
477c50c785cSJohn Marino
478c50c785cSJohn Marino BPPY_REQUIRE_VALID (self_bp);
479c50c785cSJohn Marino
480c50c785cSJohn Marino if (! self_bp->bp->commands)
481c50c785cSJohn Marino Py_RETURN_NONE;
482c50c785cSJohn Marino
483c50c785cSJohn Marino string_file = mem_fileopen ();
484c50c785cSJohn Marino chain = make_cleanup_ui_file_delete (string_file);
485c50c785cSJohn Marino
486a45ae5f8SJohn Marino ui_out_redirect (current_uiout, string_file);
487c50c785cSJohn Marino TRY_CATCH (except, RETURN_MASK_ALL)
488c50c785cSJohn Marino {
489a45ae5f8SJohn Marino print_command_lines (current_uiout, breakpoint_commands (bp), 0);
490c50c785cSJohn Marino }
491a45ae5f8SJohn Marino ui_out_redirect (current_uiout, NULL);
492c50c785cSJohn Marino GDB_PY_HANDLE_EXCEPTION (except);
493c50c785cSJohn Marino
494c50c785cSJohn Marino cmdstr = ui_file_xstrdup (string_file, &length);
495c50c785cSJohn Marino make_cleanup (xfree, cmdstr);
496c50c785cSJohn Marino result = PyString_Decode (cmdstr, strlen (cmdstr), host_charset (), NULL);
497c50c785cSJohn Marino do_cleanups (chain);
498c50c785cSJohn Marino return result;
499c50c785cSJohn Marino }
500c50c785cSJohn Marino
501c50c785cSJohn Marino /* Python function to get the breakpoint type. */
502c50c785cSJohn Marino static PyObject *
bppy_get_type(PyObject * self,void * closure)503c50c785cSJohn Marino bppy_get_type (PyObject *self, void *closure)
504c50c785cSJohn Marino {
505c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
506c50c785cSJohn Marino
507c50c785cSJohn Marino BPPY_REQUIRE_VALID (self_bp);
508c50c785cSJohn Marino
509c50c785cSJohn Marino return PyInt_FromLong (self_bp->bp->type);
510c50c785cSJohn Marino }
511c50c785cSJohn Marino
512c50c785cSJohn Marino /* Python function to get the visibility of the breakpoint. */
513c50c785cSJohn Marino
514c50c785cSJohn Marino static PyObject *
bppy_get_visibility(PyObject * self,void * closure)515c50c785cSJohn Marino bppy_get_visibility (PyObject *self, void *closure)
516c50c785cSJohn Marino {
517c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
518c50c785cSJohn Marino
519c50c785cSJohn Marino BPPY_REQUIRE_VALID (self_bp);
520c50c785cSJohn Marino
521c50c785cSJohn Marino if (self_bp->bp->number < 0)
522c50c785cSJohn Marino Py_RETURN_FALSE;
523c50c785cSJohn Marino
524c50c785cSJohn Marino Py_RETURN_TRUE;
525c50c785cSJohn Marino }
526c50c785cSJohn Marino
527c50c785cSJohn Marino /* Python function to get the breakpoint's number. */
528c50c785cSJohn Marino static PyObject *
bppy_get_number(PyObject * self,void * closure)529c50c785cSJohn Marino bppy_get_number (PyObject *self, void *closure)
530c50c785cSJohn Marino {
531c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
532c50c785cSJohn Marino
533c50c785cSJohn Marino BPPY_REQUIRE_VALID (self_bp);
534c50c785cSJohn Marino
535c50c785cSJohn Marino return PyInt_FromLong (self_bp->number);
536c50c785cSJohn Marino }
537c50c785cSJohn Marino
538c50c785cSJohn Marino /* Python function to get the breakpoint's thread ID. */
539c50c785cSJohn Marino static PyObject *
bppy_get_thread(PyObject * self,void * closure)540c50c785cSJohn Marino bppy_get_thread (PyObject *self, void *closure)
541c50c785cSJohn Marino {
542c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
543c50c785cSJohn Marino
544c50c785cSJohn Marino BPPY_REQUIRE_VALID (self_bp);
545c50c785cSJohn Marino
546c50c785cSJohn Marino if (self_bp->bp->thread == -1)
547c50c785cSJohn Marino Py_RETURN_NONE;
548c50c785cSJohn Marino
549c50c785cSJohn Marino return PyInt_FromLong (self_bp->bp->thread);
550c50c785cSJohn Marino }
551c50c785cSJohn Marino
552c50c785cSJohn Marino /* Python function to get the breakpoint's task ID (in Ada). */
553c50c785cSJohn Marino static PyObject *
bppy_get_task(PyObject * self,void * closure)554c50c785cSJohn Marino bppy_get_task (PyObject *self, void *closure)
555c50c785cSJohn Marino {
556c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
557c50c785cSJohn Marino
558c50c785cSJohn Marino BPPY_REQUIRE_VALID (self_bp);
559c50c785cSJohn Marino
560c50c785cSJohn Marino if (self_bp->bp->task == 0)
561c50c785cSJohn Marino Py_RETURN_NONE;
562c50c785cSJohn Marino
563c50c785cSJohn Marino return PyInt_FromLong (self_bp->bp->task);
564c50c785cSJohn Marino }
565c50c785cSJohn Marino
566c50c785cSJohn Marino /* Python function to get the breakpoint's hit count. */
567c50c785cSJohn Marino static PyObject *
bppy_get_hit_count(PyObject * self,void * closure)568c50c785cSJohn Marino bppy_get_hit_count (PyObject *self, void *closure)
569c50c785cSJohn Marino {
570c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
571c50c785cSJohn Marino
572c50c785cSJohn Marino BPPY_REQUIRE_VALID (self_bp);
573c50c785cSJohn Marino
574c50c785cSJohn Marino return PyInt_FromLong (self_bp->bp->hit_count);
575c50c785cSJohn Marino }
576c50c785cSJohn Marino
577c50c785cSJohn Marino /* Python function to get the breakpoint's ignore count. */
578c50c785cSJohn Marino static PyObject *
bppy_get_ignore_count(PyObject * self,void * closure)579c50c785cSJohn Marino bppy_get_ignore_count (PyObject *self, void *closure)
580c50c785cSJohn Marino {
581c50c785cSJohn Marino breakpoint_object *self_bp = (breakpoint_object *) self;
582c50c785cSJohn Marino
583c50c785cSJohn Marino BPPY_REQUIRE_VALID (self_bp);
584c50c785cSJohn Marino
585c50c785cSJohn Marino return PyInt_FromLong (self_bp->bp->ignore_count);
586c50c785cSJohn Marino }
587c50c785cSJohn Marino
588c50c785cSJohn Marino /* Python function to create a new breakpoint. */
589c50c785cSJohn Marino static int
bppy_init(PyObject * self,PyObject * args,PyObject * kwargs)590c50c785cSJohn Marino bppy_init (PyObject *self, PyObject *args, PyObject *kwargs)
591c50c785cSJohn Marino {
592c50c785cSJohn Marino static char *keywords[] = { "spec", "type", "wp_class", "internal", NULL };
593a45ae5f8SJohn Marino const char *spec;
594c50c785cSJohn Marino int type = bp_breakpoint;
595c50c785cSJohn Marino int access_type = hw_write;
596c50c785cSJohn Marino PyObject *internal = NULL;
597c50c785cSJohn Marino int internal_bp = 0;
598c50c785cSJohn Marino volatile struct gdb_exception except;
599c50c785cSJohn Marino
600c50c785cSJohn Marino if (! PyArg_ParseTupleAndKeywords (args, kwargs, "s|iiO", keywords,
601c50c785cSJohn Marino &spec, &type, &access_type, &internal))
602c50c785cSJohn Marino return -1;
603c50c785cSJohn Marino
604c50c785cSJohn Marino if (internal)
605c50c785cSJohn Marino {
606c50c785cSJohn Marino internal_bp = PyObject_IsTrue (internal);
607c50c785cSJohn Marino if (internal_bp == -1)
608c50c785cSJohn Marino return -1;
609c50c785cSJohn Marino }
610c50c785cSJohn Marino
611c50c785cSJohn Marino bppy_pending_object = (breakpoint_object *) self;
612c50c785cSJohn Marino bppy_pending_object->number = -1;
613c50c785cSJohn Marino bppy_pending_object->bp = NULL;
614c50c785cSJohn Marino
615c50c785cSJohn Marino TRY_CATCH (except, RETURN_MASK_ALL)
616c50c785cSJohn Marino {
617a45ae5f8SJohn Marino char *copy = xstrdup (spec);
618a45ae5f8SJohn Marino struct cleanup *cleanup = make_cleanup (xfree, copy);
619a45ae5f8SJohn Marino
620c50c785cSJohn Marino switch (type)
621c50c785cSJohn Marino {
622c50c785cSJohn Marino case bp_breakpoint:
623c50c785cSJohn Marino {
624c50c785cSJohn Marino create_breakpoint (python_gdbarch,
625*ef5ccd6cSJohn Marino copy, NULL, -1, NULL,
626c50c785cSJohn Marino 0,
627c50c785cSJohn Marino 0, bp_breakpoint,
628c50c785cSJohn Marino 0,
629c50c785cSJohn Marino AUTO_BOOLEAN_TRUE,
630a45ae5f8SJohn Marino &bkpt_breakpoint_ops,
631a45ae5f8SJohn Marino 0, 1, internal_bp, 0);
632c50c785cSJohn Marino break;
633c50c785cSJohn Marino }
634c50c785cSJohn Marino case bp_watchpoint:
635c50c785cSJohn Marino {
636c50c785cSJohn Marino if (access_type == hw_write)
637a45ae5f8SJohn Marino watch_command_wrapper (copy, 0, internal_bp);
638c50c785cSJohn Marino else if (access_type == hw_access)
639a45ae5f8SJohn Marino awatch_command_wrapper (copy, 0, internal_bp);
640c50c785cSJohn Marino else if (access_type == hw_read)
641a45ae5f8SJohn Marino rwatch_command_wrapper (copy, 0, internal_bp);
642c50c785cSJohn Marino else
643c50c785cSJohn Marino error(_("Cannot understand watchpoint access type."));
644c50c785cSJohn Marino break;
645c50c785cSJohn Marino }
646c50c785cSJohn Marino default:
647c50c785cSJohn Marino error(_("Do not understand breakpoint type to set."));
648c50c785cSJohn Marino }
649a45ae5f8SJohn Marino
650a45ae5f8SJohn Marino do_cleanups (cleanup);
651c50c785cSJohn Marino }
652c50c785cSJohn Marino if (except.reason < 0)
653c50c785cSJohn Marino {
654c50c785cSJohn Marino PyErr_Format (except.reason == RETURN_QUIT
655c50c785cSJohn Marino ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
656c50c785cSJohn Marino "%s", except.message);
657c50c785cSJohn Marino return -1;
658c50c785cSJohn Marino }
659c50c785cSJohn Marino
660c50c785cSJohn Marino BPPY_SET_REQUIRE_VALID ((breakpoint_object *) self);
661c50c785cSJohn Marino return 0;
662c50c785cSJohn Marino }
663c50c785cSJohn Marino
664c50c785cSJohn Marino
665c50c785cSJohn Marino
666c50c785cSJohn Marino static int
build_bp_list(struct breakpoint * b,void * arg)667c50c785cSJohn Marino build_bp_list (struct breakpoint *b, void *arg)
668c50c785cSJohn Marino {
669c50c785cSJohn Marino PyObject *list = arg;
670c50c785cSJohn Marino PyObject *bp = (PyObject *) b->py_bp_object;
671c50c785cSJohn Marino int iserr = 0;
672c50c785cSJohn Marino
673c50c785cSJohn Marino /* Not all breakpoints will have a companion Python object.
674c50c785cSJohn Marino Only breakpoints that were created via bppy_new, or
675c50c785cSJohn Marino breakpoints that were created externally and are tracked by
676c50c785cSJohn Marino the Python Scripting API. */
677c50c785cSJohn Marino if (bp)
678c50c785cSJohn Marino iserr = PyList_Append (list, bp);
679c50c785cSJohn Marino
680c50c785cSJohn Marino if (iserr == -1)
681c50c785cSJohn Marino return 1;
682c50c785cSJohn Marino
683c50c785cSJohn Marino return 0;
684c50c785cSJohn Marino }
685c50c785cSJohn Marino
686c50c785cSJohn Marino /* Static function to return a tuple holding all breakpoints. */
687c50c785cSJohn Marino
688c50c785cSJohn Marino PyObject *
gdbpy_breakpoints(PyObject * self,PyObject * args)689c50c785cSJohn Marino gdbpy_breakpoints (PyObject *self, PyObject *args)
690c50c785cSJohn Marino {
691a45ae5f8SJohn Marino PyObject *list, *tuple;
692c50c785cSJohn Marino
693c50c785cSJohn Marino if (bppy_live == 0)
694c50c785cSJohn Marino Py_RETURN_NONE;
695c50c785cSJohn Marino
696c50c785cSJohn Marino list = PyList_New (0);
697c50c785cSJohn Marino if (!list)
698c50c785cSJohn Marino return NULL;
699c50c785cSJohn Marino
700c50c785cSJohn Marino /* If iteratre_over_breakpoints returns non NULL it signals an error
701c50c785cSJohn Marino condition. In that case abandon building the list and return
702c50c785cSJohn Marino NULL. */
703c50c785cSJohn Marino if (iterate_over_breakpoints (build_bp_list, list) != NULL)
704c50c785cSJohn Marino {
705c50c785cSJohn Marino Py_DECREF (list);
706c50c785cSJohn Marino return NULL;
707c50c785cSJohn Marino }
708c50c785cSJohn Marino
709a45ae5f8SJohn Marino tuple = PyList_AsTuple (list);
710a45ae5f8SJohn Marino Py_DECREF (list);
711a45ae5f8SJohn Marino
712a45ae5f8SJohn Marino return tuple;
713c50c785cSJohn Marino }
714c50c785cSJohn Marino
715c50c785cSJohn Marino /* Call the "stop" method (if implemented) in the breakpoint
716c50c785cSJohn Marino class. If the method returns True, the inferior will be
717c50c785cSJohn Marino stopped at the breakpoint. Otherwise the inferior will be
718c50c785cSJohn Marino allowed to continue. */
719c50c785cSJohn Marino
720c50c785cSJohn Marino int
gdbpy_should_stop(struct breakpoint_object * bp_obj)721c50c785cSJohn Marino gdbpy_should_stop (struct breakpoint_object *bp_obj)
722c50c785cSJohn Marino {
723c50c785cSJohn Marino int stop = 1;
724c50c785cSJohn Marino
725c50c785cSJohn Marino PyObject *py_bp = (PyObject *) bp_obj;
726c50c785cSJohn Marino struct breakpoint *b = bp_obj->bp;
727c50c785cSJohn Marino struct gdbarch *garch = b->gdbarch ? b->gdbarch : get_current_arch ();
728c50c785cSJohn Marino struct cleanup *cleanup = ensure_python_env (garch, current_language);
729c50c785cSJohn Marino
730a45ae5f8SJohn Marino if (bp_obj->is_finish_bp)
731a45ae5f8SJohn Marino bpfinishpy_pre_stop_hook (bp_obj);
732a45ae5f8SJohn Marino
733c50c785cSJohn Marino if (PyObject_HasAttrString (py_bp, stop_func))
734c50c785cSJohn Marino {
735c50c785cSJohn Marino PyObject *result = PyObject_CallMethod (py_bp, stop_func, NULL);
736c50c785cSJohn Marino
737c50c785cSJohn Marino if (result)
738c50c785cSJohn Marino {
739c50c785cSJohn Marino int evaluate = PyObject_IsTrue (result);
740c50c785cSJohn Marino
741c50c785cSJohn Marino if (evaluate == -1)
742c50c785cSJohn Marino gdbpy_print_stack ();
743c50c785cSJohn Marino
744c50c785cSJohn Marino /* If the "stop" function returns False that means
745c50c785cSJohn Marino the Python breakpoint wants GDB to continue. */
746c50c785cSJohn Marino if (! evaluate)
747c50c785cSJohn Marino stop = 0;
748c50c785cSJohn Marino
749c50c785cSJohn Marino Py_DECREF (result);
750c50c785cSJohn Marino }
751c50c785cSJohn Marino else
752c50c785cSJohn Marino gdbpy_print_stack ();
753c50c785cSJohn Marino }
754a45ae5f8SJohn Marino
755a45ae5f8SJohn Marino if (bp_obj->is_finish_bp)
756a45ae5f8SJohn Marino bpfinishpy_post_stop_hook (bp_obj);
757a45ae5f8SJohn Marino
758c50c785cSJohn Marino do_cleanups (cleanup);
759c50c785cSJohn Marino
760c50c785cSJohn Marino return stop;
761c50c785cSJohn Marino }
762c50c785cSJohn Marino
763c50c785cSJohn Marino /* Checks if the "stop" method exists in this breakpoint.
764c50c785cSJohn Marino Used by condition_command to ensure mutual exclusion of breakpoint
765c50c785cSJohn Marino conditions. */
766c50c785cSJohn Marino
767c50c785cSJohn Marino int
gdbpy_breakpoint_has_py_cond(struct breakpoint_object * bp_obj)768c50c785cSJohn Marino gdbpy_breakpoint_has_py_cond (struct breakpoint_object *bp_obj)
769c50c785cSJohn Marino {
770c50c785cSJohn Marino int has_func = 0;
771c50c785cSJohn Marino PyObject *py_bp = (PyObject *) bp_obj;
772c50c785cSJohn Marino struct gdbarch *garch = bp_obj->bp->gdbarch ? bp_obj->bp->gdbarch :
773c50c785cSJohn Marino get_current_arch ();
774c50c785cSJohn Marino struct cleanup *cleanup = ensure_python_env (garch, current_language);
775c50c785cSJohn Marino
776a45ae5f8SJohn Marino if (py_bp != NULL)
777c50c785cSJohn Marino has_func = PyObject_HasAttrString (py_bp, stop_func);
778a45ae5f8SJohn Marino
779c50c785cSJohn Marino do_cleanups (cleanup);
780c50c785cSJohn Marino
781c50c785cSJohn Marino return has_func;
782c50c785cSJohn Marino }
783c50c785cSJohn Marino
784c50c785cSJohn Marino
785c50c785cSJohn Marino
786c50c785cSJohn Marino /* Event callback functions. */
787c50c785cSJohn Marino
788c50c785cSJohn Marino /* Callback that is used when a breakpoint is created. This function
789c50c785cSJohn Marino will create a new Python breakpoint object. */
790c50c785cSJohn Marino static void
gdbpy_breakpoint_created(struct breakpoint * bp)791a45ae5f8SJohn Marino gdbpy_breakpoint_created (struct breakpoint *bp)
792c50c785cSJohn Marino {
793c50c785cSJohn Marino breakpoint_object *newbp;
794c50c785cSJohn Marino PyGILState_STATE state;
795c50c785cSJohn Marino
796a45ae5f8SJohn Marino if (bp->number < 0 && bppy_pending_object == NULL)
797c50c785cSJohn Marino return;
798c50c785cSJohn Marino
799c50c785cSJohn Marino if (bp->type != bp_breakpoint
800c50c785cSJohn Marino && bp->type != bp_watchpoint
801c50c785cSJohn Marino && bp->type != bp_hardware_watchpoint
802c50c785cSJohn Marino && bp->type != bp_read_watchpoint
803c50c785cSJohn Marino && bp->type != bp_access_watchpoint)
804c50c785cSJohn Marino return;
805c50c785cSJohn Marino
806c50c785cSJohn Marino state = PyGILState_Ensure ();
807c50c785cSJohn Marino
808c50c785cSJohn Marino if (bppy_pending_object)
809c50c785cSJohn Marino {
810c50c785cSJohn Marino newbp = bppy_pending_object;
811c50c785cSJohn Marino bppy_pending_object = NULL;
812c50c785cSJohn Marino }
813c50c785cSJohn Marino else
814c50c785cSJohn Marino newbp = PyObject_New (breakpoint_object, &breakpoint_object_type);
815c50c785cSJohn Marino if (newbp)
816c50c785cSJohn Marino {
817a45ae5f8SJohn Marino newbp->number = bp->number;
818c50c785cSJohn Marino newbp->bp = bp;
819c50c785cSJohn Marino newbp->bp->py_bp_object = newbp;
820a45ae5f8SJohn Marino newbp->is_finish_bp = 0;
821c50c785cSJohn Marino Py_INCREF (newbp);
822c50c785cSJohn Marino ++bppy_live;
823c50c785cSJohn Marino }
824c50c785cSJohn Marino else
825c50c785cSJohn Marino {
826c50c785cSJohn Marino PyErr_SetString (PyExc_RuntimeError,
827c50c785cSJohn Marino _("Error while creating breakpoint from GDB."));
828c50c785cSJohn Marino gdbpy_print_stack ();
829c50c785cSJohn Marino }
830c50c785cSJohn Marino
831c50c785cSJohn Marino PyGILState_Release (state);
832c50c785cSJohn Marino }
833c50c785cSJohn Marino
834c50c785cSJohn Marino /* Callback that is used when a breakpoint is deleted. This will
835c50c785cSJohn Marino invalidate the corresponding Python object. */
836c50c785cSJohn Marino static void
gdbpy_breakpoint_deleted(struct breakpoint * b)837a45ae5f8SJohn Marino gdbpy_breakpoint_deleted (struct breakpoint *b)
838c50c785cSJohn Marino {
839a45ae5f8SJohn Marino int num = b->number;
840c50c785cSJohn Marino PyGILState_STATE state;
841c50c785cSJohn Marino struct breakpoint *bp = NULL;
842c50c785cSJohn Marino breakpoint_object *bp_obj;
843c50c785cSJohn Marino
844c50c785cSJohn Marino state = PyGILState_Ensure ();
845c50c785cSJohn Marino bp = get_breakpoint (num);
846a45ae5f8SJohn Marino if (bp)
847a45ae5f8SJohn Marino {
848c50c785cSJohn Marino bp_obj = bp->py_bp_object;
849c50c785cSJohn Marino if (bp_obj)
850c50c785cSJohn Marino {
851c50c785cSJohn Marino bp_obj->bp = NULL;
852c50c785cSJohn Marino --bppy_live;
853c50c785cSJohn Marino Py_DECREF (bp_obj);
854c50c785cSJohn Marino }
855a45ae5f8SJohn Marino }
856c50c785cSJohn Marino PyGILState_Release (state);
857c50c785cSJohn Marino }
858c50c785cSJohn Marino
859c50c785cSJohn Marino
860c50c785cSJohn Marino
861c50c785cSJohn Marino /* Initialize the Python breakpoint code. */
862c50c785cSJohn Marino void
gdbpy_initialize_breakpoints(void)863c50c785cSJohn Marino gdbpy_initialize_breakpoints (void)
864c50c785cSJohn Marino {
865c50c785cSJohn Marino int i;
866c50c785cSJohn Marino
867a45ae5f8SJohn Marino breakpoint_object_type.tp_new = PyType_GenericNew;
868c50c785cSJohn Marino if (PyType_Ready (&breakpoint_object_type) < 0)
869c50c785cSJohn Marino return;
870c50c785cSJohn Marino
871c50c785cSJohn Marino Py_INCREF (&breakpoint_object_type);
872c50c785cSJohn Marino PyModule_AddObject (gdb_module, "Breakpoint",
873c50c785cSJohn Marino (PyObject *) &breakpoint_object_type);
874c50c785cSJohn Marino
875c50c785cSJohn Marino observer_attach_breakpoint_created (gdbpy_breakpoint_created);
876c50c785cSJohn Marino observer_attach_breakpoint_deleted (gdbpy_breakpoint_deleted);
877c50c785cSJohn Marino
878c50c785cSJohn Marino /* Add breakpoint types constants. */
879c50c785cSJohn Marino for (i = 0; pybp_codes[i].name; ++i)
880c50c785cSJohn Marino {
881c50c785cSJohn Marino if (PyModule_AddIntConstant (gdb_module,
882c50c785cSJohn Marino /* Cast needed for Python 2.4. */
883c50c785cSJohn Marino (char *) pybp_codes[i].name,
884c50c785cSJohn Marino pybp_codes[i].code) < 0)
885c50c785cSJohn Marino return;
886c50c785cSJohn Marino }
887c50c785cSJohn Marino
888c50c785cSJohn Marino /* Add watchpoint types constants. */
889c50c785cSJohn Marino for (i = 0; pybp_watch_types[i].name; ++i)
890c50c785cSJohn Marino {
891c50c785cSJohn Marino if (PyModule_AddIntConstant (gdb_module,
892c50c785cSJohn Marino /* Cast needed for Python 2.4. */
893c50c785cSJohn Marino (char *) pybp_watch_types[i].name,
894c50c785cSJohn Marino pybp_watch_types[i].code) < 0)
895c50c785cSJohn Marino return;
896c50c785cSJohn Marino }
897c50c785cSJohn Marino
898c50c785cSJohn Marino }
899c50c785cSJohn Marino
900c50c785cSJohn Marino
901c50c785cSJohn Marino
902c50c785cSJohn Marino /* Helper function that overrides this Python object's
903c50c785cSJohn Marino PyObject_GenericSetAttr to allow extra validation of the attribute
904c50c785cSJohn Marino being set. */
905c50c785cSJohn Marino
906c50c785cSJohn Marino static int
local_setattro(PyObject * self,PyObject * name,PyObject * v)907c50c785cSJohn Marino local_setattro (PyObject *self, PyObject *name, PyObject *v)
908c50c785cSJohn Marino {
909c50c785cSJohn Marino breakpoint_object *obj = (breakpoint_object *) self;
910c50c785cSJohn Marino char *attr = python_string_to_host_string (name);
911c50c785cSJohn Marino
912c50c785cSJohn Marino if (attr == NULL)
913c50c785cSJohn Marino return -1;
914c50c785cSJohn Marino
915c50c785cSJohn Marino /* If the attribute trying to be set is the "stop" method,
916c50c785cSJohn Marino but we already have a condition set in the CLI, disallow this
917c50c785cSJohn Marino operation. */
918c50c785cSJohn Marino if (strcmp (attr, stop_func) == 0 && obj->bp->cond_string)
919c50c785cSJohn Marino {
920c50c785cSJohn Marino xfree (attr);
921c50c785cSJohn Marino PyErr_SetString (PyExc_RuntimeError,
922c50c785cSJohn Marino _("Cannot set 'stop' method. There is an " \
923c50c785cSJohn Marino "existing GDB condition attached to the " \
924c50c785cSJohn Marino "breakpoint."));
925c50c785cSJohn Marino return -1;
926c50c785cSJohn Marino }
927c50c785cSJohn Marino
928c50c785cSJohn Marino xfree (attr);
929c50c785cSJohn Marino
930c50c785cSJohn Marino return PyObject_GenericSetAttr ((PyObject *)self, name, v);
931c50c785cSJohn Marino }
932c50c785cSJohn Marino
933c50c785cSJohn Marino static PyGetSetDef breakpoint_object_getset[] = {
934c50c785cSJohn Marino { "enabled", bppy_get_enabled, bppy_set_enabled,
935c50c785cSJohn Marino "Boolean telling whether the breakpoint is enabled.", NULL },
936c50c785cSJohn Marino { "silent", bppy_get_silent, bppy_set_silent,
937c50c785cSJohn Marino "Boolean telling whether the breakpoint is silent.", NULL },
938c50c785cSJohn Marino { "thread", bppy_get_thread, bppy_set_thread,
939c50c785cSJohn Marino "Thread ID for the breakpoint.\n\
940c50c785cSJohn Marino If the value is a thread ID (integer), then this is a thread-specific breakpoint.\n\
941c50c785cSJohn Marino If the value is None, then this breakpoint is not thread-specific.\n\
942c50c785cSJohn Marino No other type of value can be used.", NULL },
943c50c785cSJohn Marino { "task", bppy_get_task, bppy_set_task,
944c50c785cSJohn Marino "Thread ID for the breakpoint.\n\
945c50c785cSJohn Marino If the value is a task ID (integer), then this is an Ada task-specific breakpoint.\n\
946c50c785cSJohn Marino If the value is None, then this breakpoint is not task-specific.\n\
947c50c785cSJohn Marino No other type of value can be used.", NULL },
948c50c785cSJohn Marino { "ignore_count", bppy_get_ignore_count, bppy_set_ignore_count,
949c50c785cSJohn Marino "Number of times this breakpoint should be automatically continued.",
950c50c785cSJohn Marino NULL },
951c50c785cSJohn Marino { "number", bppy_get_number, NULL,
952c50c785cSJohn Marino "Breakpoint's number assigned by GDB.", NULL },
953c50c785cSJohn Marino { "hit_count", bppy_get_hit_count, bppy_set_hit_count,
954c50c785cSJohn Marino "Number of times the breakpoint has been hit.\n\
955c50c785cSJohn Marino Can be set to zero to clear the count. No other value is valid\n\
956c50c785cSJohn Marino when setting this property.", NULL },
957c50c785cSJohn Marino { "location", bppy_get_location, NULL,
958c50c785cSJohn Marino "Location of the breakpoint, as specified by the user.", NULL},
959c50c785cSJohn Marino { "expression", bppy_get_expression, NULL,
960c50c785cSJohn Marino "Expression of the breakpoint, as specified by the user.", NULL},
961c50c785cSJohn Marino { "condition", bppy_get_condition, bppy_set_condition,
962c50c785cSJohn Marino "Condition of the breakpoint, as specified by the user,\
963c50c785cSJohn Marino or None if no condition set."},
964c50c785cSJohn Marino { "commands", bppy_get_commands, NULL,
965c50c785cSJohn Marino "Commands of the breakpoint, as specified by the user."},
966c50c785cSJohn Marino { "type", bppy_get_type, NULL,
967c50c785cSJohn Marino "Type of breakpoint."},
968c50c785cSJohn Marino { "visible", bppy_get_visibility, NULL,
969c50c785cSJohn Marino "Whether the breakpoint is visible to the user."},
970c50c785cSJohn Marino { NULL } /* Sentinel. */
971c50c785cSJohn Marino };
972c50c785cSJohn Marino
973c50c785cSJohn Marino static PyMethodDef breakpoint_object_methods[] =
974c50c785cSJohn Marino {
975c50c785cSJohn Marino { "is_valid", bppy_is_valid, METH_NOARGS,
976c50c785cSJohn Marino "Return true if this breakpoint is valid, false if not." },
977c50c785cSJohn Marino { "delete", bppy_delete_breakpoint, METH_NOARGS,
978c50c785cSJohn Marino "Delete the underlying GDB breakpoint." },
979c50c785cSJohn Marino { NULL } /* Sentinel. */
980c50c785cSJohn Marino };
981c50c785cSJohn Marino
982a45ae5f8SJohn Marino PyTypeObject breakpoint_object_type =
983c50c785cSJohn Marino {
984*ef5ccd6cSJohn Marino PyVarObject_HEAD_INIT (NULL, 0)
985c50c785cSJohn Marino "gdb.Breakpoint", /*tp_name*/
986c50c785cSJohn Marino sizeof (breakpoint_object), /*tp_basicsize*/
987c50c785cSJohn Marino 0, /*tp_itemsize*/
988c50c785cSJohn Marino 0, /*tp_dealloc*/
989c50c785cSJohn Marino 0, /*tp_print*/
990c50c785cSJohn Marino 0, /*tp_getattr*/
991c50c785cSJohn Marino 0, /*tp_setattr*/
992c50c785cSJohn Marino 0, /*tp_compare*/
993c50c785cSJohn Marino 0, /*tp_repr*/
994c50c785cSJohn Marino 0, /*tp_as_number*/
995c50c785cSJohn Marino 0, /*tp_as_sequence*/
996c50c785cSJohn Marino 0, /*tp_as_mapping*/
997c50c785cSJohn Marino 0, /*tp_hash */
998c50c785cSJohn Marino 0, /*tp_call*/
999c50c785cSJohn Marino 0, /*tp_str*/
1000c50c785cSJohn Marino 0, /*tp_getattro*/
1001c50c785cSJohn Marino (setattrofunc)local_setattro, /*tp_setattro */
1002c50c785cSJohn Marino 0, /*tp_as_buffer*/
1003c50c785cSJohn Marino Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
1004c50c785cSJohn Marino "GDB breakpoint object", /* tp_doc */
1005c50c785cSJohn Marino 0, /* tp_traverse */
1006c50c785cSJohn Marino 0, /* tp_clear */
1007c50c785cSJohn Marino 0, /* tp_richcompare */
1008c50c785cSJohn Marino 0, /* tp_weaklistoffset */
1009c50c785cSJohn Marino 0, /* tp_iter */
1010c50c785cSJohn Marino 0, /* tp_iternext */
1011c50c785cSJohn Marino breakpoint_object_methods, /* tp_methods */
1012c50c785cSJohn Marino 0, /* tp_members */
1013c50c785cSJohn Marino breakpoint_object_getset, /* tp_getset */
1014c50c785cSJohn Marino 0, /* tp_base */
1015c50c785cSJohn Marino 0, /* tp_dict */
1016c50c785cSJohn Marino 0, /* tp_descr_get */
1017c50c785cSJohn Marino 0, /* tp_descr_set */
1018c50c785cSJohn Marino 0, /* tp_dictoffset */
1019c50c785cSJohn Marino bppy_init, /* tp_init */
1020c50c785cSJohn Marino 0, /* tp_alloc */
1021c50c785cSJohn Marino };
1022