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