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