Use gdbpy_enter in py-finishbreakpoint.c
[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
PM
43/* Function that is called when a Python condition is evaluated. */
44static char * const stop_func = "stop";
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{
403 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 struct ui_file *string_file;
adc36818 489 PyObject *result;
c92aed16 490 struct cleanup *chain;
adc36818
PM
491
492 BPPY_REQUIRE_VALID (self_bp);
493
494 if (! self_bp->bp->commands)
495 Py_RETURN_NONE;
496
497 string_file = mem_fileopen ();
498 chain = make_cleanup_ui_file_delete (string_file);
499
112e8700 500 current_uiout->redirect (string_file);
492d29ea 501 TRY
adc36818 502 {
79a45e25 503 print_command_lines (current_uiout, breakpoint_commands (bp), 0);
adc36818 504 }
492d29ea 505 CATCH (except, RETURN_MASK_ALL)
b862ce75 506 {
112e8700 507 current_uiout->redirect (NULL);
b862ce75 508 do_cleanups (chain);
f3300387
TT
509 gdbpy_convert_exception (except);
510 return NULL;
b862ce75 511 }
492d29ea 512 END_CATCH
adc36818 513
112e8700 514 current_uiout->redirect (NULL);
c92aed16
PA
515 std::string cmdstr = ui_file_as_string (string_file);
516 result = host_string_to_python_string (cmdstr.c_str ());
adc36818 517 do_cleanups (chain);
adc36818
PM
518 return result;
519}
520
521/* Python function to get the breakpoint type. */
522static PyObject *
523bppy_get_type (PyObject *self, void *closure)
524{
4cb0213d 525 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
526
527 BPPY_REQUIRE_VALID (self_bp);
528
529 return PyInt_FromLong (self_bp->bp->type);
530}
531
84f4c1fe
PM
532/* Python function to get the visibility of the breakpoint. */
533
534static PyObject *
535bppy_get_visibility (PyObject *self, void *closure)
536{
4cb0213d 537 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
84f4c1fe
PM
538
539 BPPY_REQUIRE_VALID (self_bp);
540
43684a7b
TT
541 if (user_breakpoint_p (self_bp->bp))
542 Py_RETURN_TRUE;
84f4c1fe 543
43684a7b 544 Py_RETURN_FALSE;
84f4c1fe
PM
545}
546
f76c27b5
PM
547/* Python function to determine if the breakpoint is a temporary
548 breakpoint. */
549
550static PyObject *
551bppy_get_temporary (PyObject *self, void *closure)
552{
4cb0213d 553 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
f76c27b5
PM
554
555 BPPY_REQUIRE_VALID (self_bp);
556
557 if (self_bp->bp->disposition == disp_del
558 || self_bp->bp->disposition == disp_del_at_next_stop)
559 Py_RETURN_TRUE;
560
561 Py_RETURN_FALSE;
562}
563
93daf339
TT
564/* Python function to determine if the breakpoint is a pending
565 breakpoint. */
566
567static PyObject *
568bppy_get_pending (PyObject *self, void *closure)
569{
570 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
571
572 BPPY_REQUIRE_VALID (self_bp);
573
574 if (is_watchpoint (self_bp->bp))
575 Py_RETURN_FALSE;
576 if (pending_breakpoint_p (self_bp->bp))
577 Py_RETURN_TRUE;
578
579 Py_RETURN_FALSE;
580}
581
adc36818
PM
582/* Python function to get the breakpoint's number. */
583static PyObject *
584bppy_get_number (PyObject *self, void *closure)
585{
4cb0213d 586 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
587
588 BPPY_REQUIRE_VALID (self_bp);
589
590 return PyInt_FromLong (self_bp->number);
591}
592
593/* Python function to get the breakpoint's thread ID. */
594static PyObject *
595bppy_get_thread (PyObject *self, void *closure)
596{
4cb0213d 597 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
598
599 BPPY_REQUIRE_VALID (self_bp);
600
601 if (self_bp->bp->thread == -1)
602 Py_RETURN_NONE;
603
604 return PyInt_FromLong (self_bp->bp->thread);
605}
606
607/* Python function to get the breakpoint's task ID (in Ada). */
608static PyObject *
609bppy_get_task (PyObject *self, void *closure)
610{
4cb0213d 611 gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
adc36818
PM
612
613 BPPY_REQUIRE_VALID (self_bp);
614
615 if (self_bp->bp->task == 0)
616 Py_RETURN_NONE;
617
618 return PyInt_FromLong (self_bp->bp->task);
619}
620
621/* Python function to get the breakpoint's hit count. */
622static PyObject *
623bppy_get_hit_count (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->bp->hit_count);
630}
631
632/* Python function to get the breakpoint's ignore count. */
633static PyObject *
634bppy_get_ignore_count (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 return PyInt_FromLong (self_bp->bp->ignore_count);
641}
642
643/* Python function to create a new breakpoint. */
7371cf6d
PM
644static int
645bppy_init (PyObject *self, PyObject *args, PyObject *kwargs)
adc36818 646{
f76c27b5
PM
647 static char *keywords[] = { "spec", "type", "wp_class", "internal",
648 "temporary", NULL };
ddd49eee 649 const char *spec;
adc36818
PM
650 int type = bp_breakpoint;
651 int access_type = hw_write;
84f4c1fe 652 PyObject *internal = NULL;
f76c27b5 653 PyObject *temporary = NULL;
84f4c1fe 654 int internal_bp = 0;
f76c27b5 655 int temporary_bp = 0;
adc36818 656
f76c27b5
PM
657 if (! PyArg_ParseTupleAndKeywords (args, kwargs, "s|iiOO", keywords,
658 &spec, &type, &access_type,
659 &internal, &temporary))
7371cf6d 660 return -1;
adc36818 661
84f4c1fe
PM
662 if (internal)
663 {
664 internal_bp = PyObject_IsTrue (internal);
665 if (internal_bp == -1)
7371cf6d 666 return -1;
84f4c1fe
PM
667 }
668
f76c27b5
PM
669 if (temporary != NULL)
670 {
671 temporary_bp = PyObject_IsTrue (temporary);
672 if (temporary_bp == -1)
673 return -1;
674 }
675
4cb0213d 676 bppy_pending_object = (gdbpy_breakpoint_object *) self;
adc36818
PM
677 bppy_pending_object->number = -1;
678 bppy_pending_object->bp = NULL;
256458bc 679
492d29ea 680 TRY
adc36818 681 {
9b972014
TT
682 gdb::unique_xmalloc_ptr<char>
683 copy_holder (xstrdup (skip_spaces_const (spec)));
684 char *copy = copy_holder.get ();
ddd49eee 685
adc36818
PM
686 switch (type)
687 {
688 case bp_breakpoint:
689 {
f00aae0f 690 struct event_location *location;
9b972014 691 struct cleanup *cleanup;
f00aae0f 692
9f61929f
KS
693 location
694 = string_to_event_location_basic (&copy, current_language);
9b972014 695 cleanup = make_cleanup_delete_event_location (location);
adc36818 696 create_breakpoint (python_gdbarch,
f00aae0f 697 location, NULL, -1, NULL,
adc36818 698 0,
f76c27b5 699 temporary_bp, bp_breakpoint,
adc36818
PM
700 0,
701 AUTO_BOOLEAN_TRUE,
348d480f 702 &bkpt_breakpoint_ops,
44f238bb 703 0, 1, internal_bp, 0);
9b972014
TT
704
705 do_cleanups (cleanup);
adc36818
PM
706 break;
707 }
708 case bp_watchpoint:
709 {
710 if (access_type == hw_write)
ddd49eee 711 watch_command_wrapper (copy, 0, internal_bp);
adc36818 712 else if (access_type == hw_access)
ddd49eee 713 awatch_command_wrapper (copy, 0, internal_bp);
adc36818 714 else if (access_type == hw_read)
ddd49eee 715 rwatch_command_wrapper (copy, 0, internal_bp);
adc36818
PM
716 else
717 error(_("Cannot understand watchpoint access type."));
718 break;
719 }
720 default:
721 error(_("Do not understand breakpoint type to set."));
722 }
723 }
492d29ea 724 CATCH (except, RETURN_MASK_ALL)
adc36818 725 {
f4952523 726 bppy_pending_object = NULL;
7371cf6d
PM
727 PyErr_Format (except.reason == RETURN_QUIT
728 ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
729 "%s", except.message);
730 return -1;
adc36818 731 }
492d29ea 732 END_CATCH
adc36818 733
4cb0213d 734 BPPY_SET_REQUIRE_VALID ((gdbpy_breakpoint_object *) self);
7371cf6d 735 return 0;
adc36818
PM
736}
737
738\f
739
84f4c1fe
PM
740static int
741build_bp_list (struct breakpoint *b, void *arg)
742{
19ba03f4 743 PyObject *list = (PyObject *) arg;
50389644 744 PyObject *bp = (PyObject *) b->py_bp_object;
84f4c1fe
PM
745 int iserr = 0;
746
747 /* Not all breakpoints will have a companion Python object.
748 Only breakpoints that were created via bppy_new, or
749 breakpoints that were created externally and are tracked by
750 the Python Scripting API. */
751 if (bp)
752 iserr = PyList_Append (list, bp);
753
754 if (iserr == -1)
755 return 1;
756
757 return 0;
758}
759
adc36818
PM
760/* Static function to return a tuple holding all breakpoints. */
761
762PyObject *
763gdbpy_breakpoints (PyObject *self, PyObject *args)
764{
adc36818 765 if (bppy_live == 0)
1957f6b8 766 return PyTuple_New (0);
adc36818 767
bf2a52fa
TT
768 gdbpy_ref list (PyList_New (0));
769 if (list == NULL)
84f4c1fe 770 return NULL;
d59b6f6c 771
1957f6b8 772 /* If iterate_over_breakpoints returns non NULL it signals an error
84f4c1fe
PM
773 condition. In that case abandon building the list and return
774 NULL. */
bf2a52fa
TT
775 if (iterate_over_breakpoints (build_bp_list, list.get ()) != NULL)
776 return NULL;
27ca1a5b 777
bf2a52fa 778 return PyList_AsTuple (list.get ());
adc36818
PM
779}
780
7371cf6d
PM
781/* Call the "stop" method (if implemented) in the breakpoint
782 class. If the method returns True, the inferior will be
783 stopped at the breakpoint. Otherwise the inferior will be
784 allowed to continue. */
785
6dddc817
DE
786enum ext_lang_bp_stop
787gdbpy_breakpoint_cond_says_stop (const struct extension_language_defn *extlang,
788 struct breakpoint *b)
7371cf6d 789{
6dddc817
DE
790 int stop;
791 struct gdbpy_breakpoint_object *bp_obj = b->py_bp_object;
7371cf6d 792 PyObject *py_bp = (PyObject *) bp_obj;
6dddc817 793 struct gdbarch *garch;
6dddc817
DE
794
795 if (bp_obj == NULL)
796 return EXT_LANG_BP_STOP_UNSET;
797
798 stop = -1;
799 garch = b->gdbarch ? b->gdbarch : get_current_arch ();
de2dc875
TT
800
801 gdbpy_enter enter_py (garch, current_language);
7371cf6d 802
cc72b2a2
KP
803 if (bp_obj->is_finish_bp)
804 bpfinishpy_pre_stop_hook (bp_obj);
805
7371cf6d
PM
806 if (PyObject_HasAttrString (py_bp, stop_func))
807 {
808 PyObject *result = PyObject_CallMethod (py_bp, stop_func, NULL);
809
6dddc817 810 stop = 1;
7371cf6d
PM
811 if (result)
812 {
813 int evaluate = PyObject_IsTrue (result);
814
815 if (evaluate == -1)
816 gdbpy_print_stack ();
817
818 /* If the "stop" function returns False that means
819 the Python breakpoint wants GDB to continue. */
820 if (! evaluate)
821 stop = 0;
822
823 Py_DECREF (result);
824 }
825 else
826 gdbpy_print_stack ();
827 }
cc72b2a2
KP
828
829 if (bp_obj->is_finish_bp)
830 bpfinishpy_post_stop_hook (bp_obj);
831
6dddc817
DE
832 if (stop < 0)
833 return EXT_LANG_BP_STOP_UNSET;
834 return stop ? EXT_LANG_BP_STOP_YES : EXT_LANG_BP_STOP_NO;
7371cf6d
PM
835}
836
837/* Checks if the "stop" method exists in this breakpoint.
838 Used by condition_command to ensure mutual exclusion of breakpoint
839 conditions. */
840
841int
6dddc817
DE
842gdbpy_breakpoint_has_cond (const struct extension_language_defn *extlang,
843 struct breakpoint *b)
7371cf6d 844{
6dddc817
DE
845 PyObject *py_bp;
846 struct gdbarch *garch;
256458bc 847
6dddc817
DE
848 if (b->py_bp_object == NULL)
849 return 0;
7371cf6d 850
6dddc817
DE
851 py_bp = (PyObject *) b->py_bp_object;
852 garch = b->gdbarch ? b->gdbarch : get_current_arch ();
7371cf6d 853
de2dc875
TT
854 gdbpy_enter enter_py (garch, current_language);
855 return PyObject_HasAttrString (py_bp, stop_func);
7371cf6d
PM
856}
857
adc36818
PM
858\f
859
860/* Event callback functions. */
861
862/* Callback that is used when a breakpoint is created. This function
863 will create a new Python breakpoint object. */
864static void
8d3788bd 865gdbpy_breakpoint_created (struct breakpoint *bp)
adc36818 866{
4cb0213d 867 gdbpy_breakpoint_object *newbp;
adc36818
PM
868 PyGILState_STATE state;
869
43684a7b 870 if (!user_breakpoint_p (bp) && bppy_pending_object == NULL)
84f4c1fe
PM
871 return;
872
256458bc 873 if (bp->type != bp_breakpoint
adc36818 874 && bp->type != bp_watchpoint
256458bc 875 && bp->type != bp_hardware_watchpoint
adc36818
PM
876 && bp->type != bp_read_watchpoint
877 && bp->type != bp_access_watchpoint)
878 return;
879
adc36818
PM
880 state = PyGILState_Ensure ();
881
882 if (bppy_pending_object)
883 {
884 newbp = bppy_pending_object;
885 bppy_pending_object = NULL;
886 }
887 else
4cb0213d 888 newbp = PyObject_New (gdbpy_breakpoint_object, &breakpoint_object_type);
adc36818
PM
889 if (newbp)
890 {
8d3788bd 891 newbp->number = bp->number;
adc36818 892 newbp->bp = bp;
50389644 893 newbp->bp->py_bp_object = newbp;
cc72b2a2 894 newbp->is_finish_bp = 0;
adc36818 895 Py_INCREF (newbp);
84f4c1fe
PM
896 ++bppy_live;
897 }
898 else
899 {
900 PyErr_SetString (PyExc_RuntimeError,
901 _("Error while creating breakpoint from GDB."));
902 gdbpy_print_stack ();
adc36818 903 }
adc36818 904
dac790e1
TT
905 if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_created))
906 {
dac790e1
TT
907 if (evpy_emit_event ((PyObject *) newbp,
908 gdb_py_events.breakpoint_created) < 0)
909 gdbpy_print_stack ();
910 }
911
adc36818
PM
912 PyGILState_Release (state);
913}
914
915/* Callback that is used when a breakpoint is deleted. This will
916 invalidate the corresponding Python object. */
917static void
8d3788bd 918gdbpy_breakpoint_deleted (struct breakpoint *b)
adc36818 919{
8d3788bd 920 int num = b->number;
adc36818 921 PyGILState_STATE state;
84f4c1fe 922 struct breakpoint *bp = NULL;
4cb0213d 923 gdbpy_breakpoint_object *bp_obj;
adc36818
PM
924
925 state = PyGILState_Ensure ();
84f4c1fe 926 bp = get_breakpoint (num);
d930d06e 927 if (bp)
adc36818 928 {
d930d06e
TT
929 bp_obj = bp->py_bp_object;
930 if (bp_obj)
931 {
dac790e1
TT
932 if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_deleted))
933 {
abf5651e 934 if (evpy_emit_event ((PyObject *) bp_obj,
dac790e1
TT
935 gdb_py_events.breakpoint_deleted) < 0)
936 gdbpy_print_stack ();
937 }
938
d930d06e
TT
939 bp_obj->bp = NULL;
940 --bppy_live;
941 Py_DECREF (bp_obj);
942 }
adc36818
PM
943 }
944 PyGILState_Release (state);
945}
946
dac790e1
TT
947/* Callback that is used when a breakpoint is modified. */
948
949static void
950gdbpy_breakpoint_modified (struct breakpoint *b)
951{
952 int num = b->number;
953 PyGILState_STATE state;
954 struct breakpoint *bp = NULL;
955 gdbpy_breakpoint_object *bp_obj;
956
957 state = PyGILState_Ensure ();
958 bp = get_breakpoint (num);
959 if (bp)
960 {
961 PyObject *bp_obj = (PyObject *) bp->py_bp_object;
962 if (bp_obj)
963 {
964 if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_modified))
965 {
dac790e1
TT
966 if (evpy_emit_event (bp_obj,
967 gdb_py_events.breakpoint_modified) < 0)
968 gdbpy_print_stack ();
969 }
970 }
971 }
972 PyGILState_Release (state);
973}
974
adc36818
PM
975\f
976
977/* Initialize the Python breakpoint code. */
999633ed 978int
adc36818
PM
979gdbpy_initialize_breakpoints (void)
980{
981 int i;
982
6a1b1664 983 breakpoint_object_type.tp_new = PyType_GenericNew;
adc36818 984 if (PyType_Ready (&breakpoint_object_type) < 0)
999633ed 985 return -1;
adc36818 986
aa36459a
TT
987 if (gdb_pymodule_addobject (gdb_module, "Breakpoint",
988 (PyObject *) &breakpoint_object_type) < 0)
999633ed 989 return -1;
adc36818
PM
990
991 observer_attach_breakpoint_created (gdbpy_breakpoint_created);
992 observer_attach_breakpoint_deleted (gdbpy_breakpoint_deleted);
dac790e1 993 observer_attach_breakpoint_modified (gdbpy_breakpoint_modified);
adc36818
PM
994
995 /* Add breakpoint types constants. */
996 for (i = 0; pybp_codes[i].name; ++i)
997 {
998 if (PyModule_AddIntConstant (gdb_module,
999 /* Cast needed for Python 2.4. */
1000 (char *) pybp_codes[i].name,
1001 pybp_codes[i].code) < 0)
999633ed 1002 return -1;
adc36818
PM
1003 }
1004
1005 /* Add watchpoint types constants. */
1006 for (i = 0; pybp_watch_types[i].name; ++i)
1007 {
1008 if (PyModule_AddIntConstant (gdb_module,
1009 /* Cast needed for Python 2.4. */
1010 (char *) pybp_watch_types[i].name,
1011 pybp_watch_types[i].code) < 0)
999633ed 1012 return -1;
adc36818
PM
1013 }
1014
999633ed 1015 return 0;
adc36818
PM
1016}
1017
1018\f
1019
7371cf6d
PM
1020/* Helper function that overrides this Python object's
1021 PyObject_GenericSetAttr to allow extra validation of the attribute
1022 being set. */
1023
256458bc 1024static int
7371cf6d
PM
1025local_setattro (PyObject *self, PyObject *name, PyObject *v)
1026{
256458bc 1027 gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
9b972014 1028 gdb::unique_xmalloc_ptr<char> attr (python_string_to_host_string (name));
256458bc 1029
7371cf6d
PM
1030 if (attr == NULL)
1031 return -1;
256458bc 1032
7371cf6d 1033 /* If the attribute trying to be set is the "stop" method,
6dddc817
DE
1034 but we already have a condition set in the CLI or other extension
1035 language, disallow this operation. */
9b972014 1036 if (strcmp (attr.get (), stop_func) == 0)
7371cf6d 1037 {
6dddc817
DE
1038 const struct extension_language_defn *extlang = NULL;
1039
1040 if (obj->bp->cond_string != NULL)
1041 extlang = get_ext_lang_defn (EXT_LANG_GDB);
1042 if (extlang == NULL)
1043 extlang = get_breakpoint_cond_ext_lang (obj->bp, EXT_LANG_PYTHON);
1044 if (extlang != NULL)
1045 {
1046 char *error_text;
1047
6dddc817
DE
1048 error_text
1049 = xstrprintf (_("Only one stop condition allowed. There is"
1050 " currently a %s stop condition defined for"
1051 " this breakpoint."),
1052 ext_lang_capitalized_name (extlang));
1053 PyErr_SetString (PyExc_RuntimeError, error_text);
1054 xfree (error_text);
1055 return -1;
1056 }
7371cf6d 1057 }
256458bc 1058
256458bc 1059 return PyObject_GenericSetAttr ((PyObject *)self, name, v);
7371cf6d
PM
1060}
1061
adc36818
PM
1062static PyGetSetDef breakpoint_object_getset[] = {
1063 { "enabled", bppy_get_enabled, bppy_set_enabled,
1064 "Boolean telling whether the breakpoint is enabled.", NULL },
1065 { "silent", bppy_get_silent, bppy_set_silent,
1066 "Boolean telling whether the breakpoint is silent.", NULL },
1067 { "thread", bppy_get_thread, bppy_set_thread,
1068 "Thread ID for the breakpoint.\n\
1069If the value is a thread ID (integer), then this is a thread-specific breakpoint.\n\
1070If the value is None, then this breakpoint is not thread-specific.\n\
1071No other type of value can be used.", NULL },
1072 { "task", bppy_get_task, bppy_set_task,
1073 "Thread ID for the breakpoint.\n\
1074If the value is a task ID (integer), then this is an Ada task-specific breakpoint.\n\
1075If the value is None, then this breakpoint is not task-specific.\n\
1076No other type of value can be used.", NULL },
1077 { "ignore_count", bppy_get_ignore_count, bppy_set_ignore_count,
1078 "Number of times this breakpoint should be automatically continued.",
1079 NULL },
1080 { "number", bppy_get_number, NULL,
1081 "Breakpoint's number assigned by GDB.", NULL },
1082 { "hit_count", bppy_get_hit_count, bppy_set_hit_count,
1083 "Number of times the breakpoint has been hit.\n\
1084Can be set to zero to clear the count. No other value is valid\n\
1085when setting this property.", NULL },
1086 { "location", bppy_get_location, NULL,
1087 "Location of the breakpoint, as specified by the user.", NULL},
1088 { "expression", bppy_get_expression, NULL,
1089 "Expression of the breakpoint, as specified by the user.", NULL},
1090 { "condition", bppy_get_condition, bppy_set_condition,
1091 "Condition of the breakpoint, as specified by the user,\
1092or None if no condition set."},
1093 { "commands", bppy_get_commands, NULL,
1094 "Commands of the breakpoint, as specified by the user."},
1095 { "type", bppy_get_type, NULL,
1096 "Type of breakpoint."},
84f4c1fe
PM
1097 { "visible", bppy_get_visibility, NULL,
1098 "Whether the breakpoint is visible to the user."},
f76c27b5
PM
1099 { "temporary", bppy_get_temporary, NULL,
1100 "Whether this breakpoint is a temporary breakpoint."},
93daf339
TT
1101 { "pending", bppy_get_pending, NULL,
1102 "Whether this breakpoint is a pending breakpoint."},
adc36818
PM
1103 { NULL } /* Sentinel. */
1104};
1105
1106static PyMethodDef breakpoint_object_methods[] =
1107{
1108 { "is_valid", bppy_is_valid, METH_NOARGS,
1109 "Return true if this breakpoint is valid, false if not." },
94b6973e
PM
1110 { "delete", bppy_delete_breakpoint, METH_NOARGS,
1111 "Delete the underlying GDB breakpoint." },
adc36818
PM
1112 { NULL } /* Sentinel. */
1113};
1114
cc72b2a2 1115PyTypeObject breakpoint_object_type =
adc36818 1116{
9a27f2c6 1117 PyVarObject_HEAD_INIT (NULL, 0)
adc36818 1118 "gdb.Breakpoint", /*tp_name*/
4cb0213d 1119 sizeof (gdbpy_breakpoint_object), /*tp_basicsize*/
adc36818
PM
1120 0, /*tp_itemsize*/
1121 0, /*tp_dealloc*/
1122 0, /*tp_print*/
1123 0, /*tp_getattr*/
1124 0, /*tp_setattr*/
1125 0, /*tp_compare*/
1126 0, /*tp_repr*/
1127 0, /*tp_as_number*/
1128 0, /*tp_as_sequence*/
1129 0, /*tp_as_mapping*/
1130 0, /*tp_hash */
1131 0, /*tp_call*/
1132 0, /*tp_str*/
1133 0, /*tp_getattro*/
7371cf6d 1134 (setattrofunc)local_setattro, /*tp_setattro */
adc36818 1135 0, /*tp_as_buffer*/
7371cf6d 1136 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
adc36818
PM
1137 "GDB breakpoint object", /* tp_doc */
1138 0, /* tp_traverse */
1139 0, /* tp_clear */
1140 0, /* tp_richcompare */
1141 0, /* tp_weaklistoffset */
1142 0, /* tp_iter */
1143 0, /* tp_iternext */
1144 breakpoint_object_methods, /* tp_methods */
1145 0, /* tp_members */
7371cf6d
PM
1146 breakpoint_object_getset, /* tp_getset */
1147 0, /* tp_base */
1148 0, /* tp_dict */
1149 0, /* tp_descr_get */
1150 0, /* tp_descr_set */
1151 0, /* tp_dictoffset */
1152 bppy_init, /* tp_init */
1153 0, /* tp_alloc */
adc36818 1154};
This page took 0.708499 seconds and 4 git commands to generate.