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