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