Use enum flags for flags passed to openp
[deliverable/binutils-gdb.git] / gdb / python / py-symtab.c
CommitLineData
f3e9a817
PM
1/* Python interface to symbol tables.
2
e2882c85 3 Copyright (C) 2008-2018 Free Software Foundation, Inc.
f3e9a817
PM
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20#include "defs.h"
21#include "charset.h"
22#include "symtab.h"
23#include "source.h"
24#include "python-internal.h"
25#include "objfiles.h"
a20ee7a4 26#include "block.h"
88b6faea 27#include "py-ref.h"
f3e9a817
PM
28
29typedef struct stpy_symtab_object {
30 PyObject_HEAD
31 /* The GDB Symbol table structure. */
32 struct symtab *symtab;
33 /* A symtab object is associated with an objfile, so keep track with
34 a doubly-linked list, rooted in the objfile. This allows
35 invalidation of the underlying struct symtab when the objfile is
36 deleted. */
37 struct stpy_symtab_object *prev;
38 struct stpy_symtab_object *next;
39} symtab_object;
40
e36122e9 41extern PyTypeObject symtab_object_type
62eec1a5 42 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("symtab_object");
f3e9a817
PM
43static const struct objfile_data *stpy_objfile_data_key;
44
45/* Require a valid symbol table. All access to symtab_object->symtab
46 should be gated by this call. */
47#define STPY_REQUIRE_VALID(symtab_obj, symtab) \
48 do { \
49 symtab = symtab_object_to_symtab (symtab_obj); \
50 if (symtab == NULL) \
51 { \
52 PyErr_SetString (PyExc_RuntimeError, \
53 _("Symbol Table is invalid.")); \
54 return NULL; \
55 } \
56 } while (0)
57
58typedef struct salpy_sal_object {
59 PyObject_HEAD
60 /* The GDB Symbol table structure. */
61 symtab_object *symtab;
62 /* The GDB Symbol table and line structure. */
63 struct symtab_and_line *sal;
64 /* A Symtab and line object is associated with an objfile, so keep
65 track with a doubly-linked list, rooted in the objfile. This
66 allows invalidation of the underlying struct symtab_and_line
67 when the objfile is deleted. */
68 struct salpy_sal_object *prev;
69 struct salpy_sal_object *next;
70} sal_object;
71
e36122e9 72extern PyTypeObject sal_object_type
62eec1a5 73 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("sal_object");
f3e9a817
PM
74static const struct objfile_data *salpy_objfile_data_key;
75
76/* Require a valid symbol table and line object. All access to
77 sal_object->sal should be gated by this call. */
78#define SALPY_REQUIRE_VALID(sal_obj, sal) \
79 do { \
80 sal = sal_object_to_symtab_and_line (sal_obj); \
81 if (sal == NULL) \
82 { \
83 PyErr_SetString (PyExc_RuntimeError, \
84 _("Symbol Table and Line is invalid.")); \
85 return NULL; \
86 } \
87 } while (0)
88
89static PyObject *
90stpy_str (PyObject *self)
91{
92 PyObject *result;
93 struct symtab *symtab = NULL;
94
95 STPY_REQUIRE_VALID (self, symtab);
96
05cba821 97 result = PyString_FromString (symtab_to_filename_for_display (symtab));
f3e9a817
PM
98
99 return result;
100}
101
102static PyObject *
103stpy_get_filename (PyObject *self, void *closure)
104{
105 PyObject *str_obj;
106 struct symtab *symtab = NULL;
05cba821 107 const char *filename;
f3e9a817
PM
108
109 STPY_REQUIRE_VALID (self, symtab);
05cba821 110 filename = symtab_to_filename_for_display (symtab);
f3e9a817 111
4ae6cc19 112 str_obj = host_string_to_python_string (filename);
f3e9a817
PM
113 return str_obj;
114}
115
116static PyObject *
117stpy_get_objfile (PyObject *self, void *closure)
118{
119 struct symtab *symtab = NULL;
120 PyObject *result;
121
122 STPY_REQUIRE_VALID (self, symtab);
123
eb822aa6 124 result = objfile_to_objfile_object (SYMTAB_OBJFILE (symtab));
f3e9a817
PM
125 Py_XINCREF (result);
126 return result;
127}
128
2b4fd423
DE
129/* Getter function for symtab.producer. */
130
131static PyObject *
132stpy_get_producer (PyObject *self, void *closure)
133{
134 struct symtab *symtab = NULL;
43f3e411 135 struct compunit_symtab *cust;
2b4fd423
DE
136
137 STPY_REQUIRE_VALID (self, symtab);
43f3e411
DE
138 cust = SYMTAB_COMPUNIT (symtab);
139 if (COMPUNIT_PRODUCER (cust) != NULL)
2b4fd423 140 {
43f3e411 141 const char *producer = COMPUNIT_PRODUCER (cust);
2b4fd423 142
4ae6cc19 143 return host_string_to_python_string (producer);
2b4fd423
DE
144 }
145
146 Py_RETURN_NONE;
147}
148
f3e9a817
PM
149static PyObject *
150stpy_fullname (PyObject *self, PyObject *args)
151{
0b0865da 152 const char *fullname;
f3e9a817
PM
153 struct symtab *symtab = NULL;
154
155 STPY_REQUIRE_VALID (self, symtab);
156
157 fullname = symtab_to_fullname (symtab);
f3e9a817 158
4ae6cc19 159 return host_string_to_python_string (fullname);
f3e9a817
PM
160}
161
29703da4
PM
162/* Implementation of gdb.Symtab.is_valid (self) -> Boolean.
163 Returns True if this Symbol table still exists in GDB. */
164
165static PyObject *
166stpy_is_valid (PyObject *self, PyObject *args)
167{
168 struct symtab *symtab = NULL;
169
170 symtab = symtab_object_to_symtab (self);
171 if (symtab == NULL)
172 Py_RETURN_FALSE;
173
174 Py_RETURN_TRUE;
175}
176
a20ee7a4
SCR
177/* Return the GLOBAL_BLOCK of the underlying symtab. */
178
179static PyObject *
180stpy_global_block (PyObject *self, PyObject *args)
181{
182 struct symtab *symtab = NULL;
183 struct block *block = NULL;
346d1dfe 184 const struct blockvector *blockvector;
a20ee7a4
SCR
185
186 STPY_REQUIRE_VALID (self, symtab);
187
439247b6 188 blockvector = SYMTAB_BLOCKVECTOR (symtab);
a20ee7a4 189 block = BLOCKVECTOR_BLOCK (blockvector, GLOBAL_BLOCK);
eb822aa6 190 return block_to_block_object (block, SYMTAB_OBJFILE (symtab));
a20ee7a4
SCR
191}
192
193/* Return the STATIC_BLOCK of the underlying symtab. */
194
195static PyObject *
196stpy_static_block (PyObject *self, PyObject *args)
197{
198 struct symtab *symtab = NULL;
199 struct block *block = NULL;
346d1dfe 200 const struct blockvector *blockvector;
a20ee7a4
SCR
201
202 STPY_REQUIRE_VALID (self, symtab);
203
439247b6 204 blockvector = SYMTAB_BLOCKVECTOR (symtab);
a20ee7a4 205 block = BLOCKVECTOR_BLOCK (blockvector, STATIC_BLOCK);
eb822aa6 206 return block_to_block_object (block, SYMTAB_OBJFILE (symtab));
a20ee7a4
SCR
207}
208
4efd80aa
CS
209/* Implementation of gdb.Symtab.linetable (self) -> gdb.LineTable.
210 Returns a gdb.LineTable object corresponding to this symbol
bc79de95
PM
211 table. */
212
213static PyObject *
214stpy_get_linetable (PyObject *self, PyObject *args)
215{
216 struct symtab *symtab = NULL;
217
218 STPY_REQUIRE_VALID (self, symtab);
219
220 return symtab_to_linetable_object (self);
221}
222
f3e9a817
PM
223static PyObject *
224salpy_str (PyObject *self)
225{
05cba821
JK
226 char *s;
227 const char *filename;
f3e9a817
PM
228 sal_object *sal_obj;
229 PyObject *result;
230 struct symtab_and_line *sal = NULL;
231
232 SALPY_REQUIRE_VALID (self, sal);
233
234 sal_obj = (sal_object *) self;
235 filename = (sal_obj->symtab == (symtab_object *) Py_None)
05cba821 236 ? "<unknown>" : symtab_to_filename_for_display (sal_obj->symtab->symtab);
f3e9a817
PM
237
238 s = xstrprintf ("symbol and line for %s, line %d", filename,
239 sal->line);
240
241 result = PyString_FromString (s);
242 xfree (s);
243
244 return result;
245}
246
247static void
248stpy_dealloc (PyObject *obj)
249{
250 symtab_object *symtab = (symtab_object *) obj;
251
252 if (symtab->prev)
253 symtab->prev->next = symtab->next;
254 else if (symtab->symtab)
255 {
eb822aa6 256 set_objfile_data (SYMTAB_OBJFILE (symtab->symtab),
f3e9a817
PM
257 stpy_objfile_data_key, symtab->next);
258 }
259 if (symtab->next)
260 symtab->next->prev = symtab->prev;
261 symtab->symtab = NULL;
262}
263
264
265static PyObject *
266salpy_get_pc (PyObject *self, void *closure)
267{
268 struct symtab_and_line *sal = NULL;
269
270 SALPY_REQUIRE_VALID (self, sal);
271
74aedc46 272 return gdb_py_long_from_ulongest (sal->pc);
f3e9a817
PM
273}
274
ee0bf529
SCR
275/* Implementation of the get method for the 'last' attribute of
276 gdb.Symtab_and_line. */
277
278static PyObject *
279salpy_get_last (PyObject *self, void *closure)
280{
281 struct symtab_and_line *sal = NULL;
282
283 SALPY_REQUIRE_VALID (self, sal);
284
285 if (sal->end > 0)
286 return gdb_py_long_from_ulongest (sal->end - 1);
287 else
288 Py_RETURN_NONE;
289}
290
f3e9a817
PM
291static PyObject *
292salpy_get_line (PyObject *self, void *closure)
293{
294 struct symtab_and_line *sal = NULL;
295
296 SALPY_REQUIRE_VALID (self, sal);
297
74aedc46 298 return PyInt_FromLong (sal->line);
f3e9a817
PM
299}
300
301static PyObject *
302salpy_get_symtab (PyObject *self, void *closure)
303{
304 struct symtab_and_line *sal;
305 sal_object *self_sal = (sal_object *) self;
306
307 SALPY_REQUIRE_VALID (self, sal);
308
309 Py_INCREF (self_sal->symtab);
310
311 return (PyObject *) self_sal->symtab;
312}
313
29703da4
PM
314/* Implementation of gdb.Symtab_and_line.is_valid (self) -> Boolean.
315 Returns True if this Symbol table and line object still exists GDB. */
316
317static PyObject *
318salpy_is_valid (PyObject *self, PyObject *args)
319{
320 struct symtab_and_line *sal;
321
322 sal = sal_object_to_symtab_and_line (self);
323 if (sal == NULL)
324 Py_RETURN_FALSE;
325
326 Py_RETURN_TRUE;
327}
328
f3e9a817
PM
329static void
330salpy_dealloc (PyObject *self)
331{
332 sal_object *self_sal = (sal_object *) self;
333
334 if (self_sal->prev)
335 self_sal->prev->next = self_sal->next;
336 else if (self_sal->symtab != (symtab_object * ) Py_None)
eb822aa6 337 set_objfile_data (SYMTAB_OBJFILE (self_sal->symtab->symtab),
f3e9a817
PM
338 salpy_objfile_data_key, self_sal->next);
339
340 if (self_sal->next)
341 self_sal->next->prev = self_sal->prev;
342
343 Py_DECREF (self_sal->symtab);
344 xfree (self_sal->sal);
9a27f2c6 345 Py_TYPE (self)->tp_free (self);
f3e9a817
PM
346}
347
b021a221
MS
348/* Given a sal, and a sal_object that has previously been allocated
349 and initialized, populate the sal_object with the struct sal data.
350 Also, register the sal_object life-cycle with the life-cycle of the
351 object file associated with this sal, if needed. If a failure
33ee792f
TT
352 occurs during the sal population, this function will return -1. */
353static int CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION
f3e9a817
PM
354set_sal (sal_object *sal_obj, struct symtab_and_line sal)
355{
356 symtab_object *symtab_obj;
357
358 if (sal.symtab)
359 {
360 symtab_obj = (symtab_object *) symtab_to_symtab_object (sal.symtab);
361 /* If a symtab existed in the sal, but it cannot be duplicated,
362 we exit. */
363 if (symtab_obj == NULL)
33ee792f 364 return -1;
f3e9a817
PM
365 }
366 else
367 {
368 symtab_obj = (symtab_object *) Py_None;
369 Py_INCREF (Py_None);
370 }
371
224c3ddb
SM
372 sal_obj->sal = ((struct symtab_and_line *)
373 xmemdup (&sal, sizeof (struct symtab_and_line),
374 sizeof (struct symtab_and_line)));
f3e9a817
PM
375 sal_obj->symtab = symtab_obj;
376 sal_obj->prev = NULL;
377
378 /* If the SAL does not have a symtab, we do not add it to the
379 objfile cleanup observer linked list. */
380 if (sal_obj->symtab != (symtab_object *)Py_None)
381 {
19ba03f4
SM
382 sal_obj->next
383 = ((struct salpy_sal_object *)
384 objfile_data (SYMTAB_OBJFILE (sal_obj->symtab->symtab),
385 salpy_objfile_data_key));
f3e9a817
PM
386 if (sal_obj->next)
387 sal_obj->next->prev = sal_obj;
388
eb822aa6 389 set_objfile_data (SYMTAB_OBJFILE (sal_obj->symtab->symtab),
f3e9a817
PM
390 salpy_objfile_data_key, sal_obj);
391 }
392 else
393 sal_obj->next = NULL;
394
33ee792f 395 return 0;
f3e9a817
PM
396}
397
398/* Given a symtab, and a symtab_object that has previously been
399 allocated and initialized, populate the symtab_object with the
400 struct symtab data. Also, register the symtab_object life-cycle
b021a221 401 with the life-cycle of the object file associated with this
f3e9a817
PM
402 symtab, if needed. */
403static void
404set_symtab (symtab_object *obj, struct symtab *symtab)
405{
406 obj->symtab = symtab;
407 obj->prev = NULL;
408 if (symtab)
409 {
19ba03f4
SM
410 obj->next
411 = ((struct stpy_symtab_object *)
412 objfile_data (SYMTAB_OBJFILE (symtab), stpy_objfile_data_key));
f3e9a817
PM
413 if (obj->next)
414 obj->next->prev = obj;
eb822aa6 415 set_objfile_data (SYMTAB_OBJFILE (symtab), stpy_objfile_data_key, obj);
f3e9a817
PM
416 }
417 else
418 obj->next = NULL;
419}
420
421/* Create a new symbol table (gdb.Symtab) object that encapsulates the
422 symtab structure from GDB. */
423PyObject *
424symtab_to_symtab_object (struct symtab *symtab)
425{
426 symtab_object *symtab_obj;
427
428 symtab_obj = PyObject_New (symtab_object, &symtab_object_type);
429 if (symtab_obj)
430 set_symtab (symtab_obj, symtab);
431
432 return (PyObject *) symtab_obj;
433}
434
435/* Create a new symtab and line (gdb.Symtab_and_line) object
436 that encapsulates the symtab_and_line structure from GDB. */
437PyObject *
438symtab_and_line_to_sal_object (struct symtab_and_line sal)
f3e9a817 439{
88b6faea
TT
440 gdbpy_ref<sal_object> sal_obj (PyObject_New (sal_object, &sal_object_type));
441 if (sal_obj != NULL)
f3e9a817 442 {
88b6faea
TT
443 if (set_sal (sal_obj.get (), sal) < 0)
444 return NULL;
f3e9a817
PM
445 }
446
88b6faea 447 return (PyObject *) sal_obj.release ();
f3e9a817
PM
448}
449
450/* Return struct symtab_and_line reference that is wrapped by this
451 object. */
452struct symtab_and_line *
453sal_object_to_symtab_and_line (PyObject *obj)
454{
455 if (! PyObject_TypeCheck (obj, &sal_object_type))
456 return NULL;
457 return ((sal_object *) obj)->sal;
458}
459
460/* Return struct symtab reference that is wrapped by this object. */
461struct symtab *
462symtab_object_to_symtab (PyObject *obj)
463{
464 if (! PyObject_TypeCheck (obj, &symtab_object_type))
465 return NULL;
466 return ((symtab_object *) obj)->symtab;
467}
468
469/* This function is called when an objfile is about to be freed.
470 Invalidate the symbol table as further actions on the symbol table
471 would result in bad data. All access to obj->symtab should be
472 gated by STPY_REQUIRE_VALID which will raise an exception on
473 invalid symbol tables. */
474static void
475del_objfile_symtab (struct objfile *objfile, void *datum)
476{
19ba03f4 477 symtab_object *obj = (symtab_object *) datum;
d59b6f6c 478
f3e9a817
PM
479 while (obj)
480 {
481 symtab_object *next = obj->next;
482
483 obj->symtab = NULL;
484 obj->next = NULL;
485 obj->prev = NULL;
486 obj = next;
487 }
488}
489
490/* This function is called when an objfile is about to be freed.
491 Invalidate the sal object as further actions on the sal
492 would result in bad data. All access to obj->sal should be
493 gated by SALPY_REQUIRE_VALID which will raise an exception on
494 invalid symbol table and line objects. */
495static void
496del_objfile_sal (struct objfile *objfile, void *datum)
497{
19ba03f4 498 sal_object *obj = (sal_object *) datum;
d59b6f6c 499
f3e9a817
PM
500 while (obj)
501 {
502 sal_object *next = obj->next;
503
801e4185
TT
504 Py_DECREF (obj->symtab);
505 obj->symtab = (symtab_object *) Py_None;
506 Py_INCREF (Py_None);
507
f3e9a817
PM
508 obj->next = NULL;
509 obj->prev = NULL;
510 xfree (obj->sal);
511 obj->sal = NULL;
512
513 obj = next;
514 }
515}
516
999633ed 517int
f3e9a817
PM
518gdbpy_initialize_symtabs (void)
519{
520 symtab_object_type.tp_new = PyType_GenericNew;
521 if (PyType_Ready (&symtab_object_type) < 0)
999633ed 522 return -1;
f3e9a817
PM
523
524 sal_object_type.tp_new = PyType_GenericNew;
525 if (PyType_Ready (&sal_object_type) < 0)
999633ed 526 return -1;
f3e9a817
PM
527
528 /* Register an objfile "free" callback so we can properly
529 invalidate symbol tables, and symbol table and line data
530 structures when an object file that is about to be
531 deleted. */
532 stpy_objfile_data_key
533 = register_objfile_data_with_cleanup (NULL, del_objfile_symtab);
534 salpy_objfile_data_key
535 = register_objfile_data_with_cleanup (NULL, del_objfile_sal);
536
aa36459a
TT
537 if (gdb_pymodule_addobject (gdb_module, "Symtab",
538 (PyObject *) &symtab_object_type) < 0)
999633ed 539 return -1;
f3e9a817 540
aa36459a
TT
541 return gdb_pymodule_addobject (gdb_module, "Symtab_and_line",
542 (PyObject *) &sal_object_type);
f3e9a817
PM
543}
544
545\f
546
0d1f4ceb 547static gdb_PyGetSetDef symtab_object_getset[] = {
f3e9a817
PM
548 { "filename", stpy_get_filename, NULL,
549 "The symbol table's source filename.", NULL },
550 { "objfile", stpy_get_objfile, NULL, "The symtab's objfile.",
551 NULL },
2b4fd423
DE
552 { "producer", stpy_get_producer, NULL,
553 "The name/version of the program that compiled this symtab.", NULL },
f3e9a817
PM
554 {NULL} /* Sentinel */
555};
556
557static PyMethodDef symtab_object_methods[] = {
29703da4
PM
558 { "is_valid", stpy_is_valid, METH_NOARGS,
559 "is_valid () -> Boolean.\n\
560Return true if this symbol table is valid, false if not." },
f3e9a817
PM
561 { "fullname", stpy_fullname, METH_NOARGS,
562 "fullname () -> String.\n\
563Return the symtab's full source filename." },
a20ee7a4
SCR
564 { "global_block", stpy_global_block, METH_NOARGS,
565 "global_block () -> gdb.Block.\n\
566Return the global block of the symbol table." },
567 { "static_block", stpy_static_block, METH_NOARGS,
568 "static_block () -> gdb.Block.\n\
569Return the static block of the symbol table." },
bc79de95 570 { "linetable", stpy_get_linetable, METH_NOARGS,
4efd80aa
CS
571 "linetable () -> gdb.LineTable.\n\
572Return the LineTable associated with this symbol table" },
f3e9a817
PM
573 {NULL} /* Sentinel */
574};
575
e36122e9 576PyTypeObject symtab_object_type = {
9a27f2c6 577 PyVarObject_HEAD_INIT (NULL, 0)
f3e9a817
PM
578 "gdb.Symtab", /*tp_name*/
579 sizeof (symtab_object), /*tp_basicsize*/
580 0, /*tp_itemsize*/
581 stpy_dealloc, /*tp_dealloc*/
582 0, /*tp_print*/
583 0, /*tp_getattr*/
584 0, /*tp_setattr*/
585 0, /*tp_compare*/
586 0, /*tp_repr*/
587 0, /*tp_as_number*/
588 0, /*tp_as_sequence*/
589 0, /*tp_as_mapping*/
590 0, /*tp_hash */
591 0, /*tp_call*/
592 stpy_str, /*tp_str*/
593 0, /*tp_getattro*/
594 0, /*tp_setattro*/
595 0, /*tp_as_buffer*/
596 Py_TPFLAGS_DEFAULT, /*tp_flags*/
597 "GDB symtab object", /*tp_doc */
598 0, /*tp_traverse */
599 0, /*tp_clear */
600 0, /*tp_richcompare */
601 0, /*tp_weaklistoffset */
602 0, /*tp_iter */
603 0, /*tp_iternext */
604 symtab_object_methods, /*tp_methods */
605 0, /*tp_members */
606 symtab_object_getset /*tp_getset */
607};
608
0d1f4ceb 609static gdb_PyGetSetDef sal_object_getset[] = {
f3e9a817
PM
610 { "symtab", salpy_get_symtab, NULL, "Symtab object.", NULL },
611 { "pc", salpy_get_pc, NULL, "Return the symtab_and_line's pc.", NULL },
ee0bf529
SCR
612 { "last", salpy_get_last, NULL,
613 "Return the symtab_and_line's last address.", NULL },
f3e9a817
PM
614 { "line", salpy_get_line, NULL,
615 "Return the symtab_and_line's line.", NULL },
616 {NULL} /* Sentinel */
617};
618
29703da4
PM
619static PyMethodDef sal_object_methods[] = {
620 { "is_valid", salpy_is_valid, METH_NOARGS,
621 "is_valid () -> Boolean.\n\
622Return true if this symbol table and line is valid, false if not." },
623 {NULL} /* Sentinel */
624};
625
e36122e9 626PyTypeObject sal_object_type = {
9a27f2c6 627 PyVarObject_HEAD_INIT (NULL, 0)
f3e9a817
PM
628 "gdb.Symtab_and_line", /*tp_name*/
629 sizeof (sal_object), /*tp_basicsize*/
630 0, /*tp_itemsize*/
631 salpy_dealloc, /*tp_dealloc*/
632 0, /*tp_print*/
633 0, /*tp_getattr*/
634 0, /*tp_setattr*/
635 0, /*tp_compare*/
636 0, /*tp_repr*/
637 0, /*tp_as_number*/
638 0, /*tp_as_sequence*/
639 0, /*tp_as_mapping*/
640 0, /*tp_hash */
641 0, /*tp_call*/
642 salpy_str, /*tp_str*/
643 0, /*tp_getattro*/
644 0, /*tp_setattro*/
645 0, /*tp_as_buffer*/
646 Py_TPFLAGS_DEFAULT, /*tp_flags*/
647 "GDB symtab_and_line object", /*tp_doc */
648 0, /*tp_traverse */
649 0, /*tp_clear */
650 0, /*tp_richcompare */
651 0, /*tp_weaklistoffset */
652 0, /*tp_iter */
653 0, /*tp_iternext */
29703da4 654 sal_object_methods, /*tp_methods */
f3e9a817
PM
655 0, /*tp_members */
656 sal_object_getset /*tp_getset */
657};
This page took 0.838484 seconds and 4 git commands to generate.