python/19506 -- gdb.Breakpoint address location regression
[deliverable/binutils-gdb.git] / gdb / python / py-breakpoint.c
CommitLineData
adc36818
PM
1/* Python interface to breakpoints
2
618f726f 3 Copyright (C) 2008-2016 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"
adc36818 22#include "python-internal.h"
49a8461d 23#include "python.h"
adc36818
PM
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"
f00aae0f 33#include "location.h"
adc36818 34
adc36818
PM
35/* Number of live breakpoints. */
36static int bppy_live;
37
38/* Variables used to pass information between the Breakpoint
39 constructor and the breakpoint-created hook function. */
4cb0213d 40gdbpy_breakpoint_object *bppy_pending_object;
adc36818 41
7371cf6d
PM
42/* Function that is called when a Python condition is evaluated. */
43static char * const stop_func = "stop";
44
adc36818
PM
45/* This is used to initialize various gdb.bp_* constants. */
46struct pybp_code
47{
48 /* The name. */
49 const char *name;
50 /* The code. */
e81b7af8 51 int code;
adc36818
PM
52};
53
54/* Entries related to the type of user set breakpoints. */
55static struct pybp_code pybp_codes[] =
56{
57 { "BP_NONE", bp_none},
58 { "BP_BREAKPOINT", bp_breakpoint},
59 { "BP_WATCHPOINT", bp_watchpoint},
60 { "BP_HARDWARE_WATCHPOINT", bp_hardware_watchpoint},
61 { "BP_READ_WATCHPOINT", bp_read_watchpoint},
62 { "BP_ACCESS_WATCHPOINT", bp_access_watchpoint},
63 {NULL} /* Sentinel. */
64};
65
66/* Entries related to the type of watchpoint. */
67static struct pybp_code pybp_watch_types[] =
68{
69 { "WP_READ", hw_read},
70 { "WP_WRITE", hw_write},
71 { "WP_ACCESS", hw_access},
72 {NULL} /* Sentinel. */
73};
74
adc36818
PM
75/* Python function which checks the validity of a breakpoint object. */
76static PyObject *
77bppy_is_valid (PyObject *self, PyObject *args)
78{
4cb0213d 79 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
80
81 if (self_bp->bp)
82 Py_RETURN_TRUE;
83 Py_RETURN_FALSE;
84}
85
86/* Python function to test whether or not the breakpoint is enabled. */
87static PyObject *
88bppy_get_enabled (PyObject *self, void *closure)
89{
4cb0213d 90 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
91
92 BPPY_REQUIRE_VALID (self_bp);
93 if (! self_bp->bp)
94 Py_RETURN_FALSE;
95 if (self_bp->bp->enable_state == bp_enabled)
96 Py_RETURN_TRUE;
97 Py_RETURN_FALSE;
98}
99
100/* Python function to test whether or not the breakpoint is silent. */
101static PyObject *
102bppy_get_silent (PyObject *self, void *closure)
103{
4cb0213d 104 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
105
106 BPPY_REQUIRE_VALID (self_bp);
107 if (self_bp->bp->silent)
108 Py_RETURN_TRUE;
109 Py_RETURN_FALSE;
110}
111
112/* Python function to set the enabled state of a breakpoint. */
113static int
114bppy_set_enabled (PyObject *self, PyObject *newvalue, void *closure)
115{
4cb0213d 116 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
117 int cmp;
118
119 BPPY_SET_REQUIRE_VALID (self_bp);
120
121 if (newvalue == NULL)
122 {
256458bc 123 PyErr_SetString (PyExc_TypeError,
adc36818
PM
124 _("Cannot delete `enabled' attribute."));
125
126 return -1;
127 }
128 else if (! PyBool_Check (newvalue))
129 {
130 PyErr_SetString (PyExc_TypeError,
131 _("The value of `enabled' must be a boolean."));
132 return -1;
133 }
134
135 cmp = PyObject_IsTrue (newvalue);
136 if (cmp < 0)
137 return -1;
76dce0be 138
492d29ea 139 TRY
76dce0be
PM
140 {
141 if (cmp == 1)
142 enable_breakpoint (self_bp->bp);
143 else
144 disable_breakpoint (self_bp->bp);
145 }
492d29ea
PA
146 CATCH (except, RETURN_MASK_ALL)
147 {
148 GDB_PY_SET_HANDLE_EXCEPTION (except);
149 }
150 END_CATCH
76dce0be 151
adc36818
PM
152 return 0;
153}
154
155/* Python function to set the 'silent' state of a breakpoint. */
156static int
157bppy_set_silent (PyObject *self, PyObject *newvalue, void *closure)
158{
4cb0213d 159 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
160 int cmp;
161
162 BPPY_SET_REQUIRE_VALID (self_bp);
163
164 if (newvalue == NULL)
165 {
256458bc 166 PyErr_SetString (PyExc_TypeError,
adc36818
PM
167 _("Cannot delete `silent' attribute."));
168 return -1;
169 }
170 else if (! PyBool_Check (newvalue))
171 {
172 PyErr_SetString (PyExc_TypeError,
173 _("The value of `silent' must be a boolean."));
174 return -1;
175 }
176
177 cmp = PyObject_IsTrue (newvalue);
178 if (cmp < 0)
179 return -1;
180 else
45a43567 181 breakpoint_set_silent (self_bp->bp, cmp);
adc36818
PM
182
183 return 0;
184}
185
186/* Python function to set the thread of a breakpoint. */
187static int
188bppy_set_thread (PyObject *self, PyObject *newvalue, void *closure)
189{
4cb0213d 190 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
74aedc46 191 long id;
adc36818
PM
192
193 BPPY_SET_REQUIRE_VALID (self_bp);
194
195 if (newvalue == NULL)
196 {
256458bc 197 PyErr_SetString (PyExc_TypeError,
adc36818
PM
198 _("Cannot delete `thread' attribute."));
199 return -1;
200 }
201 else if (PyInt_Check (newvalue))
202 {
74aedc46
TT
203 if (! gdb_py_int_as_long (newvalue, &id))
204 return -1;
205
5d5658a1 206 if (!valid_global_thread_id (id))
adc36818 207 {
256458bc 208 PyErr_SetString (PyExc_RuntimeError,
adc36818
PM
209 _("Invalid thread ID."));
210 return -1;
211 }
212 }
213 else if (newvalue == Py_None)
214 id = -1;
215 else
216 {
217 PyErr_SetString (PyExc_TypeError,
218 _("The value of `thread' must be an integer or None."));
219 return -1;
220 }
221
45a43567 222 breakpoint_set_thread (self_bp->bp, id);
adc36818
PM
223
224 return 0;
225}
226
227/* Python function to set the (Ada) task of a breakpoint. */
228static int
229bppy_set_task (PyObject *self, PyObject *newvalue, void *closure)
230{
4cb0213d 231 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
74aedc46 232 long id;
76dce0be 233 int valid_id = 0;
adc36818
PM
234
235 BPPY_SET_REQUIRE_VALID (self_bp);
236
237 if (newvalue == NULL)
238 {
256458bc 239 PyErr_SetString (PyExc_TypeError,
adc36818
PM
240 _("Cannot delete `task' attribute."));
241 return -1;
242 }
243 else if (PyInt_Check (newvalue))
244 {
74aedc46
TT
245 if (! gdb_py_int_as_long (newvalue, &id))
246 return -1;
247
492d29ea 248 TRY
76dce0be
PM
249 {
250 valid_id = valid_task_id (id);
251 }
492d29ea
PA
252 CATCH (except, RETURN_MASK_ALL)
253 {
254 GDB_PY_SET_HANDLE_EXCEPTION (except);
255 }
256 END_CATCH
76dce0be
PM
257
258 if (! valid_id)
adc36818 259 {
256458bc 260 PyErr_SetString (PyExc_RuntimeError,
adc36818
PM
261 _("Invalid task ID."));
262 return -1;
263 }
264 }
265 else if (newvalue == Py_None)
266 id = 0;
267 else
268 {
269 PyErr_SetString (PyExc_TypeError,
270 _("The value of `task' must be an integer or None."));
271 return -1;
272 }
273
45a43567 274 breakpoint_set_task (self_bp->bp, id);
adc36818
PM
275
276 return 0;
277}
278
94b6973e
PM
279/* Python function which deletes the underlying GDB breakpoint. This
280 triggers the breakpoint_deleted observer which will call
281 gdbpy_breakpoint_deleted; that function cleans up the Python
282 sections. */
283
284static PyObject *
285bppy_delete_breakpoint (PyObject *self, PyObject *args)
286{
4cb0213d 287 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
94b6973e
PM
288
289 BPPY_REQUIRE_VALID (self_bp);
290
492d29ea 291 TRY
76dce0be
PM
292 {
293 delete_breakpoint (self_bp->bp);
294 }
492d29ea
PA
295 CATCH (except, RETURN_MASK_ALL)
296 {
297 GDB_PY_HANDLE_EXCEPTION (except);
298 }
299 END_CATCH
94b6973e
PM
300
301 Py_RETURN_NONE;
302}
303
adc36818
PM
304
305/* Python function to set the ignore count of a breakpoint. */
306static int
307bppy_set_ignore_count (PyObject *self, PyObject *newvalue, void *closure)
308{
4cb0213d 309 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
310 long value;
311
312 BPPY_SET_REQUIRE_VALID (self_bp);
313
314 if (newvalue == NULL)
315 {
316 PyErr_SetString (PyExc_TypeError,
317 _("Cannot delete `ignore_count' attribute."));
318 return -1;
319 }
320 else if (! PyInt_Check (newvalue))
321 {
322 PyErr_SetString (PyExc_TypeError,
323 _("The value of `ignore_count' must be an integer."));
324 return -1;
325 }
326
74aedc46
TT
327 if (! gdb_py_int_as_long (newvalue, &value))
328 return -1;
329
adc36818
PM
330 if (value < 0)
331 value = 0;
5d9c5995 332
492d29ea 333 TRY
5d9c5995
PM
334 {
335 set_ignore_count (self_bp->number, (int) value, 0);
336 }
492d29ea
PA
337 CATCH (except, RETURN_MASK_ALL)
338 {
339 GDB_PY_SET_HANDLE_EXCEPTION (except);
340 }
341 END_CATCH
adc36818
PM
342
343 return 0;
344}
345
346/* Python function to set the hit count of a breakpoint. */
347static int
348bppy_set_hit_count (PyObject *self, PyObject *newvalue, void *closure)
349{
4cb0213d 350 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
351
352 BPPY_SET_REQUIRE_VALID (self_bp);
353
354 if (newvalue == NULL)
355 {
256458bc 356 PyErr_SetString (PyExc_TypeError,
adc36818
PM
357 _("Cannot delete `hit_count' attribute."));
358 return -1;
359 }
74aedc46 360 else
adc36818 361 {
74aedc46
TT
362 long value;
363
364 if (! gdb_py_int_as_long (newvalue, &value))
365 return -1;
366
367 if (value != 0)
368 {
369 PyErr_SetString (PyExc_AttributeError,
370 _("The value of `hit_count' must be zero."));
371 return -1;
372 }
adc36818
PM
373 }
374
375 self_bp->bp->hit_count = 0;
376
377 return 0;
378}
379
380/* Python function to get the location of a breakpoint. */
381static PyObject *
382bppy_get_location (PyObject *self, void *closure)
383{
f00aae0f 384 const char *str;
4cb0213d 385 gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
adc36818
PM
386
387 BPPY_REQUIRE_VALID (obj);
388
389 if (obj->bp->type != bp_breakpoint)
390 Py_RETURN_NONE;
391
f00aae0f 392 str = event_location_to_string (obj->bp->location);
adc36818
PM
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. */
399static PyObject *
400bppy_get_expression (PyObject *self, void *closure)
401{
402 char *str;
4cb0213d 403 gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
3a5c3e22 404 struct watchpoint *wp;
adc36818
PM
405
406 BPPY_REQUIRE_VALID (obj);
407
3a5c3e22 408 if (!is_watchpoint (obj->bp))
adc36818
PM
409 Py_RETURN_NONE;
410
3a5c3e22
PA
411 wp = (struct watchpoint *) obj->bp;
412
413 str = wp->exp_string;
adc36818
PM
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. */
421static PyObject *
422bppy_get_condition (PyObject *self, void *closure)
423{
424 char *str;
4cb0213d 425 gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
adc36818
PM
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
8dc78533
JK
436/* Returns 0 on success. Returns -1 on error, with a python exception set.
437 */
438
adc36818
PM
439static int
440bppy_set_condition (PyObject *self, PyObject *newvalue, void *closure)
441{
442 char *exp;
4cb0213d 443 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
492d29ea 444 struct gdb_exception except = exception_none;
adc36818
PM
445
446 BPPY_SET_REQUIRE_VALID (self_bp);
447
448 if (newvalue == NULL)
449 {
256458bc 450 PyErr_SetString (PyExc_TypeError,
adc36818
PM
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
492d29ea 463 TRY
adc36818
PM
464 {
465 set_breakpoint_condition (self_bp->bp, exp, 0);
466 }
492d29ea
PA
467 CATCH (ex, RETURN_MASK_ALL)
468 {
469 except = ex;
470 }
471 END_CATCH
f3be5b64
MS
472
473 if (newvalue != Py_None)
474 xfree (exp);
475
adc36818
PM
476 GDB_PY_SET_HANDLE_EXCEPTION (except);
477
478 return 0;
479}
480
481/* Python function to get the commands attached to a breakpoint. */
482static PyObject *
483bppy_get_commands (PyObject *self, void *closure)
484{
4cb0213d 485 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
486 struct breakpoint *bp = self_bp->bp;
487 long length;
adc36818
PM
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
79a45e25 501 ui_out_redirect (current_uiout, string_file);
492d29ea 502 TRY
adc36818 503 {
79a45e25 504 print_command_lines (current_uiout, breakpoint_commands (bp), 0);
adc36818 505 }
492d29ea 506 CATCH (except, RETURN_MASK_ALL)
b862ce75 507 {
6c63c96a 508 ui_out_redirect (current_uiout, NULL);
b862ce75 509 do_cleanups (chain);
f3300387
TT
510 gdbpy_convert_exception (except);
511 return NULL;
b862ce75 512 }
492d29ea 513 END_CATCH
adc36818 514
6c63c96a 515 ui_out_redirect (current_uiout, NULL);
4c2d5724
MS
516 cmdstr = ui_file_xstrdup (string_file, &length);
517 make_cleanup (xfree, cmdstr);
adc36818
PM
518 result = PyString_Decode (cmdstr, strlen (cmdstr), host_charset (), NULL);
519 do_cleanups (chain);
adc36818
PM
520 return result;
521}
522
523/* Python function to get the breakpoint type. */
524static PyObject *
525bppy_get_type (PyObject *self, void *closure)
526{
4cb0213d 527 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
528
529 BPPY_REQUIRE_VALID (self_bp);
530
531 return PyInt_FromLong (self_bp->bp->type);
532}
533
84f4c1fe
PM
534/* Python function to get the visibility of the breakpoint. */
535
536static PyObject *
537bppy_get_visibility (PyObject *self, void *closure)
538{
4cb0213d 539 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
84f4c1fe
PM
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
f76c27b5
PM
549/* Python function to determine if the breakpoint is a temporary
550 breakpoint. */
551
552static PyObject *
553bppy_get_temporary (PyObject *self, void *closure)
554{
4cb0213d 555 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
f76c27b5
PM
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
adc36818
PM
566/* Python function to get the breakpoint's number. */
567static PyObject *
568bppy_get_number (PyObject *self, void *closure)
569{
4cb0213d 570 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
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. */
578static PyObject *
579bppy_get_thread (PyObject *self, void *closure)
580{
4cb0213d 581 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
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). */
592static PyObject *
593bppy_get_task (PyObject *self, void *closure)
594{
4cb0213d 595 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
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. */
606static PyObject *
607bppy_get_hit_count (PyObject *self, void *closure)
608{
4cb0213d 609 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
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. */
617static PyObject *
618bppy_get_ignore_count (PyObject *self, void *closure)
619{
4cb0213d 620 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
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. */
7371cf6d
PM
628static int
629bppy_init (PyObject *self, PyObject *args, PyObject *kwargs)
adc36818 630{
f76c27b5
PM
631 static char *keywords[] = { "spec", "type", "wp_class", "internal",
632 "temporary", NULL };
ddd49eee 633 const char *spec;
adc36818
PM
634 int type = bp_breakpoint;
635 int access_type = hw_write;
84f4c1fe 636 PyObject *internal = NULL;
f76c27b5 637 PyObject *temporary = NULL;
84f4c1fe 638 int internal_bp = 0;
f76c27b5 639 int temporary_bp = 0;
adc36818 640
f76c27b5
PM
641 if (! PyArg_ParseTupleAndKeywords (args, kwargs, "s|iiOO", keywords,
642 &spec, &type, &access_type,
643 &internal, &temporary))
7371cf6d 644 return -1;
adc36818 645
84f4c1fe
PM
646 if (internal)
647 {
648 internal_bp = PyObject_IsTrue (internal);
649 if (internal_bp == -1)
7371cf6d 650 return -1;
84f4c1fe
PM
651 }
652
f76c27b5
PM
653 if (temporary != NULL)
654 {
655 temporary_bp = PyObject_IsTrue (temporary);
656 if (temporary_bp == -1)
657 return -1;
658 }
659
4cb0213d 660 bppy_pending_object = (gdbpy_breakpoint_object *) self;
adc36818
PM
661 bppy_pending_object->number = -1;
662 bppy_pending_object->bp = NULL;
256458bc 663
492d29ea 664 TRY
adc36818 665 {
9f61929f 666 char *copy = xstrdup (skip_spaces_const (spec));
ddd49eee
TT
667 struct cleanup *cleanup = make_cleanup (xfree, copy);
668
adc36818
PM
669 switch (type)
670 {
671 case bp_breakpoint:
672 {
f00aae0f
KS
673 struct event_location *location;
674
9f61929f
KS
675 location
676 = string_to_event_location_basic (&copy, current_language);
f00aae0f 677 make_cleanup_delete_event_location (location);
adc36818 678 create_breakpoint (python_gdbarch,
f00aae0f 679 location, NULL, -1, NULL,
adc36818 680 0,
f76c27b5 681 temporary_bp, bp_breakpoint,
adc36818
PM
682 0,
683 AUTO_BOOLEAN_TRUE,
348d480f 684 &bkpt_breakpoint_ops,
44f238bb 685 0, 1, internal_bp, 0);
adc36818
PM
686 break;
687 }
688 case bp_watchpoint:
689 {
690 if (access_type == hw_write)
ddd49eee 691 watch_command_wrapper (copy, 0, internal_bp);
adc36818 692 else if (access_type == hw_access)
ddd49eee 693 awatch_command_wrapper (copy, 0, internal_bp);
adc36818 694 else if (access_type == hw_read)
ddd49eee 695 rwatch_command_wrapper (copy, 0, internal_bp);
adc36818
PM
696 else
697 error(_("Cannot understand watchpoint access type."));
698 break;
699 }
700 default:
701 error(_("Do not understand breakpoint type to set."));
702 }
ddd49eee
TT
703
704 do_cleanups (cleanup);
adc36818 705 }
492d29ea 706 CATCH (except, RETURN_MASK_ALL)
adc36818 707 {
7371cf6d
PM
708 PyErr_Format (except.reason == RETURN_QUIT
709 ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
710 "%s", except.message);
711 return -1;
adc36818 712 }
492d29ea 713 END_CATCH
adc36818 714
4cb0213d 715 BPPY_SET_REQUIRE_VALID ((gdbpy_breakpoint_object *) self);
7371cf6d 716 return 0;
adc36818
PM
717}
718
719\f
720
84f4c1fe
PM
721static int
722build_bp_list (struct breakpoint *b, void *arg)
723{
19ba03f4 724 PyObject *list = (PyObject *) arg;
50389644 725 PyObject *bp = (PyObject *) b->py_bp_object;
84f4c1fe
PM
726 int iserr = 0;
727
728 /* Not all breakpoints will have a companion Python object.
729 Only breakpoints that were created via bppy_new, or
730 breakpoints that were created externally and are tracked by
731 the Python Scripting API. */
732 if (bp)
733 iserr = PyList_Append (list, bp);
734
735 if (iserr == -1)
736 return 1;
737
738 return 0;
739}
740
adc36818
PM
741/* Static function to return a tuple holding all breakpoints. */
742
743PyObject *
744gdbpy_breakpoints (PyObject *self, PyObject *args)
745{
27ca1a5b 746 PyObject *list, *tuple;
adc36818
PM
747
748 if (bppy_live == 0)
749 Py_RETURN_NONE;
750
84f4c1fe
PM
751 list = PyList_New (0);
752 if (!list)
753 return NULL;
d59b6f6c 754
84f4c1fe
PM
755 /* If iteratre_over_breakpoints returns non NULL it signals an error
756 condition. In that case abandon building the list and return
757 NULL. */
758 if (iterate_over_breakpoints (build_bp_list, list) != NULL)
759 {
760 Py_DECREF (list);
761 return NULL;
adc36818 762 }
84f4c1fe 763
27ca1a5b
PM
764 tuple = PyList_AsTuple (list);
765 Py_DECREF (list);
766
767 return tuple;
adc36818
PM
768}
769
7371cf6d
PM
770/* Call the "stop" method (if implemented) in the breakpoint
771 class. If the method returns True, the inferior will be
772 stopped at the breakpoint. Otherwise the inferior will be
773 allowed to continue. */
774
6dddc817
DE
775enum ext_lang_bp_stop
776gdbpy_breakpoint_cond_says_stop (const struct extension_language_defn *extlang,
777 struct breakpoint *b)
7371cf6d 778{
6dddc817
DE
779 int stop;
780 struct gdbpy_breakpoint_object *bp_obj = b->py_bp_object;
7371cf6d 781 PyObject *py_bp = (PyObject *) bp_obj;
6dddc817
DE
782 struct gdbarch *garch;
783 struct cleanup *cleanup;
784
785 if (bp_obj == NULL)
786 return EXT_LANG_BP_STOP_UNSET;
787
788 stop = -1;
789 garch = b->gdbarch ? b->gdbarch : get_current_arch ();
790 cleanup = ensure_python_env (garch, current_language);
7371cf6d 791
cc72b2a2
KP
792 if (bp_obj->is_finish_bp)
793 bpfinishpy_pre_stop_hook (bp_obj);
794
7371cf6d
PM
795 if (PyObject_HasAttrString (py_bp, stop_func))
796 {
797 PyObject *result = PyObject_CallMethod (py_bp, stop_func, NULL);
798
6dddc817 799 stop = 1;
7371cf6d
PM
800 if (result)
801 {
802 int evaluate = PyObject_IsTrue (result);
803
804 if (evaluate == -1)
805 gdbpy_print_stack ();
806
807 /* If the "stop" function returns False that means
808 the Python breakpoint wants GDB to continue. */
809 if (! evaluate)
810 stop = 0;
811
812 Py_DECREF (result);
813 }
814 else
815 gdbpy_print_stack ();
816 }
cc72b2a2
KP
817
818 if (bp_obj->is_finish_bp)
819 bpfinishpy_post_stop_hook (bp_obj);
820
7371cf6d
PM
821 do_cleanups (cleanup);
822
6dddc817
DE
823 if (stop < 0)
824 return EXT_LANG_BP_STOP_UNSET;
825 return stop ? EXT_LANG_BP_STOP_YES : EXT_LANG_BP_STOP_NO;
7371cf6d
PM
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
832int
6dddc817
DE
833gdbpy_breakpoint_has_cond (const struct extension_language_defn *extlang,
834 struct breakpoint *b)
7371cf6d 835{
6dddc817
DE
836 int has_func;
837 PyObject *py_bp;
838 struct gdbarch *garch;
839 struct cleanup *cleanup;
256458bc 840
6dddc817
DE
841 if (b->py_bp_object == NULL)
842 return 0;
7371cf6d 843
6dddc817
DE
844 py_bp = (PyObject *) b->py_bp_object;
845 garch = b->gdbarch ? b->gdbarch : get_current_arch ();
846 cleanup = ensure_python_env (garch, current_language);
847 has_func = PyObject_HasAttrString (py_bp, stop_func);
7371cf6d
PM
848 do_cleanups (cleanup);
849
850 return has_func;
851}
852
adc36818
PM
853\f
854
855/* Event callback functions. */
856
857/* Callback that is used when a breakpoint is created. This function
858 will create a new Python breakpoint object. */
859static void
8d3788bd 860gdbpy_breakpoint_created (struct breakpoint *bp)
adc36818 861{
4cb0213d 862 gdbpy_breakpoint_object *newbp;
adc36818
PM
863 PyGILState_STATE state;
864
f6d90398 865 if (bp->number < 0 && bppy_pending_object == NULL)
84f4c1fe
PM
866 return;
867
256458bc 868 if (bp->type != bp_breakpoint
adc36818 869 && bp->type != bp_watchpoint
256458bc 870 && bp->type != bp_hardware_watchpoint
adc36818
PM
871 && bp->type != bp_read_watchpoint
872 && bp->type != bp_access_watchpoint)
873 return;
874
adc36818
PM
875 state = PyGILState_Ensure ();
876
877 if (bppy_pending_object)
878 {
879 newbp = bppy_pending_object;
880 bppy_pending_object = NULL;
881 }
882 else
4cb0213d 883 newbp = PyObject_New (gdbpy_breakpoint_object, &breakpoint_object_type);
adc36818
PM
884 if (newbp)
885 {
8d3788bd 886 newbp->number = bp->number;
adc36818 887 newbp->bp = bp;
50389644 888 newbp->bp->py_bp_object = newbp;
cc72b2a2 889 newbp->is_finish_bp = 0;
adc36818 890 Py_INCREF (newbp);
84f4c1fe
PM
891 ++bppy_live;
892 }
893 else
894 {
895 PyErr_SetString (PyExc_RuntimeError,
896 _("Error while creating breakpoint from GDB."));
897 gdbpy_print_stack ();
adc36818 898 }
adc36818
PM
899
900 PyGILState_Release (state);
901}
902
903/* Callback that is used when a breakpoint is deleted. This will
904 invalidate the corresponding Python object. */
905static void
8d3788bd 906gdbpy_breakpoint_deleted (struct breakpoint *b)
adc36818 907{
8d3788bd 908 int num = b->number;
adc36818 909 PyGILState_STATE state;
84f4c1fe 910 struct breakpoint *bp = NULL;
4cb0213d 911 gdbpy_breakpoint_object *bp_obj;
adc36818
PM
912
913 state = PyGILState_Ensure ();
84f4c1fe 914 bp = get_breakpoint (num);
d930d06e 915 if (bp)
adc36818 916 {
d930d06e
TT
917 bp_obj = bp->py_bp_object;
918 if (bp_obj)
919 {
920 bp_obj->bp = NULL;
921 --bppy_live;
922 Py_DECREF (bp_obj);
923 }
adc36818
PM
924 }
925 PyGILState_Release (state);
926}
927
928\f
929
930/* Initialize the Python breakpoint code. */
999633ed 931int
adc36818
PM
932gdbpy_initialize_breakpoints (void)
933{
934 int i;
935
6a1b1664 936 breakpoint_object_type.tp_new = PyType_GenericNew;
adc36818 937 if (PyType_Ready (&breakpoint_object_type) < 0)
999633ed 938 return -1;
adc36818 939
aa36459a
TT
940 if (gdb_pymodule_addobject (gdb_module, "Breakpoint",
941 (PyObject *) &breakpoint_object_type) < 0)
999633ed 942 return -1;
adc36818
PM
943
944 observer_attach_breakpoint_created (gdbpy_breakpoint_created);
945 observer_attach_breakpoint_deleted (gdbpy_breakpoint_deleted);
946
947 /* Add breakpoint types constants. */
948 for (i = 0; pybp_codes[i].name; ++i)
949 {
950 if (PyModule_AddIntConstant (gdb_module,
951 /* Cast needed for Python 2.4. */
952 (char *) pybp_codes[i].name,
953 pybp_codes[i].code) < 0)
999633ed 954 return -1;
adc36818
PM
955 }
956
957 /* Add watchpoint types constants. */
958 for (i = 0; pybp_watch_types[i].name; ++i)
959 {
960 if (PyModule_AddIntConstant (gdb_module,
961 /* Cast needed for Python 2.4. */
962 (char *) pybp_watch_types[i].name,
963 pybp_watch_types[i].code) < 0)
999633ed 964 return -1;
adc36818
PM
965 }
966
999633ed 967 return 0;
adc36818
PM
968}
969
970\f
971
7371cf6d
PM
972/* Helper function that overrides this Python object's
973 PyObject_GenericSetAttr to allow extra validation of the attribute
974 being set. */
975
256458bc 976static int
7371cf6d
PM
977local_setattro (PyObject *self, PyObject *name, PyObject *v)
978{
256458bc 979 gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
7371cf6d 980 char *attr = python_string_to_host_string (name);
256458bc 981
7371cf6d
PM
982 if (attr == NULL)
983 return -1;
256458bc 984
7371cf6d 985 /* If the attribute trying to be set is the "stop" method,
6dddc817
DE
986 but we already have a condition set in the CLI or other extension
987 language, disallow this operation. */
988 if (strcmp (attr, stop_func) == 0)
7371cf6d 989 {
6dddc817
DE
990 const struct extension_language_defn *extlang = NULL;
991
992 if (obj->bp->cond_string != NULL)
993 extlang = get_ext_lang_defn (EXT_LANG_GDB);
994 if (extlang == NULL)
995 extlang = get_breakpoint_cond_ext_lang (obj->bp, EXT_LANG_PYTHON);
996 if (extlang != NULL)
997 {
998 char *error_text;
999
1000 xfree (attr);
1001 error_text
1002 = xstrprintf (_("Only one stop condition allowed. There is"
1003 " currently a %s stop condition defined for"
1004 " this breakpoint."),
1005 ext_lang_capitalized_name (extlang));
1006 PyErr_SetString (PyExc_RuntimeError, error_text);
1007 xfree (error_text);
1008 return -1;
1009 }
7371cf6d 1010 }
256458bc 1011
7371cf6d 1012 xfree (attr);
256458bc
DE
1013
1014 return PyObject_GenericSetAttr ((PyObject *)self, name, v);
7371cf6d
PM
1015}
1016
adc36818
PM
1017static PyGetSetDef breakpoint_object_getset[] = {
1018 { "enabled", bppy_get_enabled, bppy_set_enabled,
1019 "Boolean telling whether the breakpoint is enabled.", NULL },
1020 { "silent", bppy_get_silent, bppy_set_silent,
1021 "Boolean telling whether the breakpoint is silent.", NULL },
1022 { "thread", bppy_get_thread, bppy_set_thread,
1023 "Thread ID for the breakpoint.\n\
1024If the value is a thread ID (integer), then this is a thread-specific breakpoint.\n\
1025If the value is None, then this breakpoint is not thread-specific.\n\
1026No other type of value can be used.", NULL },
1027 { "task", bppy_get_task, bppy_set_task,
1028 "Thread ID for the breakpoint.\n\
1029If the value is a task ID (integer), then this is an Ada task-specific breakpoint.\n\
1030If the value is None, then this breakpoint is not task-specific.\n\
1031No other type of value can be used.", NULL },
1032 { "ignore_count", bppy_get_ignore_count, bppy_set_ignore_count,
1033 "Number of times this breakpoint should be automatically continued.",
1034 NULL },
1035 { "number", bppy_get_number, NULL,
1036 "Breakpoint's number assigned by GDB.", NULL },
1037 { "hit_count", bppy_get_hit_count, bppy_set_hit_count,
1038 "Number of times the breakpoint has been hit.\n\
1039Can be set to zero to clear the count. No other value is valid\n\
1040when setting this property.", NULL },
1041 { "location", bppy_get_location, NULL,
1042 "Location of the breakpoint, as specified by the user.", NULL},
1043 { "expression", bppy_get_expression, NULL,
1044 "Expression of the breakpoint, as specified by the user.", NULL},
1045 { "condition", bppy_get_condition, bppy_set_condition,
1046 "Condition of the breakpoint, as specified by the user,\
1047or None if no condition set."},
1048 { "commands", bppy_get_commands, NULL,
1049 "Commands of the breakpoint, as specified by the user."},
1050 { "type", bppy_get_type, NULL,
1051 "Type of breakpoint."},
84f4c1fe
PM
1052 { "visible", bppy_get_visibility, NULL,
1053 "Whether the breakpoint is visible to the user."},
f76c27b5
PM
1054 { "temporary", bppy_get_temporary, NULL,
1055 "Whether this breakpoint is a temporary breakpoint."},
adc36818
PM
1056 { NULL } /* Sentinel. */
1057};
1058
1059static PyMethodDef breakpoint_object_methods[] =
1060{
1061 { "is_valid", bppy_is_valid, METH_NOARGS,
1062 "Return true if this breakpoint is valid, false if not." },
94b6973e
PM
1063 { "delete", bppy_delete_breakpoint, METH_NOARGS,
1064 "Delete the underlying GDB breakpoint." },
adc36818
PM
1065 { NULL } /* Sentinel. */
1066};
1067
cc72b2a2 1068PyTypeObject breakpoint_object_type =
adc36818 1069{
9a27f2c6 1070 PyVarObject_HEAD_INIT (NULL, 0)
adc36818 1071 "gdb.Breakpoint", /*tp_name*/
4cb0213d 1072 sizeof (gdbpy_breakpoint_object), /*tp_basicsize*/
adc36818
PM
1073 0, /*tp_itemsize*/
1074 0, /*tp_dealloc*/
1075 0, /*tp_print*/
1076 0, /*tp_getattr*/
1077 0, /*tp_setattr*/
1078 0, /*tp_compare*/
1079 0, /*tp_repr*/
1080 0, /*tp_as_number*/
1081 0, /*tp_as_sequence*/
1082 0, /*tp_as_mapping*/
1083 0, /*tp_hash */
1084 0, /*tp_call*/
1085 0, /*tp_str*/
1086 0, /*tp_getattro*/
7371cf6d 1087 (setattrofunc)local_setattro, /*tp_setattro */
adc36818 1088 0, /*tp_as_buffer*/
7371cf6d 1089 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
adc36818
PM
1090 "GDB breakpoint object", /* tp_doc */
1091 0, /* tp_traverse */
1092 0, /* tp_clear */
1093 0, /* tp_richcompare */
1094 0, /* tp_weaklistoffset */
1095 0, /* tp_iter */
1096 0, /* tp_iternext */
1097 breakpoint_object_methods, /* tp_methods */
1098 0, /* tp_members */
7371cf6d
PM
1099 breakpoint_object_getset, /* tp_getset */
1100 0, /* tp_base */
1101 0, /* tp_dict */
1102 0, /* tp_descr_get */
1103 0, /* tp_descr_set */
1104 0, /* tp_dictoffset */
1105 bppy_init, /* tp_init */
1106 0, /* tp_alloc */
adc36818 1107};
This page took 0.66251 seconds and 4 git commands to generate.