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