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