xref: /dflybsd-src/contrib/gdb-7/gdb/python/py-breakpoint.c (revision de8e141f24382815c10a4012d209bbbf7abf1112)
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