]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/python/py-breakpoint.c
Update copyright year range in all GDB files
[thirdparty/binutils-gdb.git] / gdb / python / py-breakpoint.c
CommitLineData
adc36818
PM
1/* Python interface to breakpoints
2
e2882c85 3 Copyright (C) 2008-2018 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"
dac790e1 34#include "py-event.h"
824cc835 35#include "linespec.h"
adc36818 36
adc36818
PM
37/* Number of live breakpoints. */
38static int bppy_live;
39
40/* Variables used to pass information between the Breakpoint
41 constructor and the breakpoint-created hook function. */
4cb0213d 42gdbpy_breakpoint_object *bppy_pending_object;
adc36818 43
7371cf6d 44/* Function that is called when a Python condition is evaluated. */
a121b7c1 45static const char stop_func[] = "stop";
7371cf6d 46
adc36818
PM
47/* This is used to initialize various gdb.bp_* constants. */
48struct pybp_code
49{
50 /* The name. */
51 const char *name;
52 /* The code. */
e81b7af8 53 int code;
adc36818
PM
54};
55
56/* Entries related to the type of user set breakpoints. */
57static struct pybp_code pybp_codes[] =
58{
59 { "BP_NONE", bp_none},
60 { "BP_BREAKPOINT", bp_breakpoint},
61 { "BP_WATCHPOINT", bp_watchpoint},
62 { "BP_HARDWARE_WATCHPOINT", bp_hardware_watchpoint},
63 { "BP_READ_WATCHPOINT", bp_read_watchpoint},
64 { "BP_ACCESS_WATCHPOINT", bp_access_watchpoint},
65 {NULL} /* Sentinel. */
66};
67
68/* Entries related to the type of watchpoint. */
69static struct pybp_code pybp_watch_types[] =
70{
71 { "WP_READ", hw_read},
72 { "WP_WRITE", hw_write},
73 { "WP_ACCESS", hw_access},
74 {NULL} /* Sentinel. */
75};
76
adc36818
PM
77/* Python function which checks the validity of a breakpoint object. */
78static PyObject *
79bppy_is_valid (PyObject *self, PyObject *args)
80{
4cb0213d 81 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
82
83 if (self_bp->bp)
84 Py_RETURN_TRUE;
85 Py_RETURN_FALSE;
86}
87
88/* Python function to test whether or not the breakpoint is enabled. */
89static PyObject *
90bppy_get_enabled (PyObject *self, void *closure)
91{
4cb0213d 92 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
93
94 BPPY_REQUIRE_VALID (self_bp);
95 if (! self_bp->bp)
96 Py_RETURN_FALSE;
97 if (self_bp->bp->enable_state == bp_enabled)
98 Py_RETURN_TRUE;
99 Py_RETURN_FALSE;
100}
101
102/* Python function to test whether or not the breakpoint is silent. */
103static PyObject *
104bppy_get_silent (PyObject *self, void *closure)
105{
4cb0213d 106 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
107
108 BPPY_REQUIRE_VALID (self_bp);
109 if (self_bp->bp->silent)
110 Py_RETURN_TRUE;
111 Py_RETURN_FALSE;
112}
113
114/* Python function to set the enabled state of a breakpoint. */
115static int
116bppy_set_enabled (PyObject *self, PyObject *newvalue, void *closure)
117{
4cb0213d 118 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
119 int cmp;
120
121 BPPY_SET_REQUIRE_VALID (self_bp);
122
123 if (newvalue == NULL)
124 {
256458bc 125 PyErr_SetString (PyExc_TypeError,
adc36818
PM
126 _("Cannot delete `enabled' attribute."));
127
128 return -1;
129 }
130 else if (! PyBool_Check (newvalue))
131 {
132 PyErr_SetString (PyExc_TypeError,
133 _("The value of `enabled' must be a boolean."));
134 return -1;
135 }
136
137 cmp = PyObject_IsTrue (newvalue);
138 if (cmp < 0)
139 return -1;
76dce0be 140
492d29ea 141 TRY
76dce0be
PM
142 {
143 if (cmp == 1)
144 enable_breakpoint (self_bp->bp);
145 else
146 disable_breakpoint (self_bp->bp);
147 }
492d29ea
PA
148 CATCH (except, RETURN_MASK_ALL)
149 {
150 GDB_PY_SET_HANDLE_EXCEPTION (except);
151 }
152 END_CATCH
76dce0be 153
adc36818
PM
154 return 0;
155}
156
157/* Python function to set the 'silent' state of a breakpoint. */
158static int
159bppy_set_silent (PyObject *self, PyObject *newvalue, void *closure)
160{
4cb0213d 161 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
162 int cmp;
163
164 BPPY_SET_REQUIRE_VALID (self_bp);
165
166 if (newvalue == NULL)
167 {
256458bc 168 PyErr_SetString (PyExc_TypeError,
adc36818
PM
169 _("Cannot delete `silent' attribute."));
170 return -1;
171 }
172 else if (! PyBool_Check (newvalue))
173 {
174 PyErr_SetString (PyExc_TypeError,
175 _("The value of `silent' must be a boolean."));
176 return -1;
177 }
178
179 cmp = PyObject_IsTrue (newvalue);
180 if (cmp < 0)
181 return -1;
182 else
45a43567 183 breakpoint_set_silent (self_bp->bp, cmp);
adc36818
PM
184
185 return 0;
186}
187
188/* Python function to set the thread of a breakpoint. */
189static int
190bppy_set_thread (PyObject *self, PyObject *newvalue, void *closure)
191{
4cb0213d 192 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
74aedc46 193 long id;
adc36818
PM
194
195 BPPY_SET_REQUIRE_VALID (self_bp);
196
197 if (newvalue == NULL)
198 {
256458bc 199 PyErr_SetString (PyExc_TypeError,
adc36818
PM
200 _("Cannot delete `thread' attribute."));
201 return -1;
202 }
203 else if (PyInt_Check (newvalue))
204 {
74aedc46
TT
205 if (! gdb_py_int_as_long (newvalue, &id))
206 return -1;
207
5d5658a1 208 if (!valid_global_thread_id (id))
adc36818 209 {
256458bc 210 PyErr_SetString (PyExc_RuntimeError,
adc36818
PM
211 _("Invalid thread ID."));
212 return -1;
213 }
214 }
215 else if (newvalue == Py_None)
216 id = -1;
217 else
218 {
219 PyErr_SetString (PyExc_TypeError,
220 _("The value of `thread' must be an integer or None."));
221 return -1;
222 }
223
45a43567 224 breakpoint_set_thread (self_bp->bp, id);
adc36818
PM
225
226 return 0;
227}
228
229/* Python function to set the (Ada) task of a breakpoint. */
230static int
231bppy_set_task (PyObject *self, PyObject *newvalue, void *closure)
232{
4cb0213d 233 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
74aedc46 234 long id;
76dce0be 235 int valid_id = 0;
adc36818
PM
236
237 BPPY_SET_REQUIRE_VALID (self_bp);
238
239 if (newvalue == NULL)
240 {
256458bc 241 PyErr_SetString (PyExc_TypeError,
adc36818
PM
242 _("Cannot delete `task' attribute."));
243 return -1;
244 }
245 else if (PyInt_Check (newvalue))
246 {
74aedc46
TT
247 if (! gdb_py_int_as_long (newvalue, &id))
248 return -1;
249
492d29ea 250 TRY
76dce0be
PM
251 {
252 valid_id = valid_task_id (id);
253 }
492d29ea
PA
254 CATCH (except, RETURN_MASK_ALL)
255 {
256 GDB_PY_SET_HANDLE_EXCEPTION (except);
257 }
258 END_CATCH
76dce0be
PM
259
260 if (! valid_id)
adc36818 261 {
256458bc 262 PyErr_SetString (PyExc_RuntimeError,
adc36818
PM
263 _("Invalid task ID."));
264 return -1;
265 }
266 }
267 else if (newvalue == Py_None)
268 id = 0;
269 else
270 {
271 PyErr_SetString (PyExc_TypeError,
272 _("The value of `task' must be an integer or None."));
273 return -1;
274 }
275
45a43567 276 breakpoint_set_task (self_bp->bp, id);
adc36818
PM
277
278 return 0;
279}
280
94b6973e
PM
281/* Python function which deletes the underlying GDB breakpoint. This
282 triggers the breakpoint_deleted observer which will call
283 gdbpy_breakpoint_deleted; that function cleans up the Python
284 sections. */
285
286static PyObject *
287bppy_delete_breakpoint (PyObject *self, PyObject *args)
288{
4cb0213d 289 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
94b6973e
PM
290
291 BPPY_REQUIRE_VALID (self_bp);
292
492d29ea 293 TRY
76dce0be
PM
294 {
295 delete_breakpoint (self_bp->bp);
296 }
492d29ea
PA
297 CATCH (except, RETURN_MASK_ALL)
298 {
299 GDB_PY_HANDLE_EXCEPTION (except);
300 }
301 END_CATCH
94b6973e
PM
302
303 Py_RETURN_NONE;
304}
305
adc36818
PM
306
307/* Python function to set the ignore count of a breakpoint. */
308static int
309bppy_set_ignore_count (PyObject *self, PyObject *newvalue, void *closure)
310{
4cb0213d 311 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
312 long value;
313
314 BPPY_SET_REQUIRE_VALID (self_bp);
315
316 if (newvalue == NULL)
317 {
318 PyErr_SetString (PyExc_TypeError,
319 _("Cannot delete `ignore_count' attribute."));
320 return -1;
321 }
322 else if (! PyInt_Check (newvalue))
323 {
324 PyErr_SetString (PyExc_TypeError,
325 _("The value of `ignore_count' must be an integer."));
326 return -1;
327 }
328
74aedc46
TT
329 if (! gdb_py_int_as_long (newvalue, &value))
330 return -1;
331
adc36818
PM
332 if (value < 0)
333 value = 0;
5d9c5995 334
492d29ea 335 TRY
5d9c5995
PM
336 {
337 set_ignore_count (self_bp->number, (int) value, 0);
338 }
492d29ea
PA
339 CATCH (except, RETURN_MASK_ALL)
340 {
341 GDB_PY_SET_HANDLE_EXCEPTION (except);
342 }
343 END_CATCH
adc36818
PM
344
345 return 0;
346}
347
348/* Python function to set the hit count of a breakpoint. */
349static int
350bppy_set_hit_count (PyObject *self, PyObject *newvalue, void *closure)
351{
4cb0213d 352 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
353
354 BPPY_SET_REQUIRE_VALID (self_bp);
355
356 if (newvalue == NULL)
357 {
256458bc 358 PyErr_SetString (PyExc_TypeError,
adc36818
PM
359 _("Cannot delete `hit_count' attribute."));
360 return -1;
361 }
74aedc46 362 else
adc36818 363 {
74aedc46
TT
364 long value;
365
366 if (! gdb_py_int_as_long (newvalue, &value))
367 return -1;
368
369 if (value != 0)
370 {
371 PyErr_SetString (PyExc_AttributeError,
372 _("The value of `hit_count' must be zero."));
373 return -1;
374 }
adc36818
PM
375 }
376
377 self_bp->bp->hit_count = 0;
378
379 return 0;
380}
381
382/* Python function to get the location of a breakpoint. */
383static PyObject *
384bppy_get_location (PyObject *self, void *closure)
385{
f00aae0f 386 const char *str;
4cb0213d 387 gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
adc36818
PM
388
389 BPPY_REQUIRE_VALID (obj);
390
391 if (obj->bp->type != bp_breakpoint)
392 Py_RETURN_NONE;
393
d28cd78a 394 str = event_location_to_string (obj->bp->location.get ());
adc36818
PM
395 if (! str)
396 str = "";
4ae6cc19 397 return host_string_to_python_string (str);
adc36818
PM
398}
399
400/* Python function to get the breakpoint expression. */
401static PyObject *
402bppy_get_expression (PyObject *self, void *closure)
403{
a121b7c1 404 const char *str;
4cb0213d 405 gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
3a5c3e22 406 struct watchpoint *wp;
adc36818
PM
407
408 BPPY_REQUIRE_VALID (obj);
409
3a5c3e22 410 if (!is_watchpoint (obj->bp))
adc36818
PM
411 Py_RETURN_NONE;
412
3a5c3e22
PA
413 wp = (struct watchpoint *) obj->bp;
414
415 str = wp->exp_string;
adc36818
PM
416 if (! str)
417 str = "";
418
4ae6cc19 419 return host_string_to_python_string (str);
adc36818
PM
420}
421
422/* Python function to get the condition expression of a breakpoint. */
423static PyObject *
424bppy_get_condition (PyObject *self, void *closure)
425{
426 char *str;
4cb0213d 427 gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
adc36818
PM
428
429 BPPY_REQUIRE_VALID (obj);
430
431 str = obj->bp->cond_string;
432 if (! str)
433 Py_RETURN_NONE;
434
4ae6cc19 435 return host_string_to_python_string (str);
adc36818
PM
436}
437
8dc78533
JK
438/* Returns 0 on success. Returns -1 on error, with a python exception set.
439 */
440
adc36818
PM
441static int
442bppy_set_condition (PyObject *self, PyObject *newvalue, void *closure)
443{
9b972014
TT
444 gdb::unique_xmalloc_ptr<char> exp_holder;
445 const char *exp = NULL;
4cb0213d 446 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
492d29ea 447 struct gdb_exception except = exception_none;
adc36818
PM
448
449 BPPY_SET_REQUIRE_VALID (self_bp);
450
451 if (newvalue == NULL)
452 {
256458bc 453 PyErr_SetString (PyExc_TypeError,
adc36818
PM
454 _("Cannot delete `condition' attribute."));
455 return -1;
456 }
457 else if (newvalue == Py_None)
458 exp = "";
459 else
460 {
9b972014
TT
461 exp_holder = python_string_to_host_string (newvalue);
462 if (exp_holder == NULL)
adc36818 463 return -1;
9b972014 464 exp = exp_holder.get ();
adc36818
PM
465 }
466
492d29ea 467 TRY
adc36818
PM
468 {
469 set_breakpoint_condition (self_bp->bp, exp, 0);
470 }
492d29ea
PA
471 CATCH (ex, RETURN_MASK_ALL)
472 {
473 except = ex;
474 }
475 END_CATCH
f3be5b64 476
adc36818
PM
477 GDB_PY_SET_HANDLE_EXCEPTION (except);
478
479 return 0;
480}
481
482/* Python function to get the commands attached to a breakpoint. */
483static PyObject *
484bppy_get_commands (PyObject *self, void *closure)
485{
4cb0213d 486 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818 487 struct breakpoint *bp = self_bp->bp;
adc36818
PM
488
489 BPPY_REQUIRE_VALID (self_bp);
490
491 if (! self_bp->bp->commands)
492 Py_RETURN_NONE;
493
d7e74731 494 string_file stb;
adc36818 495
d7e74731 496 current_uiout->redirect (&stb);
492d29ea 497 TRY
adc36818 498 {
79a45e25 499 print_command_lines (current_uiout, breakpoint_commands (bp), 0);
adc36818 500 }
492d29ea 501 CATCH (except, RETURN_MASK_ALL)
b862ce75 502 {
112e8700 503 current_uiout->redirect (NULL);
f3300387
TT
504 gdbpy_convert_exception (except);
505 return NULL;
b862ce75 506 }
492d29ea 507 END_CATCH
adc36818 508
112e8700 509 current_uiout->redirect (NULL);
d7e74731 510 return host_string_to_python_string (stb.c_str ());
adc36818
PM
511}
512
513/* Python function to get the breakpoint type. */
514static PyObject *
515bppy_get_type (PyObject *self, void *closure)
516{
4cb0213d 517 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
518
519 BPPY_REQUIRE_VALID (self_bp);
520
521 return PyInt_FromLong (self_bp->bp->type);
522}
523
84f4c1fe
PM
524/* Python function to get the visibility of the breakpoint. */
525
526static PyObject *
527bppy_get_visibility (PyObject *self, void *closure)
528{
4cb0213d 529 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
84f4c1fe
PM
530
531 BPPY_REQUIRE_VALID (self_bp);
532
43684a7b
TT
533 if (user_breakpoint_p (self_bp->bp))
534 Py_RETURN_TRUE;
84f4c1fe 535
43684a7b 536 Py_RETURN_FALSE;
84f4c1fe
PM
537}
538
f76c27b5
PM
539/* Python function to determine if the breakpoint is a temporary
540 breakpoint. */
541
542static PyObject *
543bppy_get_temporary (PyObject *self, void *closure)
544{
4cb0213d 545 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
f76c27b5
PM
546
547 BPPY_REQUIRE_VALID (self_bp);
548
549 if (self_bp->bp->disposition == disp_del
550 || self_bp->bp->disposition == disp_del_at_next_stop)
551 Py_RETURN_TRUE;
552
553 Py_RETURN_FALSE;
554}
555
93daf339
TT
556/* Python function to determine if the breakpoint is a pending
557 breakpoint. */
558
559static PyObject *
560bppy_get_pending (PyObject *self, void *closure)
561{
562 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
563
564 BPPY_REQUIRE_VALID (self_bp);
565
566 if (is_watchpoint (self_bp->bp))
567 Py_RETURN_FALSE;
568 if (pending_breakpoint_p (self_bp->bp))
569 Py_RETURN_TRUE;
570
571 Py_RETURN_FALSE;
572}
573
adc36818
PM
574/* Python function to get the breakpoint's number. */
575static PyObject *
576bppy_get_number (PyObject *self, void *closure)
577{
4cb0213d 578 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
579
580 BPPY_REQUIRE_VALID (self_bp);
581
582 return PyInt_FromLong (self_bp->number);
583}
584
585/* Python function to get the breakpoint's thread ID. */
586static PyObject *
587bppy_get_thread (PyObject *self, void *closure)
588{
4cb0213d 589 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
590
591 BPPY_REQUIRE_VALID (self_bp);
592
593 if (self_bp->bp->thread == -1)
594 Py_RETURN_NONE;
595
596 return PyInt_FromLong (self_bp->bp->thread);
597}
598
599/* Python function to get the breakpoint's task ID (in Ada). */
600static PyObject *
601bppy_get_task (PyObject *self, void *closure)
602{
4cb0213d 603 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
604
605 BPPY_REQUIRE_VALID (self_bp);
606
607 if (self_bp->bp->task == 0)
608 Py_RETURN_NONE;
609
610 return PyInt_FromLong (self_bp->bp->task);
611}
612
613/* Python function to get the breakpoint's hit count. */
614static PyObject *
615bppy_get_hit_count (PyObject *self, void *closure)
616{
4cb0213d 617 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
618
619 BPPY_REQUIRE_VALID (self_bp);
620
621 return PyInt_FromLong (self_bp->bp->hit_count);
622}
623
624/* Python function to get the breakpoint's ignore count. */
625static PyObject *
626bppy_get_ignore_count (PyObject *self, void *closure)
627{
4cb0213d 628 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
629
630 BPPY_REQUIRE_VALID (self_bp);
631
632 return PyInt_FromLong (self_bp->bp->ignore_count);
633}
634
824cc835
PM
635/* Internal function to validate the Python parameters/keywords
636 provided to bppy_init. */
637
638static int
639bppy_init_validate_args (const char *spec, char *source,
640 char *function, char *label,
641 char *line, enum bptype type)
642{
643 /* If spec is defined, ensure that none of the explicit location
644 keywords are also defined. */
645 if (spec != NULL)
646 {
647 if (source != NULL || function != NULL || label != NULL || line != NULL)
648 {
649 PyErr_SetString (PyExc_RuntimeError,
650 _("Breakpoints specified with spec cannot "
651 "have source, function, label or line defined."));
652 return -1;
653 }
654 }
655 else
656 {
657 /* If spec isn't defined, ensure that the user is not trying to
658 define a watchpoint with an explicit location. */
659 if (type == bp_watchpoint)
660 {
661 PyErr_SetString (PyExc_RuntimeError,
662 _("Watchpoints cannot be set by explicit "
663 "location parameters."));
664 return -1;
665 }
666 else
667 {
668 /* Otherwise, ensure some explicit locations are defined. */
669 if (source == NULL && function == NULL && label == NULL
670 && line == NULL)
671 {
672 PyErr_SetString (PyExc_RuntimeError,
673 _("Neither spec nor explicit location set."));
674 return -1;
675 }
676 /* Finally, if source is specified, ensure that line, label
677 or function are specified too. */
678 if (source != NULL && function == NULL && label == NULL
679 && line == NULL)
680 {
681 PyErr_SetString (PyExc_RuntimeError,
682 _("Specifying a source must also include a "
683 "line, label or function."));
684 return -1;
685 }
686 }
687 }
688 return 1;
689}
690
adc36818 691/* Python function to create a new breakpoint. */
7371cf6d
PM
692static int
693bppy_init (PyObject *self, PyObject *args, PyObject *kwargs)
adc36818 694{
2adadf51 695 static const char *keywords[] = { "spec", "type", "wp_class", "internal",
824cc835 696 "temporary","source", "function",
b89641ba 697 "label", "line", "qualified", NULL };
824cc835
PM
698 const char *spec = NULL;
699 enum bptype type = bp_breakpoint;
adc36818 700 int access_type = hw_write;
84f4c1fe 701 PyObject *internal = NULL;
f76c27b5 702 PyObject *temporary = NULL;
824cc835 703 PyObject *lineobj = NULL;;
84f4c1fe 704 int internal_bp = 0;
f76c27b5 705 int temporary_bp = 0;
824cc835
PM
706 gdb::unique_xmalloc_ptr<char> line;
707 char *label = NULL;
708 char *source = NULL;
709 char *function = NULL;
8e557e52 710 PyObject * qualified = NULL;
adc36818 711
8e557e52 712 if (!gdb_PyArg_ParseTupleAndKeywords (args, kwargs, "|siiOOsssOO", keywords,
2adadf51 713 &spec, &type, &access_type,
824cc835
PM
714 &internal,
715 &temporary, &source,
b89641ba
SM
716 &function, &label, &lineobj,
717 &qualified))
7371cf6d 718 return -1;
adc36818 719
824cc835
PM
720
721 if (lineobj != NULL)
722 {
723 if (PyInt_Check (lineobj))
724 line.reset (xstrprintf ("%ld", PyInt_AsLong (lineobj)));
725 else if (PyString_Check (lineobj))
726 line = python_string_to_host_string (lineobj);
727 else
728 {
729 PyErr_SetString (PyExc_RuntimeError,
730 _("Line keyword should be an integer or a string. "));
731 return -1;
732 }
733 }
734
84f4c1fe
PM
735 if (internal)
736 {
737 internal_bp = PyObject_IsTrue (internal);
738 if (internal_bp == -1)
7371cf6d 739 return -1;
84f4c1fe
PM
740 }
741
f76c27b5
PM
742 if (temporary != NULL)
743 {
744 temporary_bp = PyObject_IsTrue (temporary);
745 if (temporary_bp == -1)
746 return -1;
747 }
748
824cc835
PM
749 if (bppy_init_validate_args (spec, source, function, label, line.get (),
750 type) == -1)
751 return -1;
752
4cb0213d 753 bppy_pending_object = (gdbpy_breakpoint_object *) self;
adc36818
PM
754 bppy_pending_object->number = -1;
755 bppy_pending_object->bp = NULL;
256458bc 756
492d29ea 757 TRY
adc36818
PM
758 {
759 switch (type)
760 {
761 case bp_breakpoint:
762 {
824cc835 763 event_location_up location;
b89641ba 764 symbol_name_match_type func_name_match_type
8e557e52 765 = (qualified != NULL && PyObject_IsTrue (qualified)
b89641ba
SM
766 ? symbol_name_match_type::FULL
767 : symbol_name_match_type::WILD);
824cc835
PM
768
769 if (spec != NULL)
770 {
771 gdb::unique_xmalloc_ptr<char>
772 copy_holder (xstrdup (skip_spaces (spec)));
773 const char *copy = copy_holder.get ();
774
775 location = string_to_event_location (&copy,
b89641ba
SM
776 current_language,
777 func_name_match_type);
824cc835
PM
778 }
779 else
780 {
781 struct explicit_location explicit_loc;
782
783 initialize_explicit_location (&explicit_loc);
784 explicit_loc.source_filename = source;
785 explicit_loc.function_name = function;
786 explicit_loc.label_name = label;
787
788 if (line != NULL)
789 explicit_loc.line_offset =
790 linespec_parse_line_offset (line.get ());
791
b89641ba
SM
792 explicit_loc.func_name_match_type = func_name_match_type;
793
824cc835
PM
794 location = new_explicit_location (&explicit_loc);
795 }
796
adc36818 797 create_breakpoint (python_gdbarch,
ffc2605c 798 location.get (), NULL, -1, NULL,
adc36818 799 0,
f76c27b5 800 temporary_bp, bp_breakpoint,
adc36818
PM
801 0,
802 AUTO_BOOLEAN_TRUE,
348d480f 803 &bkpt_breakpoint_ops,
44f238bb 804 0, 1, internal_bp, 0);
adc36818
PM
805 break;
806 }
824cc835 807 case bp_watchpoint:
adc36818 808 {
824cc835
PM
809 gdb::unique_xmalloc_ptr<char>
810 copy_holder (xstrdup (skip_spaces (spec)));
811 char *copy = copy_holder.get ();
812
adc36818 813 if (access_type == hw_write)
ddd49eee 814 watch_command_wrapper (copy, 0, internal_bp);
adc36818 815 else if (access_type == hw_access)
ddd49eee 816 awatch_command_wrapper (copy, 0, internal_bp);
adc36818 817 else if (access_type == hw_read)
ddd49eee 818 rwatch_command_wrapper (copy, 0, internal_bp);
adc36818
PM
819 else
820 error(_("Cannot understand watchpoint access type."));
821 break;
822 }
823 default:
824 error(_("Do not understand breakpoint type to set."));
825 }
826 }
492d29ea 827 CATCH (except, RETURN_MASK_ALL)
adc36818 828 {
f4952523 829 bppy_pending_object = NULL;
7371cf6d
PM
830 PyErr_Format (except.reason == RETURN_QUIT
831 ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
832 "%s", except.message);
833 return -1;
adc36818 834 }
492d29ea 835 END_CATCH
adc36818 836
4cb0213d 837 BPPY_SET_REQUIRE_VALID ((gdbpy_breakpoint_object *) self);
7371cf6d 838 return 0;
adc36818
PM
839}
840
841\f
842
84f4c1fe
PM
843static int
844build_bp_list (struct breakpoint *b, void *arg)
845{
19ba03f4 846 PyObject *list = (PyObject *) arg;
50389644 847 PyObject *bp = (PyObject *) b->py_bp_object;
84f4c1fe
PM
848 int iserr = 0;
849
850 /* Not all breakpoints will have a companion Python object.
851 Only breakpoints that were created via bppy_new, or
852 breakpoints that were created externally and are tracked by
853 the Python Scripting API. */
854 if (bp)
855 iserr = PyList_Append (list, bp);
856
857 if (iserr == -1)
858 return 1;
859
860 return 0;
861}
862
adc36818
PM
863/* Static function to return a tuple holding all breakpoints. */
864
865PyObject *
866gdbpy_breakpoints (PyObject *self, PyObject *args)
867{
adc36818 868 if (bppy_live == 0)
1957f6b8 869 return PyTuple_New (0);
adc36818 870
7780f186 871 gdbpy_ref<> list (PyList_New (0));
bf2a52fa 872 if (list == NULL)
84f4c1fe 873 return NULL;
d59b6f6c 874
1957f6b8 875 /* If iterate_over_breakpoints returns non NULL it signals an error
84f4c1fe
PM
876 condition. In that case abandon building the list and return
877 NULL. */
bf2a52fa
TT
878 if (iterate_over_breakpoints (build_bp_list, list.get ()) != NULL)
879 return NULL;
27ca1a5b 880
bf2a52fa 881 return PyList_AsTuple (list.get ());
adc36818
PM
882}
883
7371cf6d
PM
884/* Call the "stop" method (if implemented) in the breakpoint
885 class. If the method returns True, the inferior will be
886 stopped at the breakpoint. Otherwise the inferior will be
887 allowed to continue. */
888
6dddc817
DE
889enum ext_lang_bp_stop
890gdbpy_breakpoint_cond_says_stop (const struct extension_language_defn *extlang,
891 struct breakpoint *b)
7371cf6d 892{
6dddc817
DE
893 int stop;
894 struct gdbpy_breakpoint_object *bp_obj = b->py_bp_object;
7371cf6d 895 PyObject *py_bp = (PyObject *) bp_obj;
6dddc817 896 struct gdbarch *garch;
6dddc817
DE
897
898 if (bp_obj == NULL)
899 return EXT_LANG_BP_STOP_UNSET;
900
901 stop = -1;
902 garch = b->gdbarch ? b->gdbarch : get_current_arch ();
de2dc875
TT
903
904 gdbpy_enter enter_py (garch, current_language);
7371cf6d 905
cc72b2a2
KP
906 if (bp_obj->is_finish_bp)
907 bpfinishpy_pre_stop_hook (bp_obj);
908
7371cf6d
PM
909 if (PyObject_HasAttrString (py_bp, stop_func))
910 {
7780f186 911 gdbpy_ref<> result (PyObject_CallMethod (py_bp, stop_func, NULL));
7371cf6d 912
6dddc817 913 stop = 1;
64081434 914 if (result != NULL)
7371cf6d 915 {
64081434 916 int evaluate = PyObject_IsTrue (result.get ());
7371cf6d
PM
917
918 if (evaluate == -1)
919 gdbpy_print_stack ();
920
921 /* If the "stop" function returns False that means
922 the Python breakpoint wants GDB to continue. */
923 if (! evaluate)
924 stop = 0;
7371cf6d
PM
925 }
926 else
927 gdbpy_print_stack ();
928 }
cc72b2a2
KP
929
930 if (bp_obj->is_finish_bp)
931 bpfinishpy_post_stop_hook (bp_obj);
932
6dddc817
DE
933 if (stop < 0)
934 return EXT_LANG_BP_STOP_UNSET;
935 return stop ? EXT_LANG_BP_STOP_YES : EXT_LANG_BP_STOP_NO;
7371cf6d
PM
936}
937
938/* Checks if the "stop" method exists in this breakpoint.
939 Used by condition_command to ensure mutual exclusion of breakpoint
940 conditions. */
941
942int
6dddc817
DE
943gdbpy_breakpoint_has_cond (const struct extension_language_defn *extlang,
944 struct breakpoint *b)
7371cf6d 945{
6dddc817
DE
946 PyObject *py_bp;
947 struct gdbarch *garch;
256458bc 948
6dddc817
DE
949 if (b->py_bp_object == NULL)
950 return 0;
7371cf6d 951
6dddc817
DE
952 py_bp = (PyObject *) b->py_bp_object;
953 garch = b->gdbarch ? b->gdbarch : get_current_arch ();
7371cf6d 954
de2dc875
TT
955 gdbpy_enter enter_py (garch, current_language);
956 return PyObject_HasAttrString (py_bp, stop_func);
7371cf6d
PM
957}
958
adc36818
PM
959\f
960
961/* Event callback functions. */
962
963/* Callback that is used when a breakpoint is created. This function
964 will create a new Python breakpoint object. */
965static void
8d3788bd 966gdbpy_breakpoint_created (struct breakpoint *bp)
adc36818 967{
4cb0213d 968 gdbpy_breakpoint_object *newbp;
adc36818
PM
969 PyGILState_STATE state;
970
43684a7b 971 if (!user_breakpoint_p (bp) && bppy_pending_object == NULL)
84f4c1fe
PM
972 return;
973
256458bc 974 if (bp->type != bp_breakpoint
adc36818 975 && bp->type != bp_watchpoint
256458bc 976 && bp->type != bp_hardware_watchpoint
adc36818
PM
977 && bp->type != bp_read_watchpoint
978 && bp->type != bp_access_watchpoint)
979 return;
980
adc36818
PM
981 state = PyGILState_Ensure ();
982
983 if (bppy_pending_object)
984 {
985 newbp = bppy_pending_object;
986 bppy_pending_object = NULL;
987 }
988 else
4cb0213d 989 newbp = PyObject_New (gdbpy_breakpoint_object, &breakpoint_object_type);
adc36818
PM
990 if (newbp)
991 {
8d3788bd 992 newbp->number = bp->number;
adc36818 993 newbp->bp = bp;
50389644 994 newbp->bp->py_bp_object = newbp;
cc72b2a2 995 newbp->is_finish_bp = 0;
adc36818 996 Py_INCREF (newbp);
84f4c1fe
PM
997 ++bppy_live;
998 }
999 else
1000 {
1001 PyErr_SetString (PyExc_RuntimeError,
1002 _("Error while creating breakpoint from GDB."));
1003 gdbpy_print_stack ();
adc36818 1004 }
adc36818 1005
dac790e1
TT
1006 if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_created))
1007 {
dac790e1
TT
1008 if (evpy_emit_event ((PyObject *) newbp,
1009 gdb_py_events.breakpoint_created) < 0)
1010 gdbpy_print_stack ();
1011 }
1012
adc36818
PM
1013 PyGILState_Release (state);
1014}
1015
1016/* Callback that is used when a breakpoint is deleted. This will
1017 invalidate the corresponding Python object. */
1018static void
8d3788bd 1019gdbpy_breakpoint_deleted (struct breakpoint *b)
adc36818 1020{
8d3788bd 1021 int num = b->number;
adc36818 1022 PyGILState_STATE state;
84f4c1fe 1023 struct breakpoint *bp = NULL;
adc36818
PM
1024
1025 state = PyGILState_Ensure ();
84f4c1fe 1026 bp = get_breakpoint (num);
d930d06e 1027 if (bp)
adc36818 1028 {
88b6faea
TT
1029 gdbpy_ref<gdbpy_breakpoint_object> bp_obj (bp->py_bp_object);
1030 if (bp_obj != NULL)
d930d06e 1031 {
dac790e1
TT
1032 if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_deleted))
1033 {
88b6faea 1034 if (evpy_emit_event ((PyObject *) bp_obj.get (),
dac790e1
TT
1035 gdb_py_events.breakpoint_deleted) < 0)
1036 gdbpy_print_stack ();
1037 }
1038
d930d06e
TT
1039 bp_obj->bp = NULL;
1040 --bppy_live;
d930d06e 1041 }
adc36818
PM
1042 }
1043 PyGILState_Release (state);
1044}
1045
dac790e1
TT
1046/* Callback that is used when a breakpoint is modified. */
1047
1048static void
1049gdbpy_breakpoint_modified (struct breakpoint *b)
1050{
1051 int num = b->number;
1052 PyGILState_STATE state;
1053 struct breakpoint *bp = NULL;
dac790e1
TT
1054
1055 state = PyGILState_Ensure ();
1056 bp = get_breakpoint (num);
1057 if (bp)
1058 {
1059 PyObject *bp_obj = (PyObject *) bp->py_bp_object;
1060 if (bp_obj)
1061 {
1062 if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_modified))
1063 {
dac790e1
TT
1064 if (evpy_emit_event (bp_obj,
1065 gdb_py_events.breakpoint_modified) < 0)
1066 gdbpy_print_stack ();
1067 }
1068 }
1069 }
1070 PyGILState_Release (state);
1071}
1072
adc36818
PM
1073\f
1074
1075/* Initialize the Python breakpoint code. */
999633ed 1076int
adc36818
PM
1077gdbpy_initialize_breakpoints (void)
1078{
1079 int i;
1080
6a1b1664 1081 breakpoint_object_type.tp_new = PyType_GenericNew;
adc36818 1082 if (PyType_Ready (&breakpoint_object_type) < 0)
999633ed 1083 return -1;
adc36818 1084
aa36459a
TT
1085 if (gdb_pymodule_addobject (gdb_module, "Breakpoint",
1086 (PyObject *) &breakpoint_object_type) < 0)
999633ed 1087 return -1;
adc36818
PM
1088
1089 observer_attach_breakpoint_created (gdbpy_breakpoint_created);
1090 observer_attach_breakpoint_deleted (gdbpy_breakpoint_deleted);
dac790e1 1091 observer_attach_breakpoint_modified (gdbpy_breakpoint_modified);
adc36818
PM
1092
1093 /* Add breakpoint types constants. */
1094 for (i = 0; pybp_codes[i].name; ++i)
1095 {
1096 if (PyModule_AddIntConstant (gdb_module,
1097 /* Cast needed for Python 2.4. */
1098 (char *) pybp_codes[i].name,
1099 pybp_codes[i].code) < 0)
999633ed 1100 return -1;
adc36818
PM
1101 }
1102
1103 /* Add watchpoint types constants. */
1104 for (i = 0; pybp_watch_types[i].name; ++i)
1105 {
1106 if (PyModule_AddIntConstant (gdb_module,
1107 /* Cast needed for Python 2.4. */
1108 (char *) pybp_watch_types[i].name,
1109 pybp_watch_types[i].code) < 0)
999633ed 1110 return -1;
adc36818
PM
1111 }
1112
999633ed 1113 return 0;
adc36818
PM
1114}
1115
1116\f
1117
7371cf6d
PM
1118/* Helper function that overrides this Python object's
1119 PyObject_GenericSetAttr to allow extra validation of the attribute
1120 being set. */
1121
256458bc 1122static int
7371cf6d
PM
1123local_setattro (PyObject *self, PyObject *name, PyObject *v)
1124{
256458bc 1125 gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
9b972014 1126 gdb::unique_xmalloc_ptr<char> attr (python_string_to_host_string (name));
256458bc 1127
7371cf6d
PM
1128 if (attr == NULL)
1129 return -1;
256458bc 1130
7371cf6d 1131 /* If the attribute trying to be set is the "stop" method,
6dddc817
DE
1132 but we already have a condition set in the CLI or other extension
1133 language, disallow this operation. */
9b972014 1134 if (strcmp (attr.get (), stop_func) == 0)
7371cf6d 1135 {
6dddc817
DE
1136 const struct extension_language_defn *extlang = NULL;
1137
1138 if (obj->bp->cond_string != NULL)
1139 extlang = get_ext_lang_defn (EXT_LANG_GDB);
1140 if (extlang == NULL)
1141 extlang = get_breakpoint_cond_ext_lang (obj->bp, EXT_LANG_PYTHON);
1142 if (extlang != NULL)
1143 {
7f968c89
TT
1144 std::string error_text
1145 = string_printf (_("Only one stop condition allowed. There is"
1146 " currently a %s stop condition defined for"
1147 " this breakpoint."),
1148 ext_lang_capitalized_name (extlang));
1149 PyErr_SetString (PyExc_RuntimeError, error_text.c_str ());
6dddc817
DE
1150 return -1;
1151 }
7371cf6d 1152 }
256458bc 1153
256458bc 1154 return PyObject_GenericSetAttr ((PyObject *)self, name, v);
7371cf6d
PM
1155}
1156
0d1f4ceb 1157static gdb_PyGetSetDef breakpoint_object_getset[] = {
adc36818
PM
1158 { "enabled", bppy_get_enabled, bppy_set_enabled,
1159 "Boolean telling whether the breakpoint is enabled.", NULL },
1160 { "silent", bppy_get_silent, bppy_set_silent,
1161 "Boolean telling whether the breakpoint is silent.", NULL },
1162 { "thread", bppy_get_thread, bppy_set_thread,
1163 "Thread ID for the breakpoint.\n\
1164If the value is a thread ID (integer), then this is a thread-specific breakpoint.\n\
1165If the value is None, then this breakpoint is not thread-specific.\n\
1166No other type of value can be used.", NULL },
1167 { "task", bppy_get_task, bppy_set_task,
1168 "Thread ID for the breakpoint.\n\
1169If the value is a task ID (integer), then this is an Ada task-specific breakpoint.\n\
1170If the value is None, then this breakpoint is not task-specific.\n\
1171No other type of value can be used.", NULL },
1172 { "ignore_count", bppy_get_ignore_count, bppy_set_ignore_count,
1173 "Number of times this breakpoint should be automatically continued.",
1174 NULL },
1175 { "number", bppy_get_number, NULL,
1176 "Breakpoint's number assigned by GDB.", NULL },
1177 { "hit_count", bppy_get_hit_count, bppy_set_hit_count,
1178 "Number of times the breakpoint has been hit.\n\
1179Can be set to zero to clear the count. No other value is valid\n\
1180when setting this property.", NULL },
1181 { "location", bppy_get_location, NULL,
1182 "Location of the breakpoint, as specified by the user.", NULL},
1183 { "expression", bppy_get_expression, NULL,
1184 "Expression of the breakpoint, as specified by the user.", NULL},
1185 { "condition", bppy_get_condition, bppy_set_condition,
1186 "Condition of the breakpoint, as specified by the user,\
1187or None if no condition set."},
1188 { "commands", bppy_get_commands, NULL,
1189 "Commands of the breakpoint, as specified by the user."},
1190 { "type", bppy_get_type, NULL,
1191 "Type of breakpoint."},
84f4c1fe
PM
1192 { "visible", bppy_get_visibility, NULL,
1193 "Whether the breakpoint is visible to the user."},
f76c27b5
PM
1194 { "temporary", bppy_get_temporary, NULL,
1195 "Whether this breakpoint is a temporary breakpoint."},
93daf339
TT
1196 { "pending", bppy_get_pending, NULL,
1197 "Whether this breakpoint is a pending breakpoint."},
adc36818
PM
1198 { NULL } /* Sentinel. */
1199};
1200
1201static PyMethodDef breakpoint_object_methods[] =
1202{
1203 { "is_valid", bppy_is_valid, METH_NOARGS,
1204 "Return true if this breakpoint is valid, false if not." },
94b6973e
PM
1205 { "delete", bppy_delete_breakpoint, METH_NOARGS,
1206 "Delete the underlying GDB breakpoint." },
adc36818
PM
1207 { NULL } /* Sentinel. */
1208};
1209
cc72b2a2 1210PyTypeObject breakpoint_object_type =
adc36818 1211{
9a27f2c6 1212 PyVarObject_HEAD_INIT (NULL, 0)
adc36818 1213 "gdb.Breakpoint", /*tp_name*/
4cb0213d 1214 sizeof (gdbpy_breakpoint_object), /*tp_basicsize*/
adc36818
PM
1215 0, /*tp_itemsize*/
1216 0, /*tp_dealloc*/
1217 0, /*tp_print*/
1218 0, /*tp_getattr*/
1219 0, /*tp_setattr*/
1220 0, /*tp_compare*/
1221 0, /*tp_repr*/
1222 0, /*tp_as_number*/
1223 0, /*tp_as_sequence*/
1224 0, /*tp_as_mapping*/
1225 0, /*tp_hash */
1226 0, /*tp_call*/
1227 0, /*tp_str*/
1228 0, /*tp_getattro*/
7371cf6d 1229 (setattrofunc)local_setattro, /*tp_setattro */
adc36818 1230 0, /*tp_as_buffer*/
7371cf6d 1231 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
adc36818
PM
1232 "GDB breakpoint object", /* tp_doc */
1233 0, /* tp_traverse */
1234 0, /* tp_clear */
1235 0, /* tp_richcompare */
1236 0, /* tp_weaklistoffset */
1237 0, /* tp_iter */
1238 0, /* tp_iternext */
1239 breakpoint_object_methods, /* tp_methods */
1240 0, /* tp_members */
7371cf6d
PM
1241 breakpoint_object_getset, /* tp_getset */
1242 0, /* tp_base */
1243 0, /* tp_dict */
1244 0, /* tp_descr_get */
1245 0, /* tp_descr_set */
1246 0, /* tp_dictoffset */
1247 bppy_init, /* tp_init */
1248 0, /* tp_alloc */
adc36818 1249};