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