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