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