py-linetable.c revision 1.7 1 1.1 christos /* Python interface to line tables.
2 1.1 christos
3 1.7 christos Copyright (C) 2013-2017 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 "python-internal.h"
22 1.7 christos #include "py-ref.h"
23 1.1 christos
24 1.1 christos typedef struct {
25 1.1 christos PyObject_HEAD
26 1.1 christos /* The line table source line. */
27 1.1 christos int line;
28 1.1 christos /* The pc associated with the source line. */
29 1.1 christos CORE_ADDR pc;
30 1.1 christos } linetable_entry_object;
31 1.1 christos
32 1.5 christos extern PyTypeObject linetable_entry_object_type
33 1.1 christos CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("linetable_entry_object");
34 1.1 christos
35 1.1 christos typedef struct {
36 1.1 christos PyObject_HEAD
37 1.1 christos /* The symtab python object. We store the Python object here as the
38 1.1 christos underlying symtab can become invalid, and we have to run validity
39 1.1 christos checks on it. */
40 1.1 christos PyObject *symtab;
41 1.1 christos } linetable_object;
42 1.1 christos
43 1.5 christos extern PyTypeObject linetable_object_type
44 1.1 christos CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("linetable_object");
45 1.1 christos
46 1.1 christos typedef struct {
47 1.1 christos PyObject_HEAD
48 1.1 christos /* The current entry in the line table for the iterator */
49 1.1 christos int current_index;
50 1.1 christos /* Pointer back to the original source line table object. Needed to
51 1.1 christos check if the line table is still valid, and has not been invalidated
52 1.1 christos when an object file has been freed. */
53 1.1 christos PyObject *source;
54 1.1 christos } ltpy_iterator_object;
55 1.1 christos
56 1.5 christos extern PyTypeObject ltpy_iterator_object_type
57 1.1 christos CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("ltpy_iterator_object");
58 1.1 christos
59 1.6 christos /* Internal helper function to extract gdb.Symtab from a gdb.LineTable
60 1.1 christos object. */
61 1.1 christos
62 1.1 christos static PyObject *
63 1.1 christos get_symtab (PyObject *linetable)
64 1.1 christos {
65 1.1 christos linetable_object *lt = (linetable_object *) linetable;
66 1.1 christos
67 1.1 christos return lt->symtab;
68 1.1 christos }
69 1.1 christos
70 1.1 christos #define LTPY_REQUIRE_VALID(lt_obj, symtab) \
71 1.1 christos do { \
72 1.1 christos symtab = symtab_object_to_symtab (get_symtab (lt_obj)); \
73 1.1 christos if (symtab == NULL) \
74 1.1 christos { \
75 1.1 christos PyErr_SetString (PyExc_RuntimeError, \
76 1.1 christos _("Symbol Table in line table is invalid."));\
77 1.1 christos return NULL; \
78 1.1 christos } \
79 1.1 christos } while (0)
80 1.1 christos
81 1.1 christos
82 1.1 christos /* Helper function to create a line table object that wraps a
83 1.1 christos gdb.Symtab object. */
84 1.1 christos
85 1.1 christos PyObject *
86 1.1 christos symtab_to_linetable_object (PyObject *symtab)
87 1.1 christos {
88 1.1 christos linetable_object *ltable;
89 1.1 christos
90 1.1 christos ltable = PyObject_New (linetable_object, &linetable_object_type);
91 1.1 christos if (ltable != NULL)
92 1.1 christos {
93 1.1 christos ltable->symtab = symtab;
94 1.1 christos Py_INCREF (symtab);
95 1.1 christos }
96 1.1 christos return (PyObject *) ltable;
97 1.1 christos }
98 1.1 christos
99 1.1 christos /* Internal helper function to build a line table object from a line
100 1.1 christos and an address. */
101 1.1 christos
102 1.1 christos static PyObject *
103 1.1 christos build_linetable_entry (int line, CORE_ADDR address)
104 1.1 christos {
105 1.1 christos linetable_entry_object *obj;
106 1.1 christos
107 1.1 christos obj = PyObject_New (linetable_entry_object,
108 1.1 christos &linetable_entry_object_type);
109 1.1 christos if (obj != NULL)
110 1.1 christos {
111 1.1 christos obj->line = line;
112 1.1 christos obj->pc = address;
113 1.1 christos }
114 1.1 christos
115 1.1 christos return (PyObject *) obj;
116 1.1 christos }
117 1.1 christos
118 1.7 christos /* Internal helper function to build a Python Tuple from a vector.
119 1.1 christos A line table entry can have multiple PCs for a given source line.
120 1.1 christos Construct a Tuple of all entries for the given source line, LINE
121 1.7 christos from the line table PCS. Construct one line table entry object per
122 1.1 christos address. */
123 1.1 christos
124 1.1 christos static PyObject *
125 1.7 christos build_line_table_tuple_from_pcs (int line, const std::vector<CORE_ADDR> &pcs)
126 1.1 christos {
127 1.1 christos int i;
128 1.1 christos
129 1.7 christos if (pcs.size () < 1)
130 1.1 christos Py_RETURN_NONE;
131 1.1 christos
132 1.7 christos gdbpy_ref<> tuple (PyTuple_New (pcs.size ()));
133 1.1 christos
134 1.1 christos if (tuple == NULL)
135 1.1 christos return NULL;
136 1.1 christos
137 1.7 christos for (i = 0; i < pcs.size (); ++i)
138 1.1 christos {
139 1.7 christos CORE_ADDR pc = pcs[i];
140 1.7 christos gdbpy_ref<> obj (build_linetable_entry (line, pc));
141 1.1 christos
142 1.1 christos if (obj == NULL)
143 1.7 christos return NULL;
144 1.7 christos else if (PyTuple_SetItem (tuple.get (), i, obj.release ()) != 0)
145 1.7 christos return NULL;
146 1.1 christos }
147 1.1 christos
148 1.7 christos return tuple.release ();
149 1.1 christos }
150 1.1 christos
151 1.1 christos /* Implementation of gdb.LineTable.line (self) -> Tuple. Returns a
152 1.1 christos tuple of LineTableEntry objects associated with this line from the
153 1.1 christos in the line table. */
154 1.1 christos
155 1.1 christos static PyObject *
156 1.1 christos ltpy_get_pcs_for_line (PyObject *self, PyObject *args)
157 1.1 christos {
158 1.1 christos struct symtab *symtab;
159 1.1 christos gdb_py_longest py_line;
160 1.1 christos struct linetable_entry *best_entry = NULL;
161 1.7 christos std::vector<CORE_ADDR> pcs;
162 1.1 christos
163 1.1 christos LTPY_REQUIRE_VALID (self, symtab);
164 1.1 christos
165 1.1 christos if (! PyArg_ParseTuple (args, GDB_PY_LL_ARG, &py_line))
166 1.1 christos return NULL;
167 1.1 christos
168 1.5 christos TRY
169 1.1 christos {
170 1.1 christos pcs = find_pcs_for_symtab_line (symtab, py_line, &best_entry);
171 1.1 christos }
172 1.5 christos CATCH (except, RETURN_MASK_ALL)
173 1.5 christos {
174 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
175 1.5 christos }
176 1.5 christos END_CATCH
177 1.1 christos
178 1.7 christos return build_line_table_tuple_from_pcs (py_line, pcs);
179 1.1 christos }
180 1.1 christos
181 1.1 christos /* Implementation of gdb.LineTable.has_line (self, line) -> Boolean.
182 1.1 christos Returns a Python Boolean indicating whether a source line has any
183 1.1 christos line table entries corresponding to it. */
184 1.1 christos
185 1.1 christos static PyObject *
186 1.1 christos ltpy_has_line (PyObject *self, PyObject *args)
187 1.1 christos {
188 1.1 christos struct symtab *symtab;
189 1.1 christos gdb_py_longest py_line;
190 1.1 christos int index;
191 1.1 christos
192 1.1 christos LTPY_REQUIRE_VALID (self, symtab);
193 1.1 christos
194 1.1 christos if (! PyArg_ParseTuple (args, GDB_PY_LL_ARG, &py_line))
195 1.1 christos return NULL;
196 1.1 christos
197 1.3 christos if (SYMTAB_LINETABLE (symtab) == NULL)
198 1.1 christos {
199 1.1 christos PyErr_SetString (PyExc_RuntimeError,
200 1.1 christos _("Linetable information not found in symbol table"));
201 1.1 christos return NULL;
202 1.1 christos }
203 1.1 christos
204 1.3 christos for (index = 0; index < SYMTAB_LINETABLE (symtab)->nitems; index++)
205 1.1 christos {
206 1.3 christos struct linetable_entry *item = &(SYMTAB_LINETABLE (symtab)->item[index]);
207 1.1 christos if (item->line == py_line)
208 1.1 christos Py_RETURN_TRUE;
209 1.1 christos }
210 1.1 christos
211 1.1 christos Py_RETURN_FALSE;
212 1.1 christos }
213 1.1 christos
214 1.6 christos /* Implementation of gdb.LineTable.source_lines (self) -> List.
215 1.6 christos Returns a Python List that contains source line entries in the
216 1.1 christos line table. This function will just return the source lines
217 1.1 christos without corresponding addresses. */
218 1.1 christos
219 1.1 christos static PyObject *
220 1.1 christos ltpy_get_all_source_lines (PyObject *self, PyObject *args)
221 1.1 christos {
222 1.1 christos struct symtab *symtab;
223 1.1 christos Py_ssize_t index;
224 1.1 christos struct linetable_entry *item;
225 1.1 christos
226 1.1 christos LTPY_REQUIRE_VALID (self, symtab);
227 1.1 christos
228 1.3 christos if (SYMTAB_LINETABLE (symtab) == NULL)
229 1.1 christos {
230 1.1 christos PyErr_SetString (PyExc_RuntimeError,
231 1.1 christos _("Linetable information not found in symbol table"));
232 1.1 christos return NULL;
233 1.1 christos }
234 1.1 christos
235 1.7 christos gdbpy_ref<> source_dict (PyDict_New ());
236 1.1 christos if (source_dict == NULL)
237 1.1 christos return NULL;
238 1.1 christos
239 1.3 christos for (index = 0; index < SYMTAB_LINETABLE (symtab)->nitems; index++)
240 1.1 christos {
241 1.3 christos item = &(SYMTAB_LINETABLE (symtab)->item[index]);
242 1.1 christos
243 1.1 christos /* 0 is used to signify end of line table information. Do not
244 1.1 christos include in the source set. */
245 1.1 christos if (item->line > 0)
246 1.1 christos {
247 1.7 christos gdbpy_ref<> line (gdb_py_object_from_longest (item->line));
248 1.1 christos
249 1.1 christos if (line == NULL)
250 1.7 christos return NULL;
251 1.1 christos
252 1.7 christos if (PyDict_SetItem (source_dict.get (), line.get (), Py_None) == -1)
253 1.7 christos return NULL;
254 1.1 christos }
255 1.1 christos }
256 1.1 christos
257 1.7 christos return PyDict_Keys (source_dict.get ());
258 1.1 christos }
259 1.1 christos
260 1.6 christos /* Implementation of gdb.LineTable.is_valid (self) -> Boolean.
261 1.1 christos Returns True if this line table object still exists in GDB. */
262 1.1 christos
263 1.1 christos static PyObject *
264 1.1 christos ltpy_is_valid (PyObject *self, PyObject *args)
265 1.1 christos {
266 1.1 christos struct symtab *symtab = NULL;
267 1.1 christos
268 1.1 christos symtab = symtab_object_to_symtab (get_symtab (self));
269 1.1 christos
270 1.1 christos if (symtab == NULL)
271 1.1 christos Py_RETURN_FALSE;
272 1.1 christos
273 1.1 christos Py_RETURN_TRUE;
274 1.1 christos }
275 1.1 christos
276 1.1 christos /* Deconstructor for the line table object. Decrement the reference
277 1.1 christos to the symbol table object before calling the default free. */
278 1.1 christos
279 1.1 christos static void
280 1.1 christos ltpy_dealloc (PyObject *self)
281 1.1 christos {
282 1.1 christos linetable_object *obj = (linetable_object *) self;
283 1.1 christos
284 1.1 christos Py_DECREF (obj->symtab);
285 1.1 christos Py_TYPE (self)->tp_free (self);
286 1.1 christos }
287 1.1 christos
288 1.1 christos /* Initialize LineTable, LineTableEntry and LineTableIterator
289 1.1 christos objects. */
290 1.1 christos
291 1.1 christos int
292 1.1 christos gdbpy_initialize_linetable (void)
293 1.1 christos {
294 1.1 christos if (PyType_Ready (&linetable_object_type) < 0)
295 1.1 christos return -1;
296 1.1 christos if (PyType_Ready (&linetable_entry_object_type) < 0)
297 1.1 christos return -1;
298 1.1 christos if (PyType_Ready (<py_iterator_object_type) < 0)
299 1.1 christos return -1;
300 1.1 christos
301 1.1 christos Py_INCREF (&linetable_object_type);
302 1.1 christos Py_INCREF (&linetable_entry_object_type);
303 1.1 christos Py_INCREF (<py_iterator_object_type);
304 1.1 christos
305 1.1 christos if (gdb_pymodule_addobject (gdb_module, "LineTable",
306 1.1 christos (PyObject *) &linetable_object_type) < 0)
307 1.1 christos return -1;
308 1.1 christos
309 1.1 christos if (gdb_pymodule_addobject (gdb_module, "LineTableEntry",
310 1.1 christos (PyObject *) &linetable_entry_object_type) < 0)
311 1.1 christos return -1;
312 1.1 christos
313 1.1 christos if (gdb_pymodule_addobject (gdb_module, "LineTableIterator",
314 1.1 christos (PyObject *) <py_iterator_object_type) < 0)
315 1.1 christos return -1;
316 1.1 christos
317 1.1 christos return 0;
318 1.1 christos }
319 1.1 christos
320 1.6 christos /* LineTable entry object get functions. */
321 1.1 christos
322 1.1 christos /* Implementation of gdb.LineTableEntry.line (self) -> Long. Returns
323 1.1 christos a long integer associated with the line table entry. */
324 1.1 christos
325 1.1 christos static PyObject *
326 1.1 christos ltpy_entry_get_line (PyObject *self, void *closure)
327 1.1 christos {
328 1.1 christos linetable_entry_object *obj = (linetable_entry_object *) self;
329 1.1 christos
330 1.1 christos return gdb_py_object_from_longest (obj->line);
331 1.1 christos }
332 1.1 christos
333 1.1 christos /* Implementation of gdb.LineTableEntry.pc (self) -> Long. Returns a
334 1.1 christos a long integer associated with the PC of the line table entry. */
335 1.1 christos
336 1.1 christos static PyObject *
337 1.1 christos ltpy_entry_get_pc (PyObject *self, void *closure)
338 1.1 christos {
339 1.1 christos linetable_entry_object *obj = (linetable_entry_object *) self;
340 1.1 christos
341 1.1 christos return gdb_py_object_from_longest (obj->pc);
342 1.1 christos }
343 1.1 christos
344 1.6 christos /* LineTable iterator functions. */
345 1.1 christos
346 1.1 christos /* Return a new line table iterator. */
347 1.1 christos
348 1.1 christos static PyObject *
349 1.1 christos ltpy_iter (PyObject *self)
350 1.1 christos {
351 1.1 christos ltpy_iterator_object *ltpy_iter_obj;
352 1.1 christos struct symtab *symtab = NULL;
353 1.1 christos
354 1.1 christos LTPY_REQUIRE_VALID (self, symtab);
355 1.1 christos
356 1.1 christos ltpy_iter_obj = PyObject_New (ltpy_iterator_object,
357 1.1 christos <py_iterator_object_type);
358 1.1 christos if (ltpy_iter_obj == NULL)
359 1.1 christos return NULL;
360 1.1 christos
361 1.1 christos ltpy_iter_obj->current_index = 0;
362 1.1 christos ltpy_iter_obj->source = self;
363 1.1 christos
364 1.1 christos Py_INCREF (self);
365 1.1 christos return (PyObject *) ltpy_iter_obj;
366 1.1 christos }
367 1.1 christos
368 1.1 christos static void
369 1.1 christos ltpy_iterator_dealloc (PyObject *obj)
370 1.1 christos {
371 1.1 christos ltpy_iterator_object *iter_obj = (ltpy_iterator_object *) obj;
372 1.1 christos
373 1.1 christos Py_DECREF (iter_obj->source);
374 1.1 christos }
375 1.1 christos
376 1.1 christos /* Return a reference to the line table iterator. */
377 1.1 christos
378 1.1 christos static PyObject *
379 1.1 christos ltpy_iterator (PyObject *self)
380 1.1 christos {
381 1.1 christos ltpy_iterator_object *iter_obj = (ltpy_iterator_object *) self;
382 1.1 christos struct symtab *symtab;
383 1.1 christos
384 1.1 christos LTPY_REQUIRE_VALID (iter_obj->source, symtab);
385 1.1 christos
386 1.1 christos Py_INCREF (self);
387 1.1 christos return self;
388 1.1 christos }
389 1.1 christos
390 1.1 christos /* Return the next line table entry in the iteration through the line
391 1.1 christos table data structure. */
392 1.1 christos
393 1.1 christos static PyObject *
394 1.1 christos ltpy_iternext (PyObject *self)
395 1.1 christos {
396 1.1 christos ltpy_iterator_object *iter_obj = (ltpy_iterator_object *) self;
397 1.1 christos struct symtab *symtab;
398 1.1 christos PyObject *obj;
399 1.1 christos struct linetable_entry *item;
400 1.1 christos
401 1.1 christos LTPY_REQUIRE_VALID (iter_obj->source, symtab);
402 1.1 christos
403 1.3 christos if (iter_obj->current_index >= SYMTAB_LINETABLE (symtab)->nitems)
404 1.7 christos {
405 1.7 christos PyErr_SetNone (PyExc_StopIteration);
406 1.7 christos return NULL;
407 1.7 christos }
408 1.1 christos
409 1.3 christos item = &(SYMTAB_LINETABLE (symtab)->item[iter_obj->current_index]);
410 1.1 christos
411 1.1 christos /* Skip over internal entries such as 0. 0 signifies the end of
412 1.1 christos line table data and is not useful to the API user. */
413 1.1 christos while (item->line < 1)
414 1.1 christos {
415 1.1 christos iter_obj->current_index++;
416 1.1 christos
417 1.1 christos /* Exit if the internal value is the last item in the line table. */
418 1.3 christos if (iter_obj->current_index >= SYMTAB_LINETABLE (symtab)->nitems)
419 1.7 christos {
420 1.7 christos PyErr_SetNone (PyExc_StopIteration);
421 1.7 christos return NULL;
422 1.7 christos }
423 1.3 christos item = &(SYMTAB_LINETABLE (symtab)->item[iter_obj->current_index]);
424 1.1 christos }
425 1.1 christos
426 1.1 christos obj = build_linetable_entry (item->line, item->pc);
427 1.1 christos iter_obj->current_index++;
428 1.1 christos
429 1.1 christos return obj;
430 1.1 christos }
431 1.1 christos
432 1.6 christos /* Implementation of gdb.LineTableIterator.is_valid (self) -> Boolean.
433 1.1 christos Returns True if this line table iterator object still exists in
434 1.1 christos GDB. */
435 1.1 christos
436 1.1 christos static PyObject *
437 1.1 christos ltpy_iter_is_valid (PyObject *self, PyObject *args)
438 1.1 christos {
439 1.1 christos struct symtab *symtab = NULL;
440 1.1 christos ltpy_iterator_object *iter_obj = (ltpy_iterator_object *) self;
441 1.1 christos
442 1.1 christos symtab = symtab_object_to_symtab (get_symtab (iter_obj->source));
443 1.1 christos
444 1.1 christos if (symtab == NULL)
445 1.1 christos Py_RETURN_FALSE;
446 1.1 christos
447 1.1 christos Py_RETURN_TRUE;
448 1.1 christos }
449 1.1 christos
450 1.1 christos
451 1.1 christos
453 1.1 christos static PyMethodDef linetable_object_methods[] = {
454 1.1 christos { "line", ltpy_get_pcs_for_line, METH_VARARGS,
455 1.1 christos "line (lineno) -> Tuple\n\
456 1.1 christos Return executable locations for a given source line." },
457 1.1 christos { "has_line", ltpy_has_line, METH_VARARGS,
458 1.1 christos "has_line (lineno) -> Boolean\n\
459 1.1 christos Return TRUE if this line has executable information, FALSE if not." },
460 1.6 christos { "source_lines", ltpy_get_all_source_lines, METH_NOARGS,
461 1.6 christos "source_lines () -> List\n\
462 1.1 christos Return a list of all executable source lines." },
463 1.1 christos { "is_valid", ltpy_is_valid, METH_NOARGS,
464 1.6 christos "is_valid () -> Boolean.\n\
465 1.1 christos Return True if this LineTable is valid, False if not." },
466 1.1 christos {NULL} /* Sentinel */
467 1.1 christos };
468 1.5 christos
469 1.1 christos PyTypeObject linetable_object_type = {
470 1.1 christos PyVarObject_HEAD_INIT (NULL, 0)
471 1.1 christos "gdb.LineTable", /*tp_name*/
472 1.1 christos sizeof (linetable_object), /*tp_basicsize*/
473 1.1 christos 0, /*tp_itemsize*/
474 1.1 christos ltpy_dealloc, /*tp_dealloc*/
475 1.1 christos 0, /*tp_print*/
476 1.1 christos 0, /*tp_getattr*/
477 1.1 christos 0, /*tp_setattr*/
478 1.1 christos 0, /*tp_compare*/
479 1.1 christos 0, /*tp_repr*/
480 1.1 christos 0, /*tp_as_number*/
481 1.1 christos 0, /*tp_as_sequence*/
482 1.1 christos 0, /*tp_as_mapping*/
483 1.1 christos 0, /*tp_hash */
484 1.1 christos 0, /*tp_call*/
485 1.1 christos 0, /*tp_str*/
486 1.1 christos 0, /*tp_getattro*/
487 1.1 christos 0, /*tp_setattro*/
488 1.1 christos 0, /*tp_as_buffer*/
489 1.1 christos Py_TPFLAGS_DEFAULT, /*tp_flags*/
490 1.1 christos "GDB line table object", /* tp_doc */
491 1.1 christos 0, /* tp_traverse */
492 1.1 christos 0, /* tp_clear */
493 1.1 christos 0, /* tp_richcompare */
494 1.1 christos 0, /* tp_weaklistoffset */
495 1.1 christos ltpy_iter, /* tp_iter */
496 1.1 christos 0, /* tp_iternext */
497 1.1 christos linetable_object_methods, /* tp_methods */
498 1.1 christos 0, /* tp_members */
499 1.1 christos 0, /* tp_getset */
500 1.1 christos 0, /* tp_base */
501 1.1 christos 0, /* tp_dict */
502 1.1 christos 0, /* tp_descr_get */
503 1.1 christos 0, /* tp_descr_set */
504 1.1 christos 0, /* tp_dictoffset */
505 1.1 christos 0, /* tp_init */
506 1.1 christos 0, /* tp_alloc */
507 1.1 christos };
508 1.1 christos
509 1.1 christos static PyMethodDef ltpy_iterator_methods[] = {
510 1.1 christos { "is_valid", ltpy_iter_is_valid, METH_NOARGS,
511 1.6 christos "is_valid () -> Boolean.\n\
512 1.1 christos Return True if this LineTable iterator is valid, False if not." },
513 1.1 christos {NULL} /* Sentinel */
514 1.1 christos };
515 1.5 christos
516 1.1 christos PyTypeObject ltpy_iterator_object_type = {
517 1.1 christos PyVarObject_HEAD_INIT (NULL, 0)
518 1.1 christos "gdb.LineTableIterator", /*tp_name*/
519 1.1 christos sizeof (ltpy_iterator_object), /*tp_basicsize*/
520 1.1 christos 0, /*tp_itemsize*/
521 1.1 christos ltpy_iterator_dealloc, /*tp_dealloc*/
522 1.1 christos 0, /*tp_print*/
523 1.1 christos 0, /*tp_getattr*/
524 1.1 christos 0, /*tp_setattr*/
525 1.1 christos 0, /*tp_compare*/
526 1.1 christos 0, /*tp_repr*/
527 1.1 christos 0, /*tp_as_number*/
528 1.1 christos 0, /*tp_as_sequence*/
529 1.1 christos 0, /*tp_as_mapping*/
530 1.1 christos 0, /*tp_hash */
531 1.1 christos 0, /*tp_call*/
532 1.1 christos 0, /*tp_str*/
533 1.1 christos 0, /*tp_getattro*/
534 1.1 christos 0, /*tp_setattro*/
535 1.1 christos 0, /*tp_as_buffer*/
536 1.1 christos Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
537 1.1 christos "GDB line table iterator object", /*tp_doc */
538 1.1 christos 0, /*tp_traverse */
539 1.1 christos 0, /*tp_clear */
540 1.1 christos 0, /*tp_richcompare */
541 1.1 christos 0, /*tp_weaklistoffset */
542 1.1 christos ltpy_iterator, /*tp_iter */
543 1.1 christos ltpy_iternext, /*tp_iternext */
544 1.1 christos ltpy_iterator_methods /*tp_methods */
545 1.1 christos };
546 1.1 christos
547 1.7 christos
548 1.1 christos static gdb_PyGetSetDef linetable_entry_object_getset[] = {
549 1.1 christos { "line", ltpy_entry_get_line, NULL,
550 1.1 christos "The line number in the source file.", NULL },
551 1.1 christos { "pc", ltpy_entry_get_pc, NULL,
552 1.1 christos "The memory address for this line number.", NULL },
553 1.1 christos { NULL } /* Sentinel */
554 1.1 christos };
555 1.5 christos
556 1.1 christos PyTypeObject linetable_entry_object_type = {
557 1.1 christos PyVarObject_HEAD_INIT (NULL, 0)
558 1.1 christos "gdb.LineTableEntry", /*tp_name*/
559 1.1 christos sizeof (linetable_entry_object), /*tp_basicsize*/
560 1.1 christos 0, /*tp_itemsize*/
561 1.1 christos 0, /*tp_dealloc*/
562 1.1 christos 0, /*tp_print*/
563 1.1 christos 0, /*tp_getattr*/
564 1.1 christos 0, /*tp_setattr*/
565 1.1 christos 0, /*tp_compare*/
566 1.1 christos 0, /*tp_repr*/
567 1.1 christos 0, /*tp_as_number*/
568 1.1 christos 0, /*tp_as_sequence*/
569 1.1 christos 0, /*tp_as_mapping*/
570 1.1 christos 0, /*tp_hash */
571 1.1 christos 0, /*tp_call*/
572 1.1 christos 0, /*tp_str*/
573 1.1 christos 0, /*tp_getattro*/
574 1.1 christos 0, /*tp_setattro*/
575 1.1 christos 0, /*tp_as_buffer*/
576 1.1 christos Py_TPFLAGS_DEFAULT, /*tp_flags*/
577 1.1 christos "GDB line table entry object", /* tp_doc */
578 1.1 christos 0, /* tp_traverse */
579 1.1 christos 0, /* tp_clear */
580 1.1 christos 0, /* tp_richcompare */
581 1.1 christos 0, /* tp_weaklistoffset */
582 1.1 christos 0, /* tp_iter */
583 1.1 christos 0, /* tp_iternext */
584 1.1 christos 0, /* tp_methods */
585 1.1 christos 0, /* tp_members */
586 1.1 christos linetable_entry_object_getset, /* tp_getset */
587 1.1 christos 0, /* tp_base */
588 1.1 christos 0, /* tp_dict */
589 1.1 christos 0, /* tp_descr_get */
590 1.1 christos 0, /* tp_descr_set */
591 1.1 christos 0, /* tp_dictoffset */
592 1.1 christos 0, /* tp_init */
593 1.1 christos 0, /* tp_alloc */
594 };
595