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