Convert lvalue reference type check to general reference type check
[deliverable/binutils-gdb.git] / gdb / python / py-type.c
1 /* Python interface to types.
2
3 Copyright (C) 2008-2017 Free Software Foundation, Inc.
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 "value.h"
22 #include "python-internal.h"
23 #include "charset.h"
24 #include "gdbtypes.h"
25 #include "cp-support.h"
26 #include "demangle.h"
27 #include "objfiles.h"
28 #include "language.h"
29 #include "vec.h"
30 #include "typeprint.h"
31 #include "py-ref.h"
32
33 typedef struct pyty_type_object
34 {
35 PyObject_HEAD
36 struct type *type;
37
38 /* If a Type object is associated with an objfile, it is kept on a
39 doubly-linked list, rooted in the objfile. This lets us copy the
40 underlying struct type when the objfile is deleted. */
41 struct pyty_type_object *prev;
42 struct pyty_type_object *next;
43 } type_object;
44
45 extern PyTypeObject type_object_type
46 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("type_object");
47
48 /* A Field object. */
49 typedef struct pyty_field_object
50 {
51 PyObject_HEAD
52
53 /* Dictionary holding our attributes. */
54 PyObject *dict;
55 } field_object;
56
57 extern PyTypeObject field_object_type
58 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("field_object");
59
60 /* A type iterator object. */
61 typedef struct {
62 PyObject_HEAD
63 /* The current field index. */
64 int field;
65 /* What to return. */
66 enum gdbpy_iter_kind kind;
67 /* Pointer back to the original source type object. */
68 struct pyty_type_object *source;
69 } typy_iterator_object;
70
71 extern PyTypeObject type_iterator_object_type
72 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("typy_iterator_object");
73
74 /* This is used to initialize various gdb.TYPE_ constants. */
75 struct pyty_code
76 {
77 /* The code. */
78 enum type_code code;
79 /* The name. */
80 const char *name;
81 };
82
83 /* Forward declarations. */
84 static PyObject *typy_make_iter (PyObject *self, enum gdbpy_iter_kind kind);
85
86 #define ENTRY(X) { X, #X }
87
88 static struct pyty_code pyty_codes[] =
89 {
90 ENTRY (TYPE_CODE_BITSTRING),
91 ENTRY (TYPE_CODE_PTR),
92 ENTRY (TYPE_CODE_ARRAY),
93 ENTRY (TYPE_CODE_STRUCT),
94 ENTRY (TYPE_CODE_UNION),
95 ENTRY (TYPE_CODE_ENUM),
96 ENTRY (TYPE_CODE_FLAGS),
97 ENTRY (TYPE_CODE_FUNC),
98 ENTRY (TYPE_CODE_INT),
99 ENTRY (TYPE_CODE_FLT),
100 ENTRY (TYPE_CODE_VOID),
101 ENTRY (TYPE_CODE_SET),
102 ENTRY (TYPE_CODE_RANGE),
103 ENTRY (TYPE_CODE_STRING),
104 ENTRY (TYPE_CODE_ERROR),
105 ENTRY (TYPE_CODE_METHOD),
106 ENTRY (TYPE_CODE_METHODPTR),
107 ENTRY (TYPE_CODE_MEMBERPTR),
108 ENTRY (TYPE_CODE_REF),
109 ENTRY (TYPE_CODE_RVALUE_REF),
110 ENTRY (TYPE_CODE_CHAR),
111 ENTRY (TYPE_CODE_BOOL),
112 ENTRY (TYPE_CODE_COMPLEX),
113 ENTRY (TYPE_CODE_TYPEDEF),
114 ENTRY (TYPE_CODE_NAMESPACE),
115 ENTRY (TYPE_CODE_DECFLOAT),
116 ENTRY (TYPE_CODE_INTERNAL_FUNCTION),
117 { TYPE_CODE_UNDEF, NULL }
118 };
119
120 \f
121
122 static void
123 field_dealloc (PyObject *obj)
124 {
125 field_object *f = (field_object *) obj;
126
127 Py_XDECREF (f->dict);
128 Py_TYPE (obj)->tp_free (obj);
129 }
130
131 static PyObject *
132 field_new (void)
133 {
134 gdbpy_ref<field_object> result (PyObject_New (field_object,
135 &field_object_type));
136
137 if (result != NULL)
138 {
139 result->dict = PyDict_New ();
140 if (!result->dict)
141 return NULL;
142 }
143 return (PyObject *) result.release ();
144 }
145
146 \f
147
148 /* Return true if OBJ is of type gdb.Field, false otherwise. */
149
150 int
151 gdbpy_is_field (PyObject *obj)
152 {
153 return PyObject_TypeCheck (obj, &field_object_type);
154 }
155
156 /* Return the code for this type. */
157 static PyObject *
158 typy_get_code (PyObject *self, void *closure)
159 {
160 struct type *type = ((type_object *) self)->type;
161
162 return PyInt_FromLong (TYPE_CODE (type));
163 }
164
165 /* Helper function for typy_fields which converts a single field to a
166 gdb.Field object. Returns NULL on error. */
167
168 static PyObject *
169 convert_field (struct type *type, int field)
170 {
171 gdbpy_ref<> result (field_new ());
172
173 if (result == NULL)
174 return NULL;
175
176 gdbpy_ref<> arg (type_to_type_object (type));
177 if (arg == NULL)
178 return NULL;
179 if (PyObject_SetAttrString (result.get (), "parent_type", arg.get ()) < 0)
180 return NULL;
181
182 if (!field_is_static (&TYPE_FIELD (type, field)))
183 {
184 const char *attrstring;
185
186 if (TYPE_CODE (type) == TYPE_CODE_ENUM)
187 {
188 arg.reset (gdb_py_long_from_longest (TYPE_FIELD_ENUMVAL (type,
189 field)));
190 attrstring = "enumval";
191 }
192 else
193 {
194 arg.reset (gdb_py_long_from_longest (TYPE_FIELD_BITPOS (type,
195 field)));
196 attrstring = "bitpos";
197 }
198
199 if (arg == NULL)
200 return NULL;
201
202 /* At least python-2.4 had the second parameter non-const. */
203 if (PyObject_SetAttrString (result.get (), (char *) attrstring,
204 arg.get ()) < 0)
205 return NULL;
206 }
207
208 arg.reset (NULL);
209 if (TYPE_FIELD_NAME (type, field))
210 {
211 const char *field_name = TYPE_FIELD_NAME (type, field);
212
213 if (field_name[0] != '\0')
214 {
215 arg.reset (PyString_FromString (TYPE_FIELD_NAME (type, field)));
216 if (arg == NULL)
217 return NULL;
218 }
219 }
220 if (arg == NULL)
221 {
222 arg.reset (Py_None);
223 Py_INCREF (arg.get ());
224 }
225 if (PyObject_SetAttrString (result.get (), "name", arg.get ()) < 0)
226 return NULL;
227
228 arg.reset (TYPE_FIELD_ARTIFICIAL (type, field) ? Py_True : Py_False);
229 Py_INCREF (arg.get ());
230 if (PyObject_SetAttrString (result.get (), "artificial", arg.get ()) < 0)
231 return NULL;
232
233 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
234 arg.reset (field < TYPE_N_BASECLASSES (type) ? Py_True : Py_False);
235 else
236 arg.reset (Py_False);
237 Py_INCREF (arg.get ());
238 if (PyObject_SetAttrString (result.get (), "is_base_class", arg.get ()) < 0)
239 return NULL;
240
241 arg.reset (PyLong_FromLong (TYPE_FIELD_BITSIZE (type, field)));
242 if (arg == NULL)
243 return NULL;
244 if (PyObject_SetAttrString (result.get (), "bitsize", arg.get ()) < 0)
245 return NULL;
246
247 /* A field can have a NULL type in some situations. */
248 if (TYPE_FIELD_TYPE (type, field) == NULL)
249 {
250 arg.reset (Py_None);
251 Py_INCREF (arg.get ());
252 }
253 else
254 arg.reset (type_to_type_object (TYPE_FIELD_TYPE (type, field)));
255 if (arg == NULL)
256 return NULL;
257 if (PyObject_SetAttrString (result.get (), "type", arg.get ()) < 0)
258 return NULL;
259
260 return result.release ();
261 }
262
263 /* Helper function to return the name of a field, as a gdb.Field object.
264 If the field doesn't have a name, None is returned. */
265
266 static PyObject *
267 field_name (struct type *type, int field)
268 {
269 PyObject *result;
270
271 if (TYPE_FIELD_NAME (type, field))
272 result = PyString_FromString (TYPE_FIELD_NAME (type, field));
273 else
274 {
275 result = Py_None;
276 Py_INCREF (result);
277 }
278 return result;
279 }
280
281 /* Helper function for Type standard mapping methods. Returns a
282 Python object for field i of the type. "kind" specifies what to
283 return: the name of the field, a gdb.Field object corresponding to
284 the field, or a tuple consisting of field name and gdb.Field
285 object. */
286
287 static PyObject *
288 make_fielditem (struct type *type, int i, enum gdbpy_iter_kind kind)
289 {
290 switch (kind)
291 {
292 case iter_items:
293 {
294 gdbpy_ref<> key (field_name (type, i));
295 if (key == NULL)
296 return NULL;
297 gdbpy_ref<> value (convert_field (type, i));
298 if (value == NULL)
299 return NULL;
300 gdbpy_ref<> item (PyTuple_New (2));
301 if (item == NULL)
302 return NULL;
303 PyTuple_SET_ITEM (item.get (), 0, key.release ());
304 PyTuple_SET_ITEM (item.get (), 1, value.release ());
305 return item.release ();
306 }
307 case iter_keys:
308 return field_name (type, i);
309 case iter_values:
310 return convert_field (type, i);
311 }
312 gdb_assert_not_reached ("invalid gdbpy_iter_kind");
313 }
314
315 /* Return a sequence of all field names, fields, or (name, field) pairs.
316 Each field is a gdb.Field object. */
317
318 static PyObject *
319 typy_fields_items (PyObject *self, enum gdbpy_iter_kind kind)
320 {
321 PyObject *py_type = self;
322 PyObject *result = NULL, *iter = NULL;
323 struct type *type = ((type_object *) py_type)->type;
324 struct type *checked_type = type;
325
326 TRY
327 {
328 checked_type = check_typedef (checked_type);
329 }
330 CATCH (except, RETURN_MASK_ALL)
331 {
332 GDB_PY_HANDLE_EXCEPTION (except);
333 }
334 END_CATCH
335
336 if (checked_type != type)
337 py_type = type_to_type_object (checked_type);
338 iter = typy_make_iter (py_type, kind);
339 if (checked_type != type)
340 {
341 /* Need to wrap this in braces because Py_DECREF isn't wrapped
342 in a do{}while(0). */
343 Py_DECREF (py_type);
344 }
345 if (iter != NULL)
346 {
347 result = PySequence_List (iter);
348 Py_DECREF (iter);
349 }
350
351 return result;
352 }
353
354 /* Return a sequence of all fields. Each field is a gdb.Field object. */
355
356 static PyObject *
357 typy_values (PyObject *self, PyObject *args)
358 {
359 return typy_fields_items (self, iter_values);
360 }
361
362 /* Return a sequence of all fields. Each field is a gdb.Field object.
363 This method is similar to typy_values, except where the supplied
364 gdb.Type is an array, in which case it returns a list of one entry
365 which is a gdb.Field object for a range (the array bounds). */
366
367 static PyObject *
368 typy_fields (PyObject *self, PyObject *args)
369 {
370 struct type *type = ((type_object *) self)->type;
371
372 if (TYPE_CODE (type) != TYPE_CODE_ARRAY)
373 return typy_fields_items (self, iter_values);
374
375 /* Array type. Handle this as a special case because the common
376 machinery wants struct or union or enum types. Build a list of
377 one entry which is the range for the array. */
378 gdbpy_ref<> r (convert_field (type, 0));
379 if (r == NULL)
380 return NULL;
381
382 return Py_BuildValue ("[O]", r.get ());
383 }
384
385 /* Return a sequence of all field names. Each field is a gdb.Field object. */
386
387 static PyObject *
388 typy_field_names (PyObject *self, PyObject *args)
389 {
390 return typy_fields_items (self, iter_keys);
391 }
392
393 /* Return a sequence of all (name, fields) pairs. Each field is a
394 gdb.Field object. */
395
396 static PyObject *
397 typy_items (PyObject *self, PyObject *args)
398 {
399 return typy_fields_items (self, iter_items);
400 }
401
402 /* Return the type's name, or None. */
403
404 static PyObject *
405 typy_get_name (PyObject *self, void *closure)
406 {
407 struct type *type = ((type_object *) self)->type;
408
409 if (TYPE_NAME (type) == NULL)
410 Py_RETURN_NONE;
411 return PyString_FromString (TYPE_NAME (type));
412 }
413
414 /* Return the type's tag, or None. */
415 static PyObject *
416 typy_get_tag (PyObject *self, void *closure)
417 {
418 struct type *type = ((type_object *) self)->type;
419
420 if (!TYPE_TAG_NAME (type))
421 Py_RETURN_NONE;
422 return PyString_FromString (TYPE_TAG_NAME (type));
423 }
424
425 /* Return the type, stripped of typedefs. */
426 static PyObject *
427 typy_strip_typedefs (PyObject *self, PyObject *args)
428 {
429 struct type *type = ((type_object *) self)->type;
430
431 TRY
432 {
433 type = check_typedef (type);
434 }
435 CATCH (except, RETURN_MASK_ALL)
436 {
437 GDB_PY_HANDLE_EXCEPTION (except);
438 }
439 END_CATCH
440
441 return type_to_type_object (type);
442 }
443
444 /* Strip typedefs and pointers/reference from a type. Then check that
445 it is a struct, union, or enum type. If not, raise TypeError. */
446
447 static struct type *
448 typy_get_composite (struct type *type)
449 {
450
451 for (;;)
452 {
453 TRY
454 {
455 type = check_typedef (type);
456 }
457 CATCH (except, RETURN_MASK_ALL)
458 {
459 GDB_PY_HANDLE_EXCEPTION (except);
460 }
461 END_CATCH
462
463 if (TYPE_CODE (type) != TYPE_CODE_PTR && !TYPE_IS_REFERENCE (type))
464 break;
465 type = TYPE_TARGET_TYPE (type);
466 }
467
468 /* If this is not a struct, union, or enum type, raise TypeError
469 exception. */
470 if (TYPE_CODE (type) != TYPE_CODE_STRUCT
471 && TYPE_CODE (type) != TYPE_CODE_UNION
472 && TYPE_CODE (type) != TYPE_CODE_ENUM
473 && TYPE_CODE (type) != TYPE_CODE_FUNC)
474 {
475 PyErr_SetString (PyExc_TypeError,
476 "Type is not a structure, union, enum, or function type.");
477 return NULL;
478 }
479
480 return type;
481 }
482
483 /* Helper for typy_array and typy_vector. */
484
485 static PyObject *
486 typy_array_1 (PyObject *self, PyObject *args, int is_vector)
487 {
488 long n1, n2;
489 PyObject *n2_obj = NULL;
490 struct type *array = NULL;
491 struct type *type = ((type_object *) self)->type;
492
493 if (! PyArg_ParseTuple (args, "l|O", &n1, &n2_obj))
494 return NULL;
495
496 if (n2_obj)
497 {
498 if (!PyInt_Check (n2_obj))
499 {
500 PyErr_SetString (PyExc_RuntimeError,
501 _("Array bound must be an integer"));
502 return NULL;
503 }
504
505 if (! gdb_py_int_as_long (n2_obj, &n2))
506 return NULL;
507 }
508 else
509 {
510 n2 = n1;
511 n1 = 0;
512 }
513
514 if (n2 < n1 - 1) /* Note: An empty array has n2 == n1 - 1. */
515 {
516 PyErr_SetString (PyExc_ValueError,
517 _("Array length must not be negative"));
518 return NULL;
519 }
520
521 TRY
522 {
523 array = lookup_array_range_type (type, n1, n2);
524 if (is_vector)
525 make_vector_type (array);
526 }
527 CATCH (except, RETURN_MASK_ALL)
528 {
529 GDB_PY_HANDLE_EXCEPTION (except);
530 }
531 END_CATCH
532
533 return type_to_type_object (array);
534 }
535
536 /* Return an array type. */
537
538 static PyObject *
539 typy_array (PyObject *self, PyObject *args)
540 {
541 return typy_array_1 (self, args, 0);
542 }
543
544 /* Return a vector type. */
545
546 static PyObject *
547 typy_vector (PyObject *self, PyObject *args)
548 {
549 return typy_array_1 (self, args, 1);
550 }
551
552 /* Return a Type object which represents a pointer to SELF. */
553 static PyObject *
554 typy_pointer (PyObject *self, PyObject *args)
555 {
556 struct type *type = ((type_object *) self)->type;
557
558 TRY
559 {
560 type = lookup_pointer_type (type);
561 }
562 CATCH (except, RETURN_MASK_ALL)
563 {
564 GDB_PY_HANDLE_EXCEPTION (except);
565 }
566 END_CATCH
567
568 return type_to_type_object (type);
569 }
570
571 /* Return the range of a type represented by SELF. The return type is
572 a tuple. The first element of the tuple contains the low bound,
573 while the second element of the tuple contains the high bound. */
574 static PyObject *
575 typy_range (PyObject *self, PyObject *args)
576 {
577 struct type *type = ((type_object *) self)->type;
578 /* Initialize these to appease GCC warnings. */
579 LONGEST low = 0, high = 0;
580
581 if (TYPE_CODE (type) != TYPE_CODE_ARRAY
582 && TYPE_CODE (type) != TYPE_CODE_STRING
583 && TYPE_CODE (type) != TYPE_CODE_RANGE)
584 {
585 PyErr_SetString (PyExc_RuntimeError,
586 _("This type does not have a range."));
587 return NULL;
588 }
589
590 switch (TYPE_CODE (type))
591 {
592 case TYPE_CODE_ARRAY:
593 case TYPE_CODE_STRING:
594 low = TYPE_LOW_BOUND (TYPE_INDEX_TYPE (type));
595 high = TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (type));
596 break;
597 case TYPE_CODE_RANGE:
598 low = TYPE_LOW_BOUND (type);
599 high = TYPE_HIGH_BOUND (type);
600 break;
601 }
602
603 gdbpy_ref<> low_bound (PyLong_FromLong (low));
604 if (low_bound == NULL)
605 return NULL;
606
607 gdbpy_ref<> high_bound (PyLong_FromLong (high));
608 if (high_bound == NULL)
609 return NULL;
610
611 gdbpy_ref<> result (PyTuple_New (2));
612 if (result == NULL)
613 return NULL;
614
615 if (PyTuple_SetItem (result.get (), 0, low_bound.release ()) != 0
616 || PyTuple_SetItem (result.get (), 1, high_bound.release ()) != 0)
617 return NULL;
618 return result.release ();
619 }
620
621 /* Return a Type object which represents a reference to SELF. */
622 static PyObject *
623 typy_reference (PyObject *self, PyObject *args)
624 {
625 struct type *type = ((type_object *) self)->type;
626
627 TRY
628 {
629 type = lookup_lvalue_reference_type (type);
630 }
631 CATCH (except, RETURN_MASK_ALL)
632 {
633 GDB_PY_HANDLE_EXCEPTION (except);
634 }
635 END_CATCH
636
637 return type_to_type_object (type);
638 }
639
640 /* Return a Type object which represents the target type of SELF. */
641 static PyObject *
642 typy_target (PyObject *self, PyObject *args)
643 {
644 struct type *type = ((type_object *) self)->type;
645
646 if (!TYPE_TARGET_TYPE (type))
647 {
648 PyErr_SetString (PyExc_RuntimeError,
649 _("Type does not have a target."));
650 return NULL;
651 }
652
653 return type_to_type_object (TYPE_TARGET_TYPE (type));
654 }
655
656 /* Return a const-qualified type variant. */
657 static PyObject *
658 typy_const (PyObject *self, PyObject *args)
659 {
660 struct type *type = ((type_object *) self)->type;
661
662 TRY
663 {
664 type = make_cv_type (1, 0, type, NULL);
665 }
666 CATCH (except, RETURN_MASK_ALL)
667 {
668 GDB_PY_HANDLE_EXCEPTION (except);
669 }
670 END_CATCH
671
672 return type_to_type_object (type);
673 }
674
675 /* Return a volatile-qualified type variant. */
676 static PyObject *
677 typy_volatile (PyObject *self, PyObject *args)
678 {
679 struct type *type = ((type_object *) self)->type;
680
681 TRY
682 {
683 type = make_cv_type (0, 1, type, NULL);
684 }
685 CATCH (except, RETURN_MASK_ALL)
686 {
687 GDB_PY_HANDLE_EXCEPTION (except);
688 }
689 END_CATCH
690
691 return type_to_type_object (type);
692 }
693
694 /* Return an unqualified type variant. */
695 static PyObject *
696 typy_unqualified (PyObject *self, PyObject *args)
697 {
698 struct type *type = ((type_object *) self)->type;
699
700 TRY
701 {
702 type = make_cv_type (0, 0, type, NULL);
703 }
704 CATCH (except, RETURN_MASK_ALL)
705 {
706 GDB_PY_HANDLE_EXCEPTION (except);
707 }
708 END_CATCH
709
710 return type_to_type_object (type);
711 }
712
713 /* Return the size of the type represented by SELF, in bytes. */
714 static PyObject *
715 typy_get_sizeof (PyObject *self, void *closure)
716 {
717 struct type *type = ((type_object *) self)->type;
718
719 TRY
720 {
721 check_typedef (type);
722 }
723 CATCH (except, RETURN_MASK_ALL)
724 {
725 }
726 END_CATCH
727
728 /* Ignore exceptions. */
729
730 return gdb_py_long_from_longest (TYPE_LENGTH (type));
731 }
732
733 static struct type *
734 typy_lookup_typename (const char *type_name, const struct block *block)
735 {
736 struct type *type = NULL;
737
738 TRY
739 {
740 if (startswith (type_name, "struct "))
741 type = lookup_struct (type_name + 7, NULL);
742 else if (startswith (type_name, "union "))
743 type = lookup_union (type_name + 6, NULL);
744 else if (startswith (type_name, "enum "))
745 type = lookup_enum (type_name + 5, NULL);
746 else
747 type = lookup_typename (python_language, python_gdbarch,
748 type_name, block, 0);
749 }
750 CATCH (except, RETURN_MASK_ALL)
751 {
752 GDB_PY_HANDLE_EXCEPTION (except);
753 }
754 END_CATCH
755
756 return type;
757 }
758
759 static struct type *
760 typy_lookup_type (struct demangle_component *demangled,
761 const struct block *block)
762 {
763 struct type *type, *rtype = NULL;
764 char *type_name = NULL;
765 enum demangle_component_type demangled_type;
766
767 /* Save the type: typy_lookup_type() may (indirectly) overwrite
768 memory pointed by demangled. */
769 demangled_type = demangled->type;
770
771 if (demangled_type == DEMANGLE_COMPONENT_POINTER
772 || demangled_type == DEMANGLE_COMPONENT_REFERENCE
773 || demangled_type == DEMANGLE_COMPONENT_RVALUE_REFERENCE
774 || demangled_type == DEMANGLE_COMPONENT_CONST
775 || demangled_type == DEMANGLE_COMPONENT_VOLATILE)
776 {
777 type = typy_lookup_type (demangled->u.s_binary.left, block);
778 if (! type)
779 return NULL;
780
781 TRY
782 {
783 /* If the demangled_type matches with one of the types
784 below, run the corresponding function and save the type
785 to return later. We cannot just return here as we are in
786 an exception handler. */
787 switch (demangled_type)
788 {
789 case DEMANGLE_COMPONENT_REFERENCE:
790 rtype = lookup_lvalue_reference_type (type);
791 break;
792 case DEMANGLE_COMPONENT_RVALUE_REFERENCE:
793 rtype = lookup_rvalue_reference_type (type);
794 break;
795 case DEMANGLE_COMPONENT_POINTER:
796 rtype = lookup_pointer_type (type);
797 break;
798 case DEMANGLE_COMPONENT_CONST:
799 rtype = make_cv_type (1, 0, type, NULL);
800 break;
801 case DEMANGLE_COMPONENT_VOLATILE:
802 rtype = make_cv_type (0, 1, type, NULL);
803 break;
804 }
805 }
806 CATCH (except, RETURN_MASK_ALL)
807 {
808 GDB_PY_HANDLE_EXCEPTION (except);
809 }
810 END_CATCH
811 }
812
813 /* If we have a type from the switch statement above, just return
814 that. */
815 if (rtype)
816 return rtype;
817
818 /* We don't have a type, so lookup the type. */
819 type_name = cp_comp_to_string (demangled, 10);
820 type = typy_lookup_typename (type_name, block);
821 xfree (type_name);
822
823 return type;
824 }
825
826 /* This is a helper function for typy_template_argument that is used
827 when the type does not have template symbols attached. It works by
828 parsing the type name. This happens with compilers, like older
829 versions of GCC, that do not emit DW_TAG_template_*. */
830
831 static PyObject *
832 typy_legacy_template_argument (struct type *type, const struct block *block,
833 int argno)
834 {
835 int i;
836 struct demangle_component *demangled;
837 std::unique_ptr<demangle_parse_info> info;
838 const char *err;
839 struct type *argtype;
840
841 if (TYPE_NAME (type) == NULL)
842 {
843 PyErr_SetString (PyExc_RuntimeError, _("Null type name."));
844 return NULL;
845 }
846
847 TRY
848 {
849 /* Note -- this is not thread-safe. */
850 info = cp_demangled_name_to_comp (TYPE_NAME (type), &err);
851 }
852 CATCH (except, RETURN_MASK_ALL)
853 {
854 GDB_PY_HANDLE_EXCEPTION (except);
855 }
856 END_CATCH
857
858 if (! info)
859 {
860 PyErr_SetString (PyExc_RuntimeError, err);
861 return NULL;
862 }
863 demangled = info->tree;
864
865 /* Strip off component names. */
866 while (demangled->type == DEMANGLE_COMPONENT_QUAL_NAME
867 || demangled->type == DEMANGLE_COMPONENT_LOCAL_NAME)
868 demangled = demangled->u.s_binary.right;
869
870 if (demangled->type != DEMANGLE_COMPONENT_TEMPLATE)
871 {
872 PyErr_SetString (PyExc_RuntimeError, _("Type is not a template."));
873 return NULL;
874 }
875
876 /* Skip from the template to the arguments. */
877 demangled = demangled->u.s_binary.right;
878
879 for (i = 0; demangled && i < argno; ++i)
880 demangled = demangled->u.s_binary.right;
881
882 if (! demangled)
883 {
884 PyErr_Format (PyExc_RuntimeError, _("No argument %d in template."),
885 argno);
886 return NULL;
887 }
888
889 argtype = typy_lookup_type (demangled->u.s_binary.left, block);
890 if (! argtype)
891 return NULL;
892
893 return type_to_type_object (argtype);
894 }
895
896 static PyObject *
897 typy_template_argument (PyObject *self, PyObject *args)
898 {
899 int argno;
900 struct type *type = ((type_object *) self)->type;
901 const struct block *block = NULL;
902 PyObject *block_obj = NULL;
903 struct symbol *sym;
904 struct value *val = NULL;
905
906 if (! PyArg_ParseTuple (args, "i|O", &argno, &block_obj))
907 return NULL;
908
909 if (block_obj)
910 {
911 block = block_object_to_block (block_obj);
912 if (! block)
913 {
914 PyErr_SetString (PyExc_RuntimeError,
915 _("Second argument must be block."));
916 return NULL;
917 }
918 }
919
920 TRY
921 {
922 type = check_typedef (type);
923 if (TYPE_IS_REFERENCE (type))
924 type = check_typedef (TYPE_TARGET_TYPE (type));
925 }
926 CATCH (except, RETURN_MASK_ALL)
927 {
928 GDB_PY_HANDLE_EXCEPTION (except);
929 }
930 END_CATCH
931
932 /* We might not have DW_TAG_template_*, so try to parse the type's
933 name. This is inefficient if we do not have a template type --
934 but that is going to wind up as an error anyhow. */
935 if (! TYPE_N_TEMPLATE_ARGUMENTS (type))
936 return typy_legacy_template_argument (type, block, argno);
937
938 if (argno >= TYPE_N_TEMPLATE_ARGUMENTS (type))
939 {
940 PyErr_Format (PyExc_RuntimeError, _("No argument %d in template."),
941 argno);
942 return NULL;
943 }
944
945 sym = TYPE_TEMPLATE_ARGUMENT (type, argno);
946 if (SYMBOL_CLASS (sym) == LOC_TYPEDEF)
947 return type_to_type_object (SYMBOL_TYPE (sym));
948 else if (SYMBOL_CLASS (sym) == LOC_OPTIMIZED_OUT)
949 {
950 PyErr_Format (PyExc_RuntimeError,
951 _("Template argument is optimized out"));
952 return NULL;
953 }
954
955 TRY
956 {
957 val = value_of_variable (sym, block);
958 }
959 CATCH (except, RETURN_MASK_ALL)
960 {
961 GDB_PY_HANDLE_EXCEPTION (except);
962 }
963 END_CATCH
964
965 return value_to_value_object (val);
966 }
967
968 static PyObject *
969 typy_str (PyObject *self)
970 {
971 string_file thetype;
972 PyObject *result;
973
974 TRY
975 {
976 LA_PRINT_TYPE (type_object_to_type (self), "", &thetype, -1, 0,
977 &type_print_raw_options);
978 }
979 CATCH (except, RETURN_MASK_ALL)
980 {
981 GDB_PY_HANDLE_EXCEPTION (except);
982 }
983 END_CATCH
984
985 return PyUnicode_Decode (thetype.c_str (), thetype.size (),
986 host_charset (), NULL);
987 }
988
989 /* Implement the richcompare method. */
990
991 static PyObject *
992 typy_richcompare (PyObject *self, PyObject *other, int op)
993 {
994 int result = Py_NE;
995 struct type *type1 = type_object_to_type (self);
996 struct type *type2 = type_object_to_type (other);
997
998 /* We can only compare ourselves to another Type object, and only
999 for equality or inequality. */
1000 if (type2 == NULL || (op != Py_EQ && op != Py_NE))
1001 {
1002 Py_INCREF (Py_NotImplemented);
1003 return Py_NotImplemented;
1004 }
1005
1006 if (type1 == type2)
1007 result = Py_EQ;
1008 else
1009 {
1010 TRY
1011 {
1012 result = types_deeply_equal (type1, type2);
1013 }
1014 CATCH (except, RETURN_MASK_ALL)
1015 {
1016 /* If there is a GDB exception, a comparison is not capable
1017 (or trusted), so exit. */
1018 GDB_PY_HANDLE_EXCEPTION (except);
1019 }
1020 END_CATCH
1021 }
1022
1023 if (op == (result ? Py_EQ : Py_NE))
1024 Py_RETURN_TRUE;
1025 Py_RETURN_FALSE;
1026 }
1027
1028 \f
1029
1030 static const struct objfile_data *typy_objfile_data_key;
1031
1032 static void
1033 save_objfile_types (struct objfile *objfile, void *datum)
1034 {
1035 type_object *obj = (type_object *) datum;
1036 htab_t copied_types;
1037
1038 if (!gdb_python_initialized)
1039 return;
1040
1041 /* This prevents another thread from freeing the objects we're
1042 operating on. */
1043 gdbpy_enter enter_py (get_objfile_arch (objfile), current_language);
1044
1045 copied_types = create_copied_types_hash (objfile);
1046
1047 while (obj)
1048 {
1049 type_object *next = obj->next;
1050
1051 htab_empty (copied_types);
1052
1053 obj->type = copy_type_recursive (objfile, obj->type, copied_types);
1054
1055 obj->next = NULL;
1056 obj->prev = NULL;
1057
1058 obj = next;
1059 }
1060
1061 htab_delete (copied_types);
1062 }
1063
1064 static void
1065 set_type (type_object *obj, struct type *type)
1066 {
1067 obj->type = type;
1068 obj->prev = NULL;
1069 if (type && TYPE_OBJFILE (type))
1070 {
1071 struct objfile *objfile = TYPE_OBJFILE (type);
1072
1073 obj->next = ((struct pyty_type_object *)
1074 objfile_data (objfile, typy_objfile_data_key));
1075 if (obj->next)
1076 obj->next->prev = obj;
1077 set_objfile_data (objfile, typy_objfile_data_key, obj);
1078 }
1079 else
1080 obj->next = NULL;
1081 }
1082
1083 static void
1084 typy_dealloc (PyObject *obj)
1085 {
1086 type_object *type = (type_object *) obj;
1087
1088 if (type->prev)
1089 type->prev->next = type->next;
1090 else if (type->type && TYPE_OBJFILE (type->type))
1091 {
1092 /* Must reset head of list. */
1093 struct objfile *objfile = TYPE_OBJFILE (type->type);
1094
1095 if (objfile)
1096 set_objfile_data (objfile, typy_objfile_data_key, type->next);
1097 }
1098 if (type->next)
1099 type->next->prev = type->prev;
1100
1101 Py_TYPE (type)->tp_free (type);
1102 }
1103
1104 /* Return number of fields ("length" of the field dictionary). */
1105
1106 static Py_ssize_t
1107 typy_length (PyObject *self)
1108 {
1109 struct type *type = ((type_object *) self)->type;
1110
1111 type = typy_get_composite (type);
1112 if (type == NULL)
1113 return -1;
1114
1115 return TYPE_NFIELDS (type);
1116 }
1117
1118 /* Implements boolean evaluation of gdb.Type. Handle this like other
1119 Python objects that don't have a meaningful truth value -- all
1120 values are true. */
1121
1122 static int
1123 typy_nonzero (PyObject *self)
1124 {
1125 return 1;
1126 }
1127
1128 /* Return optimized out value of this type. */
1129
1130 static PyObject *
1131 typy_optimized_out (PyObject *self, PyObject *args)
1132 {
1133 struct type *type = ((type_object *) self)->type;
1134
1135 return value_to_value_object (allocate_optimized_out_value (type));
1136 }
1137
1138 /* Return a gdb.Field object for the field named by the argument. */
1139
1140 static PyObject *
1141 typy_getitem (PyObject *self, PyObject *key)
1142 {
1143 struct type *type = ((type_object *) self)->type;
1144 int i;
1145
1146 gdb::unique_xmalloc_ptr<char> field = python_string_to_host_string (key);
1147 if (field == NULL)
1148 return NULL;
1149
1150 /* We want just fields of this type, not of base types, so instead of
1151 using lookup_struct_elt_type, portions of that function are
1152 copied here. */
1153
1154 type = typy_get_composite (type);
1155 if (type == NULL)
1156 return NULL;
1157
1158 for (i = 0; i < TYPE_NFIELDS (type); i++)
1159 {
1160 const char *t_field_name = TYPE_FIELD_NAME (type, i);
1161
1162 if (t_field_name && (strcmp_iw (t_field_name, field.get ()) == 0))
1163 {
1164 return convert_field (type, i);
1165 }
1166 }
1167 PyErr_SetObject (PyExc_KeyError, key);
1168 return NULL;
1169 }
1170
1171 /* Implement the "get" method on the type object. This is the
1172 same as getitem if the key is present, but returns the supplied
1173 default value or None if the key is not found. */
1174
1175 static PyObject *
1176 typy_get (PyObject *self, PyObject *args)
1177 {
1178 PyObject *key, *defval = Py_None, *result;
1179
1180 if (!PyArg_UnpackTuple (args, "get", 1, 2, &key, &defval))
1181 return NULL;
1182
1183 result = typy_getitem (self, key);
1184 if (result != NULL)
1185 return result;
1186
1187 /* typy_getitem returned error status. If the exception is
1188 KeyError, clear the exception status and return the defval
1189 instead. Otherwise return the exception unchanged. */
1190 if (!PyErr_ExceptionMatches (PyExc_KeyError))
1191 return NULL;
1192
1193 PyErr_Clear ();
1194 Py_INCREF (defval);
1195 return defval;
1196 }
1197
1198 /* Implement the "has_key" method on the type object. */
1199
1200 static PyObject *
1201 typy_has_key (PyObject *self, PyObject *args)
1202 {
1203 struct type *type = ((type_object *) self)->type;
1204 const char *field;
1205 int i;
1206
1207 if (!PyArg_ParseTuple (args, "s", &field))
1208 return NULL;
1209
1210 /* We want just fields of this type, not of base types, so instead of
1211 using lookup_struct_elt_type, portions of that function are
1212 copied here. */
1213
1214 type = typy_get_composite (type);
1215 if (type == NULL)
1216 return NULL;
1217
1218 for (i = 0; i < TYPE_NFIELDS (type); i++)
1219 {
1220 const char *t_field_name = TYPE_FIELD_NAME (type, i);
1221
1222 if (t_field_name && (strcmp_iw (t_field_name, field) == 0))
1223 Py_RETURN_TRUE;
1224 }
1225 Py_RETURN_FALSE;
1226 }
1227
1228 /* Make an iterator object to iterate over keys, values, or items. */
1229
1230 static PyObject *
1231 typy_make_iter (PyObject *self, enum gdbpy_iter_kind kind)
1232 {
1233 typy_iterator_object *typy_iter_obj;
1234
1235 /* Check that "self" is a structure or union type. */
1236 if (typy_get_composite (((type_object *) self)->type) == NULL)
1237 return NULL;
1238
1239 typy_iter_obj = PyObject_New (typy_iterator_object,
1240 &type_iterator_object_type);
1241 if (typy_iter_obj == NULL)
1242 return NULL;
1243
1244 typy_iter_obj->field = 0;
1245 typy_iter_obj->kind = kind;
1246 Py_INCREF (self);
1247 typy_iter_obj->source = (type_object *) self;
1248
1249 return (PyObject *) typy_iter_obj;
1250 }
1251
1252 /* iteritems() method. */
1253
1254 static PyObject *
1255 typy_iteritems (PyObject *self, PyObject *args)
1256 {
1257 return typy_make_iter (self, iter_items);
1258 }
1259
1260 /* iterkeys() method. */
1261
1262 static PyObject *
1263 typy_iterkeys (PyObject *self, PyObject *args)
1264 {
1265 return typy_make_iter (self, iter_keys);
1266 }
1267
1268 /* Iterating over the class, same as iterkeys except for the function
1269 signature. */
1270
1271 static PyObject *
1272 typy_iter (PyObject *self)
1273 {
1274 return typy_make_iter (self, iter_keys);
1275 }
1276
1277 /* itervalues() method. */
1278
1279 static PyObject *
1280 typy_itervalues (PyObject *self, PyObject *args)
1281 {
1282 return typy_make_iter (self, iter_values);
1283 }
1284
1285 /* Return a reference to the type iterator. */
1286
1287 static PyObject *
1288 typy_iterator_iter (PyObject *self)
1289 {
1290 Py_INCREF (self);
1291 return self;
1292 }
1293
1294 /* Return the next field in the iteration through the list of fields
1295 of the type. */
1296
1297 static PyObject *
1298 typy_iterator_iternext (PyObject *self)
1299 {
1300 typy_iterator_object *iter_obj = (typy_iterator_object *) self;
1301 struct type *type = iter_obj->source->type;
1302 PyObject *result;
1303
1304 if (iter_obj->field < TYPE_NFIELDS (type))
1305 {
1306 result = make_fielditem (type, iter_obj->field, iter_obj->kind);
1307 if (result != NULL)
1308 iter_obj->field++;
1309 return result;
1310 }
1311
1312 return NULL;
1313 }
1314
1315 static void
1316 typy_iterator_dealloc (PyObject *obj)
1317 {
1318 typy_iterator_object *iter_obj = (typy_iterator_object *) obj;
1319
1320 Py_DECREF (iter_obj->source);
1321 }
1322
1323 /* Create a new Type referring to TYPE. */
1324 PyObject *
1325 type_to_type_object (struct type *type)
1326 {
1327 type_object *type_obj;
1328
1329 type_obj = PyObject_New (type_object, &type_object_type);
1330 if (type_obj)
1331 set_type (type_obj, type);
1332
1333 return (PyObject *) type_obj;
1334 }
1335
1336 struct type *
1337 type_object_to_type (PyObject *obj)
1338 {
1339 if (! PyObject_TypeCheck (obj, &type_object_type))
1340 return NULL;
1341 return ((type_object *) obj)->type;
1342 }
1343
1344 \f
1345
1346 /* Implementation of gdb.lookup_type. */
1347 PyObject *
1348 gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw)
1349 {
1350 static char *keywords[] = { "name", "block", NULL };
1351 const char *type_name = NULL;
1352 struct type *type = NULL;
1353 PyObject *block_obj = NULL;
1354 const struct block *block = NULL;
1355
1356 if (! PyArg_ParseTupleAndKeywords (args, kw, "s|O", keywords,
1357 &type_name, &block_obj))
1358 return NULL;
1359
1360 if (block_obj)
1361 {
1362 block = block_object_to_block (block_obj);
1363 if (! block)
1364 {
1365 PyErr_SetString (PyExc_RuntimeError,
1366 _("'block' argument must be a Block."));
1367 return NULL;
1368 }
1369 }
1370
1371 type = typy_lookup_typename (type_name, block);
1372 if (! type)
1373 return NULL;
1374
1375 return (PyObject *) type_to_type_object (type);
1376 }
1377
1378 int
1379 gdbpy_initialize_types (void)
1380 {
1381 int i;
1382
1383 typy_objfile_data_key
1384 = register_objfile_data_with_cleanup (save_objfile_types, NULL);
1385
1386 if (PyType_Ready (&type_object_type) < 0)
1387 return -1;
1388 if (PyType_Ready (&field_object_type) < 0)
1389 return -1;
1390 if (PyType_Ready (&type_iterator_object_type) < 0)
1391 return -1;
1392
1393 for (i = 0; pyty_codes[i].name; ++i)
1394 {
1395 if (PyModule_AddIntConstant (gdb_module,
1396 /* Cast needed for Python 2.4. */
1397 (char *) pyty_codes[i].name,
1398 pyty_codes[i].code) < 0)
1399 return -1;
1400 }
1401
1402 if (gdb_pymodule_addobject (gdb_module, "Type",
1403 (PyObject *) &type_object_type) < 0)
1404 return -1;
1405
1406 if (gdb_pymodule_addobject (gdb_module, "TypeIterator",
1407 (PyObject *) &type_iterator_object_type) < 0)
1408 return -1;
1409
1410 return gdb_pymodule_addobject (gdb_module, "Field",
1411 (PyObject *) &field_object_type);
1412 }
1413
1414 \f
1415
1416 static PyGetSetDef type_object_getset[] =
1417 {
1418 { "code", typy_get_code, NULL,
1419 "The code for this type.", NULL },
1420 { "name", typy_get_name, NULL,
1421 "The name for this type, or None.", NULL },
1422 { "sizeof", typy_get_sizeof, NULL,
1423 "The size of this type, in bytes.", NULL },
1424 { "tag", typy_get_tag, NULL,
1425 "The tag name for this type, or None.", NULL },
1426 { NULL }
1427 };
1428
1429 static PyMethodDef type_object_methods[] =
1430 {
1431 { "array", typy_array, METH_VARARGS,
1432 "array ([LOW_BOUND,] HIGH_BOUND) -> Type\n\
1433 Return a type which represents an array of objects of this type.\n\
1434 The bounds of the array are [LOW_BOUND, HIGH_BOUND] inclusive.\n\
1435 If LOW_BOUND is omitted, a value of zero is used." },
1436 { "vector", typy_vector, METH_VARARGS,
1437 "vector ([LOW_BOUND,] HIGH_BOUND) -> Type\n\
1438 Return a type which represents a vector of objects of this type.\n\
1439 The bounds of the array are [LOW_BOUND, HIGH_BOUND] inclusive.\n\
1440 If LOW_BOUND is omitted, a value of zero is used.\n\
1441 Vectors differ from arrays in that if the current language has C-style\n\
1442 arrays, vectors don't decay to a pointer to the first element.\n\
1443 They are first class values." },
1444 { "__contains__", typy_has_key, METH_VARARGS,
1445 "T.__contains__(k) -> True if T has a field named k, else False" },
1446 { "const", typy_const, METH_NOARGS,
1447 "const () -> Type\n\
1448 Return a const variant of this type." },
1449 { "optimized_out", typy_optimized_out, METH_NOARGS,
1450 "optimized_out() -> Value\n\
1451 Return optimized out value of this type." },
1452 { "fields", typy_fields, METH_NOARGS,
1453 "fields () -> list\n\
1454 Return a list holding all the fields of this type.\n\
1455 Each field is a gdb.Field object." },
1456 { "get", typy_get, METH_VARARGS,
1457 "T.get(k[,default]) -> returns field named k in T, if it exists;\n\
1458 otherwise returns default, if supplied, or None if not." },
1459 { "has_key", typy_has_key, METH_VARARGS,
1460 "T.has_key(k) -> True if T has a field named k, else False" },
1461 { "items", typy_items, METH_NOARGS,
1462 "items () -> list\n\
1463 Return a list of (name, field) pairs of this type.\n\
1464 Each field is a gdb.Field object." },
1465 { "iteritems", typy_iteritems, METH_NOARGS,
1466 "iteritems () -> an iterator over the (name, field)\n\
1467 pairs of this type. Each field is a gdb.Field object." },
1468 { "iterkeys", typy_iterkeys, METH_NOARGS,
1469 "iterkeys () -> an iterator over the field names of this type." },
1470 { "itervalues", typy_itervalues, METH_NOARGS,
1471 "itervalues () -> an iterator over the fields of this type.\n\
1472 Each field is a gdb.Field object." },
1473 { "keys", typy_field_names, METH_NOARGS,
1474 "keys () -> list\n\
1475 Return a list holding all the fields names of this type." },
1476 { "pointer", typy_pointer, METH_NOARGS,
1477 "pointer () -> Type\n\
1478 Return a type of pointer to this type." },
1479 { "range", typy_range, METH_NOARGS,
1480 "range () -> tuple\n\
1481 Return a tuple containing the lower and upper range for this type."},
1482 { "reference", typy_reference, METH_NOARGS,
1483 "reference () -> Type\n\
1484 Return a type of reference to this type." },
1485 { "strip_typedefs", typy_strip_typedefs, METH_NOARGS,
1486 "strip_typedefs () -> Type\n\
1487 Return a type formed by stripping this type of all typedefs."},
1488 { "target", typy_target, METH_NOARGS,
1489 "target () -> Type\n\
1490 Return the target type of this type." },
1491 { "template_argument", typy_template_argument, METH_VARARGS,
1492 "template_argument (arg, [block]) -> Type\n\
1493 Return the type of a template argument." },
1494 { "unqualified", typy_unqualified, METH_NOARGS,
1495 "unqualified () -> Type\n\
1496 Return a variant of this type without const or volatile attributes." },
1497 { "values", typy_values, METH_NOARGS,
1498 "values () -> list\n\
1499 Return a list holding all the fields of this type.\n\
1500 Each field is a gdb.Field object." },
1501 { "volatile", typy_volatile, METH_NOARGS,
1502 "volatile () -> Type\n\
1503 Return a volatile variant of this type" },
1504 { NULL }
1505 };
1506
1507 static PyNumberMethods type_object_as_number = {
1508 NULL, /* nb_add */
1509 NULL, /* nb_subtract */
1510 NULL, /* nb_multiply */
1511 #ifndef IS_PY3K
1512 NULL, /* nb_divide */
1513 #endif
1514 NULL, /* nb_remainder */
1515 NULL, /* nb_divmod */
1516 NULL, /* nb_power */
1517 NULL, /* nb_negative */
1518 NULL, /* nb_positive */
1519 NULL, /* nb_absolute */
1520 typy_nonzero, /* nb_nonzero */
1521 NULL, /* nb_invert */
1522 NULL, /* nb_lshift */
1523 NULL, /* nb_rshift */
1524 NULL, /* nb_and */
1525 NULL, /* nb_xor */
1526 NULL, /* nb_or */
1527 #ifdef IS_PY3K
1528 NULL, /* nb_int */
1529 NULL, /* reserved */
1530 #else
1531 NULL, /* nb_coerce */
1532 NULL, /* nb_int */
1533 NULL, /* nb_long */
1534 #endif
1535 NULL, /* nb_float */
1536 #ifndef IS_PY3K
1537 NULL, /* nb_oct */
1538 NULL /* nb_hex */
1539 #endif
1540 };
1541
1542 static PyMappingMethods typy_mapping = {
1543 typy_length,
1544 typy_getitem,
1545 NULL /* no "set" method */
1546 };
1547
1548 PyTypeObject type_object_type =
1549 {
1550 PyVarObject_HEAD_INIT (NULL, 0)
1551 "gdb.Type", /*tp_name*/
1552 sizeof (type_object), /*tp_basicsize*/
1553 0, /*tp_itemsize*/
1554 typy_dealloc, /*tp_dealloc*/
1555 0, /*tp_print*/
1556 0, /*tp_getattr*/
1557 0, /*tp_setattr*/
1558 0, /*tp_compare*/
1559 0, /*tp_repr*/
1560 &type_object_as_number, /*tp_as_number*/
1561 0, /*tp_as_sequence*/
1562 &typy_mapping, /*tp_as_mapping*/
1563 0, /*tp_hash */
1564 0, /*tp_call*/
1565 typy_str, /*tp_str*/
1566 0, /*tp_getattro*/
1567 0, /*tp_setattro*/
1568 0, /*tp_as_buffer*/
1569 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
1570 "GDB type object", /* tp_doc */
1571 0, /* tp_traverse */
1572 0, /* tp_clear */
1573 typy_richcompare, /* tp_richcompare */
1574 0, /* tp_weaklistoffset */
1575 typy_iter, /* tp_iter */
1576 0, /* tp_iternext */
1577 type_object_methods, /* tp_methods */
1578 0, /* tp_members */
1579 type_object_getset, /* tp_getset */
1580 0, /* tp_base */
1581 0, /* tp_dict */
1582 0, /* tp_descr_get */
1583 0, /* tp_descr_set */
1584 0, /* tp_dictoffset */
1585 0, /* tp_init */
1586 0, /* tp_alloc */
1587 0, /* tp_new */
1588 };
1589
1590 static PyGetSetDef field_object_getset[] =
1591 {
1592 { "__dict__", gdb_py_generic_dict, NULL,
1593 "The __dict__ for this field.", &field_object_type },
1594 { NULL }
1595 };
1596
1597 PyTypeObject field_object_type =
1598 {
1599 PyVarObject_HEAD_INIT (NULL, 0)
1600 "gdb.Field", /*tp_name*/
1601 sizeof (field_object), /*tp_basicsize*/
1602 0, /*tp_itemsize*/
1603 field_dealloc, /*tp_dealloc*/
1604 0, /*tp_print*/
1605 0, /*tp_getattr*/
1606 0, /*tp_setattr*/
1607 0, /*tp_compare*/
1608 0, /*tp_repr*/
1609 0, /*tp_as_number*/
1610 0, /*tp_as_sequence*/
1611 0, /*tp_as_mapping*/
1612 0, /*tp_hash */
1613 0, /*tp_call*/
1614 0, /*tp_str*/
1615 0, /*tp_getattro*/
1616 0, /*tp_setattro*/
1617 0, /*tp_as_buffer*/
1618 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
1619 "GDB field object", /* tp_doc */
1620 0, /* tp_traverse */
1621 0, /* tp_clear */
1622 0, /* tp_richcompare */
1623 0, /* tp_weaklistoffset */
1624 0, /* tp_iter */
1625 0, /* tp_iternext */
1626 0, /* tp_methods */
1627 0, /* tp_members */
1628 field_object_getset, /* tp_getset */
1629 0, /* tp_base */
1630 0, /* tp_dict */
1631 0, /* tp_descr_get */
1632 0, /* tp_descr_set */
1633 offsetof (field_object, dict), /* tp_dictoffset */
1634 0, /* tp_init */
1635 0, /* tp_alloc */
1636 0, /* tp_new */
1637 };
1638
1639 PyTypeObject type_iterator_object_type = {
1640 PyVarObject_HEAD_INIT (NULL, 0)
1641 "gdb.TypeIterator", /*tp_name*/
1642 sizeof (typy_iterator_object), /*tp_basicsize*/
1643 0, /*tp_itemsize*/
1644 typy_iterator_dealloc, /*tp_dealloc*/
1645 0, /*tp_print*/
1646 0, /*tp_getattr*/
1647 0, /*tp_setattr*/
1648 0, /*tp_compare*/
1649 0, /*tp_repr*/
1650 0, /*tp_as_number*/
1651 0, /*tp_as_sequence*/
1652 0, /*tp_as_mapping*/
1653 0, /*tp_hash */
1654 0, /*tp_call*/
1655 0, /*tp_str*/
1656 0, /*tp_getattro*/
1657 0, /*tp_setattro*/
1658 0, /*tp_as_buffer*/
1659 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /*tp_flags*/
1660 "GDB type iterator object", /*tp_doc */
1661 0, /*tp_traverse */
1662 0, /*tp_clear */
1663 0, /*tp_richcompare */
1664 0, /*tp_weaklistoffset */
1665 typy_iterator_iter, /*tp_iter */
1666 typy_iterator_iternext, /*tp_iternext */
1667 0 /*tp_methods */
1668 };
This page took 0.093395 seconds and 4 git commands to generate.