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