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