xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/python/py-breakpoint.c (revision 404ee5b9334f618040b6cdef96a0ff35a6fc4636)
1 /* Python interface to breakpoints
2 
3    Copyright (C) 2008-2017 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 const char 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.get ());
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   const 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   gdb::unique_xmalloc_ptr<char> exp_holder;
444   const char *exp = NULL;
445   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
446   struct gdb_exception except = exception_none;
447 
448   BPPY_SET_REQUIRE_VALID (self_bp);
449 
450   if (newvalue == NULL)
451     {
452       PyErr_SetString (PyExc_TypeError,
453 		       _("Cannot delete `condition' attribute."));
454       return -1;
455     }
456   else if (newvalue == Py_None)
457     exp = "";
458   else
459     {
460       exp_holder = python_string_to_host_string (newvalue);
461       if (exp_holder == NULL)
462 	return -1;
463       exp = exp_holder.get ();
464     }
465 
466   TRY
467     {
468       set_breakpoint_condition (self_bp->bp, exp, 0);
469     }
470   CATCH (ex, RETURN_MASK_ALL)
471     {
472       except = ex;
473     }
474   END_CATCH
475 
476   GDB_PY_SET_HANDLE_EXCEPTION (except);
477 
478   return 0;
479 }
480 
481 /* Python function to get the commands attached to a breakpoint.  */
482 static PyObject *
483 bppy_get_commands (PyObject *self, void *closure)
484 {
485   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
486   struct breakpoint *bp = self_bp->bp;
487   long length;
488   PyObject *result;
489 
490   BPPY_REQUIRE_VALID (self_bp);
491 
492   if (! self_bp->bp->commands)
493     Py_RETURN_NONE;
494 
495   string_file stb;
496 
497   current_uiout->redirect (&stb);
498   TRY
499     {
500       print_command_lines (current_uiout, breakpoint_commands (bp), 0);
501     }
502   CATCH (except, RETURN_MASK_ALL)
503     {
504       current_uiout->redirect (NULL);
505       gdbpy_convert_exception (except);
506       return NULL;
507     }
508   END_CATCH
509 
510   current_uiout->redirect (NULL);
511   return host_string_to_python_string (stb.c_str ());
512 }
513 
514 /* Python function to get the breakpoint type.  */
515 static PyObject *
516 bppy_get_type (PyObject *self, void *closure)
517 {
518   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
519 
520   BPPY_REQUIRE_VALID (self_bp);
521 
522   return PyInt_FromLong (self_bp->bp->type);
523 }
524 
525 /* Python function to get the visibility of the breakpoint.  */
526 
527 static PyObject *
528 bppy_get_visibility (PyObject *self, void *closure)
529 {
530   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
531 
532   BPPY_REQUIRE_VALID (self_bp);
533 
534   if (user_breakpoint_p (self_bp->bp))
535     Py_RETURN_TRUE;
536 
537   Py_RETURN_FALSE;
538 }
539 
540 /* Python function to determine if the breakpoint is a temporary
541    breakpoint.  */
542 
543 static PyObject *
544 bppy_get_temporary (PyObject *self, void *closure)
545 {
546   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
547 
548   BPPY_REQUIRE_VALID (self_bp);
549 
550   if (self_bp->bp->disposition == disp_del
551       || self_bp->bp->disposition == disp_del_at_next_stop)
552     Py_RETURN_TRUE;
553 
554   Py_RETURN_FALSE;
555 }
556 
557 /* Python function to determine if the breakpoint is a pending
558    breakpoint.  */
559 
560 static PyObject *
561 bppy_get_pending (PyObject *self, void *closure)
562 {
563   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
564 
565   BPPY_REQUIRE_VALID (self_bp);
566 
567   if (is_watchpoint (self_bp->bp))
568     Py_RETURN_FALSE;
569   if (pending_breakpoint_p (self_bp->bp))
570     Py_RETURN_TRUE;
571 
572   Py_RETURN_FALSE;
573 }
574 
575 /* Python function to get the breakpoint's number.  */
576 static PyObject *
577 bppy_get_number (PyObject *self, void *closure)
578 {
579   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
580 
581   BPPY_REQUIRE_VALID (self_bp);
582 
583   return PyInt_FromLong (self_bp->number);
584 }
585 
586 /* Python function to get the breakpoint's thread ID.  */
587 static PyObject *
588 bppy_get_thread (PyObject *self, void *closure)
589 {
590   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
591 
592   BPPY_REQUIRE_VALID (self_bp);
593 
594   if (self_bp->bp->thread == -1)
595     Py_RETURN_NONE;
596 
597   return PyInt_FromLong (self_bp->bp->thread);
598 }
599 
600 /* Python function to get the breakpoint's task ID (in Ada).  */
601 static PyObject *
602 bppy_get_task (PyObject *self, void *closure)
603 {
604   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
605 
606   BPPY_REQUIRE_VALID (self_bp);
607 
608   if (self_bp->bp->task == 0)
609     Py_RETURN_NONE;
610 
611   return PyInt_FromLong (self_bp->bp->task);
612 }
613 
614 /* Python function to get the breakpoint's hit count.  */
615 static PyObject *
616 bppy_get_hit_count (PyObject *self, void *closure)
617 {
618   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
619 
620   BPPY_REQUIRE_VALID (self_bp);
621 
622   return PyInt_FromLong (self_bp->bp->hit_count);
623 }
624 
625 /* Python function to get the breakpoint's ignore count.  */
626 static PyObject *
627 bppy_get_ignore_count (PyObject *self, void *closure)
628 {
629   gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
630 
631   BPPY_REQUIRE_VALID (self_bp);
632 
633   return PyInt_FromLong (self_bp->bp->ignore_count);
634 }
635 
636 /* Python function to create a new breakpoint.  */
637 static int
638 bppy_init (PyObject *self, PyObject *args, PyObject *kwargs)
639 {
640   static const char *keywords[] = { "spec", "type", "wp_class", "internal",
641 				    "temporary", NULL };
642   const char *spec;
643   int type = bp_breakpoint;
644   int access_type = hw_write;
645   PyObject *internal = NULL;
646   PyObject *temporary = NULL;
647   int internal_bp = 0;
648   int temporary_bp = 0;
649 
650   if (!gdb_PyArg_ParseTupleAndKeywords (args, kwargs, "s|iiOO", keywords,
651 					&spec, &type, &access_type,
652 					&internal, &temporary))
653     return -1;
654 
655   if (internal)
656     {
657       internal_bp = PyObject_IsTrue (internal);
658       if (internal_bp == -1)
659 	return -1;
660     }
661 
662   if (temporary != NULL)
663     {
664       temporary_bp = PyObject_IsTrue (temporary);
665       if (temporary_bp == -1)
666 	return -1;
667     }
668 
669   bppy_pending_object = (gdbpy_breakpoint_object *) self;
670   bppy_pending_object->number = -1;
671   bppy_pending_object->bp = NULL;
672 
673   TRY
674     {
675       gdb::unique_xmalloc_ptr<char>
676 	copy_holder (xstrdup (skip_spaces_const (spec)));
677       char *copy = copy_holder.get ();
678 
679       switch (type)
680 	{
681 	case bp_breakpoint:
682 	  {
683 	    event_location_up location
684 	      = string_to_event_location_basic (&copy, current_language);
685 	    create_breakpoint (python_gdbarch,
686 			       location.get (), NULL, -1, NULL,
687 			       0,
688 			       temporary_bp, bp_breakpoint,
689 			       0,
690 			       AUTO_BOOLEAN_TRUE,
691 			       &bkpt_breakpoint_ops,
692 			       0, 1, internal_bp, 0);
693 	    break;
694 	  }
695         case bp_watchpoint:
696 	  {
697 	    if (access_type == hw_write)
698 	      watch_command_wrapper (copy, 0, internal_bp);
699 	    else if (access_type == hw_access)
700 	      awatch_command_wrapper (copy, 0, internal_bp);
701 	    else if (access_type == hw_read)
702 	      rwatch_command_wrapper (copy, 0, internal_bp);
703 	    else
704 	      error(_("Cannot understand watchpoint access type."));
705 	    break;
706 	  }
707 	default:
708 	  error(_("Do not understand breakpoint type to set."));
709 	}
710     }
711   CATCH (except, RETURN_MASK_ALL)
712     {
713       bppy_pending_object = NULL;
714       PyErr_Format (except.reason == RETURN_QUIT
715 		    ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
716 		    "%s", except.message);
717       return -1;
718     }
719   END_CATCH
720 
721   BPPY_SET_REQUIRE_VALID ((gdbpy_breakpoint_object *) self);
722   return 0;
723 }
724 
725 
726 
727 static int
728 build_bp_list (struct breakpoint *b, void *arg)
729 {
730   PyObject *list = (PyObject *) arg;
731   PyObject *bp = (PyObject *) b->py_bp_object;
732   int iserr = 0;
733 
734   /* Not all breakpoints will have a companion Python object.
735      Only breakpoints that were created via bppy_new, or
736      breakpoints that were created externally and are tracked by
737      the Python Scripting API.  */
738   if (bp)
739     iserr = PyList_Append (list, bp);
740 
741   if (iserr == -1)
742     return 1;
743 
744   return 0;
745 }
746 
747 /* Static function to return a tuple holding all breakpoints.  */
748 
749 PyObject *
750 gdbpy_breakpoints (PyObject *self, PyObject *args)
751 {
752   if (bppy_live == 0)
753     return PyTuple_New (0);
754 
755   gdbpy_ref<> list (PyList_New (0));
756   if (list == NULL)
757     return NULL;
758 
759   /* If iterate_over_breakpoints returns non NULL it signals an error
760      condition.  In that case abandon building the list and return
761      NULL.  */
762   if (iterate_over_breakpoints (build_bp_list, list.get ()) != NULL)
763     return NULL;
764 
765   return PyList_AsTuple (list.get ());
766 }
767 
768 /* Call the "stop" method (if implemented) in the breakpoint
769    class.  If the method returns True, the inferior  will be
770    stopped at the breakpoint.  Otherwise the inferior will be
771    allowed to continue.  */
772 
773 enum ext_lang_bp_stop
774 gdbpy_breakpoint_cond_says_stop (const struct extension_language_defn *extlang,
775 				 struct breakpoint *b)
776 {
777   int stop;
778   struct gdbpy_breakpoint_object *bp_obj = b->py_bp_object;
779   PyObject *py_bp = (PyObject *) bp_obj;
780   struct gdbarch *garch;
781 
782   if (bp_obj == NULL)
783     return EXT_LANG_BP_STOP_UNSET;
784 
785   stop = -1;
786   garch = b->gdbarch ? b->gdbarch : get_current_arch ();
787 
788   gdbpy_enter enter_py (garch, current_language);
789 
790   if (bp_obj->is_finish_bp)
791     bpfinishpy_pre_stop_hook (bp_obj);
792 
793   if (PyObject_HasAttrString (py_bp, stop_func))
794     {
795       gdbpy_ref<> result (PyObject_CallMethod (py_bp, stop_func, NULL));
796 
797       stop = 1;
798       if (result != NULL)
799 	{
800 	  int evaluate = PyObject_IsTrue (result.get ());
801 
802 	  if (evaluate == -1)
803 	    gdbpy_print_stack ();
804 
805 	  /* If the "stop" function returns False that means
806 	     the Python breakpoint wants GDB to continue.  */
807 	  if (! evaluate)
808 	    stop = 0;
809 	}
810       else
811 	gdbpy_print_stack ();
812     }
813 
814   if (bp_obj->is_finish_bp)
815     bpfinishpy_post_stop_hook (bp_obj);
816 
817   if (stop < 0)
818     return EXT_LANG_BP_STOP_UNSET;
819   return stop ? EXT_LANG_BP_STOP_YES : EXT_LANG_BP_STOP_NO;
820 }
821 
822 /* Checks if the  "stop" method exists in this breakpoint.
823    Used by condition_command to ensure mutual exclusion of breakpoint
824    conditions.  */
825 
826 int
827 gdbpy_breakpoint_has_cond (const struct extension_language_defn *extlang,
828 			   struct breakpoint *b)
829 {
830   PyObject *py_bp;
831   struct gdbarch *garch;
832 
833   if (b->py_bp_object == NULL)
834     return 0;
835 
836   py_bp = (PyObject *) b->py_bp_object;
837   garch = b->gdbarch ? b->gdbarch : get_current_arch ();
838 
839   gdbpy_enter enter_py (garch, current_language);
840   return PyObject_HasAttrString (py_bp, stop_func);
841 }
842 
843 
844 
845 /* Event callback functions.  */
846 
847 /* Callback that is used when a breakpoint is created.  This function
848    will create a new Python breakpoint object.  */
849 static void
850 gdbpy_breakpoint_created (struct breakpoint *bp)
851 {
852   gdbpy_breakpoint_object *newbp;
853   PyGILState_STATE state;
854 
855   if (!user_breakpoint_p (bp) && bppy_pending_object == NULL)
856     return;
857 
858   if (bp->type != bp_breakpoint
859       && bp->type != bp_watchpoint
860       && bp->type != bp_hardware_watchpoint
861       && bp->type != bp_read_watchpoint
862       && bp->type != bp_access_watchpoint)
863     return;
864 
865   state = PyGILState_Ensure ();
866 
867   if (bppy_pending_object)
868     {
869       newbp = bppy_pending_object;
870       bppy_pending_object = NULL;
871     }
872   else
873     newbp = PyObject_New (gdbpy_breakpoint_object, &breakpoint_object_type);
874   if (newbp)
875     {
876       newbp->number = bp->number;
877       newbp->bp = bp;
878       newbp->bp->py_bp_object = newbp;
879       newbp->is_finish_bp = 0;
880       Py_INCREF (newbp);
881       ++bppy_live;
882     }
883   else
884     {
885       PyErr_SetString (PyExc_RuntimeError,
886 		       _("Error while creating breakpoint from GDB."));
887       gdbpy_print_stack ();
888     }
889 
890   if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_created))
891     {
892       if (evpy_emit_event ((PyObject *) newbp,
893 			   gdb_py_events.breakpoint_created) < 0)
894 	gdbpy_print_stack ();
895     }
896 
897   PyGILState_Release (state);
898 }
899 
900 /* Callback that is used when a breakpoint is deleted.  This will
901    invalidate the corresponding Python object.  */
902 static void
903 gdbpy_breakpoint_deleted (struct breakpoint *b)
904 {
905   int num = b->number;
906   PyGILState_STATE state;
907   struct breakpoint *bp = NULL;
908 
909   state = PyGILState_Ensure ();
910   bp = get_breakpoint (num);
911   if (bp)
912     {
913       gdbpy_ref<gdbpy_breakpoint_object> bp_obj (bp->py_bp_object);
914       if (bp_obj != NULL)
915 	{
916 	  if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_deleted))
917 	    {
918 	      if (evpy_emit_event ((PyObject *) bp_obj.get (),
919 				   gdb_py_events.breakpoint_deleted) < 0)
920 		gdbpy_print_stack ();
921 	    }
922 
923 	  bp_obj->bp = NULL;
924 	  --bppy_live;
925 	}
926     }
927   PyGILState_Release (state);
928 }
929 
930 /* Callback that is used when a breakpoint is modified.  */
931 
932 static void
933 gdbpy_breakpoint_modified (struct breakpoint *b)
934 {
935   int num = b->number;
936   PyGILState_STATE state;
937   struct breakpoint *bp = NULL;
938   gdbpy_breakpoint_object *bp_obj;
939 
940   state = PyGILState_Ensure ();
941   bp = get_breakpoint (num);
942   if (bp)
943     {
944       PyObject *bp_obj = (PyObject *) bp->py_bp_object;
945       if (bp_obj)
946 	{
947 	  if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_modified))
948 	    {
949 	      if (evpy_emit_event (bp_obj,
950 				   gdb_py_events.breakpoint_modified) < 0)
951 		gdbpy_print_stack ();
952 	    }
953 	}
954     }
955   PyGILState_Release (state);
956 }
957 
958 
959 
960 /* Initialize the Python breakpoint code.  */
961 int
962 gdbpy_initialize_breakpoints (void)
963 {
964   int i;
965 
966   breakpoint_object_type.tp_new = PyType_GenericNew;
967   if (PyType_Ready (&breakpoint_object_type) < 0)
968     return -1;
969 
970   if (gdb_pymodule_addobject (gdb_module, "Breakpoint",
971 			      (PyObject *) &breakpoint_object_type) < 0)
972     return -1;
973 
974   observer_attach_breakpoint_created (gdbpy_breakpoint_created);
975   observer_attach_breakpoint_deleted (gdbpy_breakpoint_deleted);
976   observer_attach_breakpoint_modified (gdbpy_breakpoint_modified);
977 
978   /* Add breakpoint types constants.  */
979   for (i = 0; pybp_codes[i].name; ++i)
980     {
981       if (PyModule_AddIntConstant (gdb_module,
982 				   /* Cast needed for Python 2.4.  */
983 				   (char *) pybp_codes[i].name,
984 				   pybp_codes[i].code) < 0)
985 	return -1;
986     }
987 
988   /* Add watchpoint types constants.  */
989   for (i = 0; pybp_watch_types[i].name; ++i)
990     {
991       if (PyModule_AddIntConstant (gdb_module,
992 				   /* Cast needed for Python 2.4.  */
993 				   (char *) pybp_watch_types[i].name,
994 				   pybp_watch_types[i].code) < 0)
995 	return -1;
996     }
997 
998   return 0;
999 }
1000 
1001 
1002 
1003 /* Helper function that overrides this Python object's
1004    PyObject_GenericSetAttr to allow extra validation of the attribute
1005    being set.  */
1006 
1007 static int
1008 local_setattro (PyObject *self, PyObject *name, PyObject *v)
1009 {
1010   gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
1011   gdb::unique_xmalloc_ptr<char> attr (python_string_to_host_string (name));
1012 
1013   if (attr == NULL)
1014     return -1;
1015 
1016   /* If the attribute trying to be set is the "stop" method,
1017      but we already have a condition set in the CLI or other extension
1018      language, disallow this operation.  */
1019   if (strcmp (attr.get (), stop_func) == 0)
1020     {
1021       const struct extension_language_defn *extlang = NULL;
1022 
1023       if (obj->bp->cond_string != NULL)
1024 	extlang = get_ext_lang_defn (EXT_LANG_GDB);
1025       if (extlang == NULL)
1026 	extlang = get_breakpoint_cond_ext_lang (obj->bp, EXT_LANG_PYTHON);
1027       if (extlang != NULL)
1028 	{
1029 	  char *error_text;
1030 
1031 	  error_text
1032 	    = xstrprintf (_("Only one stop condition allowed.  There is"
1033 			    " currently a %s stop condition defined for"
1034 			    " this breakpoint."),
1035 			  ext_lang_capitalized_name (extlang));
1036 	  PyErr_SetString (PyExc_RuntimeError, error_text);
1037 	  xfree (error_text);
1038 	  return -1;
1039 	}
1040     }
1041 
1042   return PyObject_GenericSetAttr ((PyObject *)self, name, v);
1043 }
1044 
1045 static gdb_PyGetSetDef breakpoint_object_getset[] = {
1046   { "enabled", bppy_get_enabled, bppy_set_enabled,
1047     "Boolean telling whether the breakpoint is enabled.", NULL },
1048   { "silent", bppy_get_silent, bppy_set_silent,
1049     "Boolean telling whether the breakpoint is silent.", NULL },
1050   { "thread", bppy_get_thread, bppy_set_thread,
1051     "Thread ID for the breakpoint.\n\
1052 If the value is a thread ID (integer), then this is a thread-specific breakpoint.\n\
1053 If the value is None, then this breakpoint is not thread-specific.\n\
1054 No other type of value can be used.", NULL },
1055   { "task", bppy_get_task, bppy_set_task,
1056     "Thread ID for the breakpoint.\n\
1057 If the value is a task ID (integer), then this is an Ada task-specific breakpoint.\n\
1058 If the value is None, then this breakpoint is not task-specific.\n\
1059 No other type of value can be used.", NULL },
1060   { "ignore_count", bppy_get_ignore_count, bppy_set_ignore_count,
1061     "Number of times this breakpoint should be automatically continued.",
1062     NULL },
1063   { "number", bppy_get_number, NULL,
1064     "Breakpoint's number assigned by GDB.", NULL },
1065   { "hit_count", bppy_get_hit_count, bppy_set_hit_count,
1066     "Number of times the breakpoint has been hit.\n\
1067 Can be set to zero to clear the count. No other value is valid\n\
1068 when setting this property.", NULL },
1069   { "location", bppy_get_location, NULL,
1070     "Location of the breakpoint, as specified by the user.", NULL},
1071   { "expression", bppy_get_expression, NULL,
1072     "Expression of the breakpoint, as specified by the user.", NULL},
1073   { "condition", bppy_get_condition, bppy_set_condition,
1074     "Condition of the breakpoint, as specified by the user,\
1075 or None if no condition set."},
1076   { "commands", bppy_get_commands, NULL,
1077     "Commands of the breakpoint, as specified by the user."},
1078   { "type", bppy_get_type, NULL,
1079     "Type of breakpoint."},
1080   { "visible", bppy_get_visibility, NULL,
1081     "Whether the breakpoint is visible to the user."},
1082   { "temporary", bppy_get_temporary, NULL,
1083     "Whether this breakpoint is a temporary breakpoint."},
1084   { "pending", bppy_get_pending, NULL,
1085     "Whether this breakpoint is a pending breakpoint."},
1086   { NULL }  /* Sentinel.  */
1087 };
1088 
1089 static PyMethodDef breakpoint_object_methods[] =
1090 {
1091   { "is_valid", bppy_is_valid, METH_NOARGS,
1092     "Return true if this breakpoint is valid, false if not." },
1093   { "delete", bppy_delete_breakpoint, METH_NOARGS,
1094     "Delete the underlying GDB breakpoint." },
1095   { NULL } /* Sentinel.  */
1096 };
1097 
1098 PyTypeObject breakpoint_object_type =
1099 {
1100   PyVarObject_HEAD_INIT (NULL, 0)
1101   "gdb.Breakpoint",		  /*tp_name*/
1102   sizeof (gdbpy_breakpoint_object), /*tp_basicsize*/
1103   0,				  /*tp_itemsize*/
1104   0,				  /*tp_dealloc*/
1105   0,				  /*tp_print*/
1106   0,				  /*tp_getattr*/
1107   0,				  /*tp_setattr*/
1108   0,				  /*tp_compare*/
1109   0,				  /*tp_repr*/
1110   0,				  /*tp_as_number*/
1111   0,				  /*tp_as_sequence*/
1112   0,				  /*tp_as_mapping*/
1113   0,				  /*tp_hash */
1114   0,				  /*tp_call*/
1115   0,				  /*tp_str*/
1116   0,				  /*tp_getattro*/
1117   (setattrofunc)local_setattro,   /*tp_setattro */
1118   0,				  /*tp_as_buffer*/
1119   Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,  /*tp_flags*/
1120   "GDB breakpoint object",	  /* tp_doc */
1121   0,				  /* tp_traverse */
1122   0,				  /* tp_clear */
1123   0,				  /* tp_richcompare */
1124   0,				  /* tp_weaklistoffset */
1125   0,				  /* tp_iter */
1126   0,				  /* tp_iternext */
1127   breakpoint_object_methods,	  /* tp_methods */
1128   0,				  /* tp_members */
1129   breakpoint_object_getset,	  /* tp_getset */
1130   0,				  /* tp_base */
1131   0,				  /* tp_dict */
1132   0,				  /* tp_descr_get */
1133   0,				  /* tp_descr_set */
1134   0,				  /* tp_dictoffset */
1135   bppy_init,			  /* tp_init */
1136   0,				  /* tp_alloc */
1137 };
1138