Implement timestamp'ed output on "make check"
[deliverable/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"
76727919 28#include "observable.h"
adc36818
PM
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
2a8be203
TT
394 struct event_location *location = obj->bp->location.get ();
395 /* "catch throw" makes a breakpoint of type bp_breakpoint that does
396 not have a location. */
397 if (location == nullptr)
398 Py_RETURN_NONE;
399 str = event_location_to_string (location);
adc36818
PM
400 if (! str)
401 str = "";
833d985d 402 return host_string_to_python_string (str).release ();
adc36818
PM
403}
404
405/* Python function to get the breakpoint expression. */
406static PyObject *
407bppy_get_expression (PyObject *self, void *closure)
408{
a121b7c1 409 const char *str;
4cb0213d 410 gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
3a5c3e22 411 struct watchpoint *wp;
adc36818
PM
412
413 BPPY_REQUIRE_VALID (obj);
414
3a5c3e22 415 if (!is_watchpoint (obj->bp))
adc36818
PM
416 Py_RETURN_NONE;
417
3a5c3e22
PA
418 wp = (struct watchpoint *) obj->bp;
419
420 str = wp->exp_string;
adc36818
PM
421 if (! str)
422 str = "";
423
833d985d 424 return host_string_to_python_string (str).release ();
adc36818
PM
425}
426
427/* Python function to get the condition expression of a breakpoint. */
428static PyObject *
429bppy_get_condition (PyObject *self, void *closure)
430{
431 char *str;
4cb0213d 432 gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
adc36818
PM
433
434 BPPY_REQUIRE_VALID (obj);
435
436 str = obj->bp->cond_string;
437 if (! str)
438 Py_RETURN_NONE;
439
833d985d 440 return host_string_to_python_string (str).release ();
adc36818
PM
441}
442
8dc78533
JK
443/* Returns 0 on success. Returns -1 on error, with a python exception set.
444 */
445
adc36818
PM
446static int
447bppy_set_condition (PyObject *self, PyObject *newvalue, void *closure)
448{
9b972014
TT
449 gdb::unique_xmalloc_ptr<char> exp_holder;
450 const char *exp = NULL;
4cb0213d 451 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
492d29ea 452 struct gdb_exception except = exception_none;
adc36818
PM
453
454 BPPY_SET_REQUIRE_VALID (self_bp);
455
456 if (newvalue == NULL)
457 {
256458bc 458 PyErr_SetString (PyExc_TypeError,
adc36818
PM
459 _("Cannot delete `condition' attribute."));
460 return -1;
461 }
462 else if (newvalue == Py_None)
463 exp = "";
464 else
465 {
9b972014
TT
466 exp_holder = python_string_to_host_string (newvalue);
467 if (exp_holder == NULL)
adc36818 468 return -1;
9b972014 469 exp = exp_holder.get ();
adc36818
PM
470 }
471
492d29ea 472 TRY
adc36818
PM
473 {
474 set_breakpoint_condition (self_bp->bp, exp, 0);
475 }
492d29ea
PA
476 CATCH (ex, RETURN_MASK_ALL)
477 {
478 except = ex;
479 }
480 END_CATCH
f3be5b64 481
adc36818
PM
482 GDB_PY_SET_HANDLE_EXCEPTION (except);
483
484 return 0;
485}
486
487/* Python function to get the commands attached to a breakpoint. */
488static PyObject *
489bppy_get_commands (PyObject *self, void *closure)
490{
4cb0213d 491 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818 492 struct breakpoint *bp = self_bp->bp;
adc36818
PM
493
494 BPPY_REQUIRE_VALID (self_bp);
495
496 if (! self_bp->bp->commands)
497 Py_RETURN_NONE;
498
d7e74731 499 string_file stb;
adc36818 500
d7e74731 501 current_uiout->redirect (&stb);
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 {
112e8700 508 current_uiout->redirect (NULL);
f3300387
TT
509 gdbpy_convert_exception (except);
510 return NULL;
b862ce75 511 }
492d29ea 512 END_CATCH
adc36818 513
112e8700 514 current_uiout->redirect (NULL);
833d985d 515 return host_string_to_python_string (stb.c_str ()).release ();
adc36818
PM
516}
517
a913fffb
TT
518/* Set the commands attached to a breakpoint. Returns 0 on success.
519 Returns -1 on error, with a python exception set. */
520static int
521bppy_set_commands (PyObject *self, PyObject *newvalue, void *closure)
522{
523 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
a913fffb
TT
524 struct gdb_exception except = exception_none;
525
526 BPPY_SET_REQUIRE_VALID (self_bp);
527
528 gdb::unique_xmalloc_ptr<char> commands
529 (python_string_to_host_string (newvalue));
530 if (commands == nullptr)
531 return -1;
532
533 TRY
534 {
535 bool first = true;
536 char *save_ptr = nullptr;
537 auto reader
538 = [&] ()
539 {
540 const char *result = strtok_r (first ? commands.get () : nullptr,
541 "\n", &save_ptr);
542 first = false;
543 return result;
544 };
545
546 counted_command_line lines = read_command_lines_1 (reader, 1, nullptr);
547 breakpoint_set_commands (self_bp->bp, std::move (lines));
548 }
549 CATCH (ex, RETURN_MASK_ALL)
550 {
551 except = ex;
552 }
553 END_CATCH
554
555 GDB_PY_SET_HANDLE_EXCEPTION (except);
556
557 return 0;
558}
559
adc36818
PM
560/* Python function to get the breakpoint type. */
561static PyObject *
562bppy_get_type (PyObject *self, void *closure)
563{
4cb0213d 564 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
565
566 BPPY_REQUIRE_VALID (self_bp);
567
568 return PyInt_FromLong (self_bp->bp->type);
569}
570
84f4c1fe
PM
571/* Python function to get the visibility of the breakpoint. */
572
573static PyObject *
574bppy_get_visibility (PyObject *self, void *closure)
575{
4cb0213d 576 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
84f4c1fe
PM
577
578 BPPY_REQUIRE_VALID (self_bp);
579
43684a7b
TT
580 if (user_breakpoint_p (self_bp->bp))
581 Py_RETURN_TRUE;
84f4c1fe 582
43684a7b 583 Py_RETURN_FALSE;
84f4c1fe
PM
584}
585
f76c27b5
PM
586/* Python function to determine if the breakpoint is a temporary
587 breakpoint. */
588
589static PyObject *
590bppy_get_temporary (PyObject *self, void *closure)
591{
4cb0213d 592 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
f76c27b5
PM
593
594 BPPY_REQUIRE_VALID (self_bp);
595
596 if (self_bp->bp->disposition == disp_del
597 || self_bp->bp->disposition == disp_del_at_next_stop)
598 Py_RETURN_TRUE;
599
600 Py_RETURN_FALSE;
601}
602
93daf339
TT
603/* Python function to determine if the breakpoint is a pending
604 breakpoint. */
605
606static PyObject *
607bppy_get_pending (PyObject *self, void *closure)
608{
609 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
610
611 BPPY_REQUIRE_VALID (self_bp);
612
613 if (is_watchpoint (self_bp->bp))
614 Py_RETURN_FALSE;
615 if (pending_breakpoint_p (self_bp->bp))
616 Py_RETURN_TRUE;
617
618 Py_RETURN_FALSE;
619}
620
adc36818
PM
621/* Python function to get the breakpoint's number. */
622static PyObject *
623bppy_get_number (PyObject *self, void *closure)
624{
4cb0213d 625 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
626
627 BPPY_REQUIRE_VALID (self_bp);
628
629 return PyInt_FromLong (self_bp->number);
630}
631
632/* Python function to get the breakpoint's thread ID. */
633static PyObject *
634bppy_get_thread (PyObject *self, void *closure)
635{
4cb0213d 636 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
637
638 BPPY_REQUIRE_VALID (self_bp);
639
640 if (self_bp->bp->thread == -1)
641 Py_RETURN_NONE;
642
643 return PyInt_FromLong (self_bp->bp->thread);
644}
645
646/* Python function to get the breakpoint's task ID (in Ada). */
647static PyObject *
648bppy_get_task (PyObject *self, void *closure)
649{
4cb0213d 650 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
651
652 BPPY_REQUIRE_VALID (self_bp);
653
654 if (self_bp->bp->task == 0)
655 Py_RETURN_NONE;
656
657 return PyInt_FromLong (self_bp->bp->task);
658}
659
660/* Python function to get the breakpoint's hit count. */
661static PyObject *
662bppy_get_hit_count (PyObject *self, void *closure)
663{
4cb0213d 664 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
665
666 BPPY_REQUIRE_VALID (self_bp);
667
668 return PyInt_FromLong (self_bp->bp->hit_count);
669}
670
671/* Python function to get the breakpoint's ignore count. */
672static PyObject *
673bppy_get_ignore_count (PyObject *self, void *closure)
674{
4cb0213d 675 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
676
677 BPPY_REQUIRE_VALID (self_bp);
678
679 return PyInt_FromLong (self_bp->bp->ignore_count);
680}
681
824cc835
PM
682/* Internal function to validate the Python parameters/keywords
683 provided to bppy_init. */
684
685static int
686bppy_init_validate_args (const char *spec, char *source,
687 char *function, char *label,
688 char *line, enum bptype type)
689{
690 /* If spec is defined, ensure that none of the explicit location
691 keywords are also defined. */
692 if (spec != NULL)
693 {
694 if (source != NULL || function != NULL || label != NULL || line != NULL)
695 {
696 PyErr_SetString (PyExc_RuntimeError,
697 _("Breakpoints specified with spec cannot "
698 "have source, function, label or line defined."));
699 return -1;
700 }
701 }
702 else
703 {
704 /* If spec isn't defined, ensure that the user is not trying to
705 define a watchpoint with an explicit location. */
706 if (type == bp_watchpoint)
707 {
708 PyErr_SetString (PyExc_RuntimeError,
709 _("Watchpoints cannot be set by explicit "
710 "location parameters."));
711 return -1;
712 }
713 else
714 {
715 /* Otherwise, ensure some explicit locations are defined. */
716 if (source == NULL && function == NULL && label == NULL
717 && line == NULL)
718 {
719 PyErr_SetString (PyExc_RuntimeError,
720 _("Neither spec nor explicit location set."));
721 return -1;
722 }
723 /* Finally, if source is specified, ensure that line, label
724 or function are specified too. */
725 if (source != NULL && function == NULL && label == NULL
726 && line == NULL)
727 {
728 PyErr_SetString (PyExc_RuntimeError,
729 _("Specifying a source must also include a "
730 "line, label or function."));
731 return -1;
732 }
733 }
734 }
735 return 1;
736}
737
adc36818 738/* Python function to create a new breakpoint. */
7371cf6d
PM
739static int
740bppy_init (PyObject *self, PyObject *args, PyObject *kwargs)
adc36818 741{
2adadf51 742 static const char *keywords[] = { "spec", "type", "wp_class", "internal",
824cc835 743 "temporary","source", "function",
b89641ba 744 "label", "line", "qualified", NULL };
824cc835
PM
745 const char *spec = NULL;
746 enum bptype type = bp_breakpoint;
adc36818 747 int access_type = hw_write;
84f4c1fe 748 PyObject *internal = NULL;
f76c27b5 749 PyObject *temporary = NULL;
824cc835 750 PyObject *lineobj = NULL;;
84f4c1fe 751 int internal_bp = 0;
f76c27b5 752 int temporary_bp = 0;
824cc835
PM
753 gdb::unique_xmalloc_ptr<char> line;
754 char *label = NULL;
755 char *source = NULL;
756 char *function = NULL;
8e557e52 757 PyObject * qualified = NULL;
adc36818 758
8e557e52 759 if (!gdb_PyArg_ParseTupleAndKeywords (args, kwargs, "|siiOOsssOO", keywords,
2adadf51 760 &spec, &type, &access_type,
824cc835
PM
761 &internal,
762 &temporary, &source,
b89641ba
SM
763 &function, &label, &lineobj,
764 &qualified))
7371cf6d 765 return -1;
adc36818 766
824cc835
PM
767
768 if (lineobj != NULL)
769 {
770 if (PyInt_Check (lineobj))
771 line.reset (xstrprintf ("%ld", PyInt_AsLong (lineobj)));
772 else if (PyString_Check (lineobj))
773 line = python_string_to_host_string (lineobj);
774 else
775 {
776 PyErr_SetString (PyExc_RuntimeError,
777 _("Line keyword should be an integer or a string. "));
778 return -1;
779 }
780 }
781
84f4c1fe
PM
782 if (internal)
783 {
784 internal_bp = PyObject_IsTrue (internal);
785 if (internal_bp == -1)
7371cf6d 786 return -1;
84f4c1fe
PM
787 }
788
f76c27b5
PM
789 if (temporary != NULL)
790 {
791 temporary_bp = PyObject_IsTrue (temporary);
792 if (temporary_bp == -1)
793 return -1;
794 }
795
824cc835
PM
796 if (bppy_init_validate_args (spec, source, function, label, line.get (),
797 type) == -1)
798 return -1;
799
4cb0213d 800 bppy_pending_object = (gdbpy_breakpoint_object *) self;
adc36818
PM
801 bppy_pending_object->number = -1;
802 bppy_pending_object->bp = NULL;
256458bc 803
492d29ea 804 TRY
adc36818
PM
805 {
806 switch (type)
807 {
808 case bp_breakpoint:
809 {
824cc835 810 event_location_up location;
b89641ba 811 symbol_name_match_type func_name_match_type
8e557e52 812 = (qualified != NULL && PyObject_IsTrue (qualified)
b89641ba
SM
813 ? symbol_name_match_type::FULL
814 : symbol_name_match_type::WILD);
824cc835
PM
815
816 if (spec != NULL)
817 {
818 gdb::unique_xmalloc_ptr<char>
819 copy_holder (xstrdup (skip_spaces (spec)));
820 const char *copy = copy_holder.get ();
821
822 location = string_to_event_location (&copy,
b89641ba
SM
823 current_language,
824 func_name_match_type);
824cc835
PM
825 }
826 else
827 {
828 struct explicit_location explicit_loc;
829
830 initialize_explicit_location (&explicit_loc);
831 explicit_loc.source_filename = source;
832 explicit_loc.function_name = function;
833 explicit_loc.label_name = label;
834
835 if (line != NULL)
836 explicit_loc.line_offset =
837 linespec_parse_line_offset (line.get ());
838
b89641ba
SM
839 explicit_loc.func_name_match_type = func_name_match_type;
840
824cc835
PM
841 location = new_explicit_location (&explicit_loc);
842 }
843
adc36818 844 create_breakpoint (python_gdbarch,
ffc2605c 845 location.get (), NULL, -1, NULL,
adc36818 846 0,
f76c27b5 847 temporary_bp, bp_breakpoint,
adc36818
PM
848 0,
849 AUTO_BOOLEAN_TRUE,
348d480f 850 &bkpt_breakpoint_ops,
44f238bb 851 0, 1, internal_bp, 0);
adc36818
PM
852 break;
853 }
824cc835 854 case bp_watchpoint:
adc36818 855 {
824cc835
PM
856 gdb::unique_xmalloc_ptr<char>
857 copy_holder (xstrdup (skip_spaces (spec)));
858 char *copy = copy_holder.get ();
859
adc36818 860 if (access_type == hw_write)
ddd49eee 861 watch_command_wrapper (copy, 0, internal_bp);
adc36818 862 else if (access_type == hw_access)
ddd49eee 863 awatch_command_wrapper (copy, 0, internal_bp);
adc36818 864 else if (access_type == hw_read)
ddd49eee 865 rwatch_command_wrapper (copy, 0, internal_bp);
adc36818
PM
866 else
867 error(_("Cannot understand watchpoint access type."));
868 break;
869 }
870 default:
871 error(_("Do not understand breakpoint type to set."));
872 }
873 }
492d29ea 874 CATCH (except, RETURN_MASK_ALL)
adc36818 875 {
f4952523 876 bppy_pending_object = NULL;
7371cf6d
PM
877 PyErr_Format (except.reason == RETURN_QUIT
878 ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
879 "%s", except.message);
880 return -1;
adc36818 881 }
492d29ea 882 END_CATCH
adc36818 883
4cb0213d 884 BPPY_SET_REQUIRE_VALID ((gdbpy_breakpoint_object *) self);
7371cf6d 885 return 0;
adc36818
PM
886}
887
888\f
889
84f4c1fe
PM
890static int
891build_bp_list (struct breakpoint *b, void *arg)
892{
19ba03f4 893 PyObject *list = (PyObject *) arg;
50389644 894 PyObject *bp = (PyObject *) b->py_bp_object;
84f4c1fe
PM
895 int iserr = 0;
896
897 /* Not all breakpoints will have a companion Python object.
898 Only breakpoints that were created via bppy_new, or
899 breakpoints that were created externally and are tracked by
900 the Python Scripting API. */
901 if (bp)
902 iserr = PyList_Append (list, bp);
903
904 if (iserr == -1)
905 return 1;
906
907 return 0;
908}
909
adc36818
PM
910/* Static function to return a tuple holding all breakpoints. */
911
912PyObject *
913gdbpy_breakpoints (PyObject *self, PyObject *args)
914{
adc36818 915 if (bppy_live == 0)
1957f6b8 916 return PyTuple_New (0);
adc36818 917
7780f186 918 gdbpy_ref<> list (PyList_New (0));
bf2a52fa 919 if (list == NULL)
84f4c1fe 920 return NULL;
d59b6f6c 921
1957f6b8 922 /* If iterate_over_breakpoints returns non NULL it signals an error
84f4c1fe
PM
923 condition. In that case abandon building the list and return
924 NULL. */
bf2a52fa
TT
925 if (iterate_over_breakpoints (build_bp_list, list.get ()) != NULL)
926 return NULL;
27ca1a5b 927
bf2a52fa 928 return PyList_AsTuple (list.get ());
adc36818
PM
929}
930
7371cf6d
PM
931/* Call the "stop" method (if implemented) in the breakpoint
932 class. If the method returns True, the inferior will be
933 stopped at the breakpoint. Otherwise the inferior will be
934 allowed to continue. */
935
6dddc817
DE
936enum ext_lang_bp_stop
937gdbpy_breakpoint_cond_says_stop (const struct extension_language_defn *extlang,
938 struct breakpoint *b)
7371cf6d 939{
6dddc817
DE
940 int stop;
941 struct gdbpy_breakpoint_object *bp_obj = b->py_bp_object;
7371cf6d 942 PyObject *py_bp = (PyObject *) bp_obj;
6dddc817 943 struct gdbarch *garch;
6dddc817
DE
944
945 if (bp_obj == NULL)
946 return EXT_LANG_BP_STOP_UNSET;
947
948 stop = -1;
949 garch = b->gdbarch ? b->gdbarch : get_current_arch ();
de2dc875
TT
950
951 gdbpy_enter enter_py (garch, current_language);
7371cf6d 952
cc72b2a2
KP
953 if (bp_obj->is_finish_bp)
954 bpfinishpy_pre_stop_hook (bp_obj);
955
7371cf6d
PM
956 if (PyObject_HasAttrString (py_bp, stop_func))
957 {
7780f186 958 gdbpy_ref<> result (PyObject_CallMethod (py_bp, stop_func, NULL));
7371cf6d 959
6dddc817 960 stop = 1;
64081434 961 if (result != NULL)
7371cf6d 962 {
64081434 963 int evaluate = PyObject_IsTrue (result.get ());
7371cf6d
PM
964
965 if (evaluate == -1)
966 gdbpy_print_stack ();
967
968 /* If the "stop" function returns False that means
969 the Python breakpoint wants GDB to continue. */
970 if (! evaluate)
971 stop = 0;
7371cf6d
PM
972 }
973 else
974 gdbpy_print_stack ();
975 }
cc72b2a2
KP
976
977 if (bp_obj->is_finish_bp)
978 bpfinishpy_post_stop_hook (bp_obj);
979
6dddc817
DE
980 if (stop < 0)
981 return EXT_LANG_BP_STOP_UNSET;
982 return stop ? EXT_LANG_BP_STOP_YES : EXT_LANG_BP_STOP_NO;
7371cf6d
PM
983}
984
985/* Checks if the "stop" method exists in this breakpoint.
986 Used by condition_command to ensure mutual exclusion of breakpoint
987 conditions. */
988
989int
6dddc817
DE
990gdbpy_breakpoint_has_cond (const struct extension_language_defn *extlang,
991 struct breakpoint *b)
7371cf6d 992{
6dddc817
DE
993 PyObject *py_bp;
994 struct gdbarch *garch;
256458bc 995
6dddc817
DE
996 if (b->py_bp_object == NULL)
997 return 0;
7371cf6d 998
6dddc817
DE
999 py_bp = (PyObject *) b->py_bp_object;
1000 garch = b->gdbarch ? b->gdbarch : get_current_arch ();
7371cf6d 1001
de2dc875
TT
1002 gdbpy_enter enter_py (garch, current_language);
1003 return PyObject_HasAttrString (py_bp, stop_func);
7371cf6d
PM
1004}
1005
adc36818
PM
1006\f
1007
1008/* Event callback functions. */
1009
1010/* Callback that is used when a breakpoint is created. This function
1011 will create a new Python breakpoint object. */
1012static void
8d3788bd 1013gdbpy_breakpoint_created (struct breakpoint *bp)
adc36818 1014{
4cb0213d 1015 gdbpy_breakpoint_object *newbp;
adc36818
PM
1016 PyGILState_STATE state;
1017
43684a7b 1018 if (!user_breakpoint_p (bp) && bppy_pending_object == NULL)
84f4c1fe
PM
1019 return;
1020
256458bc 1021 if (bp->type != bp_breakpoint
adc36818 1022 && bp->type != bp_watchpoint
256458bc 1023 && bp->type != bp_hardware_watchpoint
adc36818
PM
1024 && bp->type != bp_read_watchpoint
1025 && bp->type != bp_access_watchpoint)
1026 return;
1027
adc36818
PM
1028 state = PyGILState_Ensure ();
1029
1030 if (bppy_pending_object)
1031 {
1032 newbp = bppy_pending_object;
1033 bppy_pending_object = NULL;
1034 }
1035 else
4cb0213d 1036 newbp = PyObject_New (gdbpy_breakpoint_object, &breakpoint_object_type);
adc36818
PM
1037 if (newbp)
1038 {
8d3788bd 1039 newbp->number = bp->number;
adc36818 1040 newbp->bp = bp;
50389644 1041 newbp->bp->py_bp_object = newbp;
cc72b2a2 1042 newbp->is_finish_bp = 0;
adc36818 1043 Py_INCREF (newbp);
84f4c1fe
PM
1044 ++bppy_live;
1045 }
1046 else
1047 {
1048 PyErr_SetString (PyExc_RuntimeError,
1049 _("Error while creating breakpoint from GDB."));
1050 gdbpy_print_stack ();
adc36818 1051 }
adc36818 1052
dac790e1
TT
1053 if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_created))
1054 {
dac790e1
TT
1055 if (evpy_emit_event ((PyObject *) newbp,
1056 gdb_py_events.breakpoint_created) < 0)
1057 gdbpy_print_stack ();
1058 }
1059
adc36818
PM
1060 PyGILState_Release (state);
1061}
1062
1063/* Callback that is used when a breakpoint is deleted. This will
1064 invalidate the corresponding Python object. */
1065static void
8d3788bd 1066gdbpy_breakpoint_deleted (struct breakpoint *b)
adc36818 1067{
8d3788bd 1068 int num = b->number;
adc36818 1069 PyGILState_STATE state;
84f4c1fe 1070 struct breakpoint *bp = NULL;
adc36818
PM
1071
1072 state = PyGILState_Ensure ();
84f4c1fe 1073 bp = get_breakpoint (num);
d930d06e 1074 if (bp)
adc36818 1075 {
88b6faea
TT
1076 gdbpy_ref<gdbpy_breakpoint_object> bp_obj (bp->py_bp_object);
1077 if (bp_obj != NULL)
d930d06e 1078 {
dac790e1
TT
1079 if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_deleted))
1080 {
88b6faea 1081 if (evpy_emit_event ((PyObject *) bp_obj.get (),
dac790e1
TT
1082 gdb_py_events.breakpoint_deleted) < 0)
1083 gdbpy_print_stack ();
1084 }
1085
d930d06e
TT
1086 bp_obj->bp = NULL;
1087 --bppy_live;
d930d06e 1088 }
adc36818
PM
1089 }
1090 PyGILState_Release (state);
1091}
1092
dac790e1
TT
1093/* Callback that is used when a breakpoint is modified. */
1094
1095static void
1096gdbpy_breakpoint_modified (struct breakpoint *b)
1097{
1098 int num = b->number;
1099 PyGILState_STATE state;
1100 struct breakpoint *bp = NULL;
dac790e1
TT
1101
1102 state = PyGILState_Ensure ();
1103 bp = get_breakpoint (num);
1104 if (bp)
1105 {
1106 PyObject *bp_obj = (PyObject *) bp->py_bp_object;
1107 if (bp_obj)
1108 {
1109 if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_modified))
1110 {
dac790e1
TT
1111 if (evpy_emit_event (bp_obj,
1112 gdb_py_events.breakpoint_modified) < 0)
1113 gdbpy_print_stack ();
1114 }
1115 }
1116 }
1117 PyGILState_Release (state);
1118}
1119
adc36818
PM
1120\f
1121
1122/* Initialize the Python breakpoint code. */
999633ed 1123int
adc36818
PM
1124gdbpy_initialize_breakpoints (void)
1125{
1126 int i;
1127
6a1b1664 1128 breakpoint_object_type.tp_new = PyType_GenericNew;
adc36818 1129 if (PyType_Ready (&breakpoint_object_type) < 0)
999633ed 1130 return -1;
adc36818 1131
aa36459a
TT
1132 if (gdb_pymodule_addobject (gdb_module, "Breakpoint",
1133 (PyObject *) &breakpoint_object_type) < 0)
999633ed 1134 return -1;
adc36818 1135
76727919
TT
1136 gdb::observers::breakpoint_created.attach (gdbpy_breakpoint_created);
1137 gdb::observers::breakpoint_deleted.attach (gdbpy_breakpoint_deleted);
1138 gdb::observers::breakpoint_modified.attach (gdbpy_breakpoint_modified);
adc36818
PM
1139
1140 /* Add breakpoint types constants. */
1141 for (i = 0; pybp_codes[i].name; ++i)
1142 {
1143 if (PyModule_AddIntConstant (gdb_module,
1144 /* Cast needed for Python 2.4. */
1145 (char *) pybp_codes[i].name,
1146 pybp_codes[i].code) < 0)
999633ed 1147 return -1;
adc36818
PM
1148 }
1149
1150 /* Add watchpoint types constants. */
1151 for (i = 0; pybp_watch_types[i].name; ++i)
1152 {
1153 if (PyModule_AddIntConstant (gdb_module,
1154 /* Cast needed for Python 2.4. */
1155 (char *) pybp_watch_types[i].name,
1156 pybp_watch_types[i].code) < 0)
999633ed 1157 return -1;
adc36818
PM
1158 }
1159
999633ed 1160 return 0;
adc36818
PM
1161}
1162
1163\f
1164
7371cf6d
PM
1165/* Helper function that overrides this Python object's
1166 PyObject_GenericSetAttr to allow extra validation of the attribute
1167 being set. */
1168
256458bc 1169static int
7371cf6d
PM
1170local_setattro (PyObject *self, PyObject *name, PyObject *v)
1171{
256458bc 1172 gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
9b972014 1173 gdb::unique_xmalloc_ptr<char> attr (python_string_to_host_string (name));
256458bc 1174
7371cf6d
PM
1175 if (attr == NULL)
1176 return -1;
256458bc 1177
7371cf6d 1178 /* If the attribute trying to be set is the "stop" method,
6dddc817
DE
1179 but we already have a condition set in the CLI or other extension
1180 language, disallow this operation. */
9b972014 1181 if (strcmp (attr.get (), stop_func) == 0)
7371cf6d 1182 {
6dddc817
DE
1183 const struct extension_language_defn *extlang = NULL;
1184
1185 if (obj->bp->cond_string != NULL)
1186 extlang = get_ext_lang_defn (EXT_LANG_GDB);
1187 if (extlang == NULL)
1188 extlang = get_breakpoint_cond_ext_lang (obj->bp, EXT_LANG_PYTHON);
1189 if (extlang != NULL)
1190 {
7f968c89
TT
1191 std::string error_text
1192 = string_printf (_("Only one stop condition allowed. There is"
1193 " currently a %s stop condition defined for"
1194 " this breakpoint."),
1195 ext_lang_capitalized_name (extlang));
1196 PyErr_SetString (PyExc_RuntimeError, error_text.c_str ());
6dddc817
DE
1197 return -1;
1198 }
7371cf6d 1199 }
256458bc 1200
256458bc 1201 return PyObject_GenericSetAttr ((PyObject *)self, name, v);
7371cf6d
PM
1202}
1203
0d1f4ceb 1204static gdb_PyGetSetDef breakpoint_object_getset[] = {
adc36818
PM
1205 { "enabled", bppy_get_enabled, bppy_set_enabled,
1206 "Boolean telling whether the breakpoint is enabled.", NULL },
1207 { "silent", bppy_get_silent, bppy_set_silent,
1208 "Boolean telling whether the breakpoint is silent.", NULL },
1209 { "thread", bppy_get_thread, bppy_set_thread,
1210 "Thread ID for the breakpoint.\n\
1211If the value is a thread ID (integer), then this is a thread-specific breakpoint.\n\
1212If the value is None, then this breakpoint is not thread-specific.\n\
1213No other type of value can be used.", NULL },
1214 { "task", bppy_get_task, bppy_set_task,
1215 "Thread ID for the breakpoint.\n\
1216If the value is a task ID (integer), then this is an Ada task-specific breakpoint.\n\
1217If the value is None, then this breakpoint is not task-specific.\n\
1218No other type of value can be used.", NULL },
1219 { "ignore_count", bppy_get_ignore_count, bppy_set_ignore_count,
1220 "Number of times this breakpoint should be automatically continued.",
1221 NULL },
1222 { "number", bppy_get_number, NULL,
1223 "Breakpoint's number assigned by GDB.", NULL },
1224 { "hit_count", bppy_get_hit_count, bppy_set_hit_count,
1225 "Number of times the breakpoint has been hit.\n\
1226Can be set to zero to clear the count. No other value is valid\n\
1227when setting this property.", NULL },
1228 { "location", bppy_get_location, NULL,
1229 "Location of the breakpoint, as specified by the user.", NULL},
1230 { "expression", bppy_get_expression, NULL,
1231 "Expression of the breakpoint, as specified by the user.", NULL},
1232 { "condition", bppy_get_condition, bppy_set_condition,
1233 "Condition of the breakpoint, as specified by the user,\
1234or None if no condition set."},
a913fffb 1235 { "commands", bppy_get_commands, bppy_set_commands,
adc36818
PM
1236 "Commands of the breakpoint, as specified by the user."},
1237 { "type", bppy_get_type, NULL,
1238 "Type of breakpoint."},
84f4c1fe
PM
1239 { "visible", bppy_get_visibility, NULL,
1240 "Whether the breakpoint is visible to the user."},
f76c27b5
PM
1241 { "temporary", bppy_get_temporary, NULL,
1242 "Whether this breakpoint is a temporary breakpoint."},
93daf339
TT
1243 { "pending", bppy_get_pending, NULL,
1244 "Whether this breakpoint is a pending breakpoint."},
adc36818
PM
1245 { NULL } /* Sentinel. */
1246};
1247
1248static PyMethodDef breakpoint_object_methods[] =
1249{
1250 { "is_valid", bppy_is_valid, METH_NOARGS,
1251 "Return true if this breakpoint is valid, false if not." },
94b6973e
PM
1252 { "delete", bppy_delete_breakpoint, METH_NOARGS,
1253 "Delete the underlying GDB breakpoint." },
adc36818
PM
1254 { NULL } /* Sentinel. */
1255};
1256
cc72b2a2 1257PyTypeObject breakpoint_object_type =
adc36818 1258{
9a27f2c6 1259 PyVarObject_HEAD_INIT (NULL, 0)
adc36818 1260 "gdb.Breakpoint", /*tp_name*/
4cb0213d 1261 sizeof (gdbpy_breakpoint_object), /*tp_basicsize*/
adc36818
PM
1262 0, /*tp_itemsize*/
1263 0, /*tp_dealloc*/
1264 0, /*tp_print*/
1265 0, /*tp_getattr*/
1266 0, /*tp_setattr*/
1267 0, /*tp_compare*/
1268 0, /*tp_repr*/
1269 0, /*tp_as_number*/
1270 0, /*tp_as_sequence*/
1271 0, /*tp_as_mapping*/
1272 0, /*tp_hash */
1273 0, /*tp_call*/
1274 0, /*tp_str*/
1275 0, /*tp_getattro*/
7371cf6d 1276 (setattrofunc)local_setattro, /*tp_setattro */
adc36818 1277 0, /*tp_as_buffer*/
7371cf6d 1278 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
adc36818
PM
1279 "GDB breakpoint object", /* tp_doc */
1280 0, /* tp_traverse */
1281 0, /* tp_clear */
1282 0, /* tp_richcompare */
1283 0, /* tp_weaklistoffset */
1284 0, /* tp_iter */
1285 0, /* tp_iternext */
1286 breakpoint_object_methods, /* tp_methods */
1287 0, /* tp_members */
7371cf6d
PM
1288 breakpoint_object_getset, /* tp_getset */
1289 0, /* tp_base */
1290 0, /* tp_dict */
1291 0, /* tp_descr_get */
1292 0, /* tp_descr_set */
1293 0, /* tp_dictoffset */
1294 bppy_init, /* tp_init */
1295 0, /* tp_alloc */
adc36818 1296};
This page took 0.903291 seconds and 4 git commands to generate.