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