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