1 /* Python interface to types.
3 Copyright (C) 2008-2019 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
22 #include "python-internal.h"
25 #include "cp-support.h"
29 #include "common/vec.h"
30 #include "typeprint.h"
32 typedef struct pyty_type_object
37 /* If a Type object is associated with an objfile, it is kept on a
38 doubly-linked list, rooted in the objfile. This lets us copy the
39 underlying struct type when the objfile is deleted. */
40 struct pyty_type_object
*prev
;
41 struct pyty_type_object
*next
;
44 extern PyTypeObject type_object_type
45 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("type_object");
48 typedef struct pyty_field_object
52 /* Dictionary holding our attributes. */
56 extern PyTypeObject field_object_type
57 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("field_object");
59 /* A type iterator object. */
62 /* The current field index. */
65 enum gdbpy_iter_kind kind
;
66 /* Pointer back to the original source type object. */
67 struct pyty_type_object
*source
;
68 } typy_iterator_object
;
70 extern PyTypeObject type_iterator_object_type
71 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("typy_iterator_object");
73 /* This is used to initialize various gdb.TYPE_ constants. */
82 /* Forward declarations. */
83 static PyObject
*typy_make_iter (PyObject
*self
, enum gdbpy_iter_kind kind
);
85 #define ENTRY(X) { X, #X }
87 static struct pyty_code pyty_codes
[] =
89 ENTRY (TYPE_CODE_BITSTRING
),
90 ENTRY (TYPE_CODE_PTR
),
91 ENTRY (TYPE_CODE_ARRAY
),
92 ENTRY (TYPE_CODE_STRUCT
),
93 ENTRY (TYPE_CODE_UNION
),
94 ENTRY (TYPE_CODE_ENUM
),
95 ENTRY (TYPE_CODE_FLAGS
),
96 ENTRY (TYPE_CODE_FUNC
),
97 ENTRY (TYPE_CODE_INT
),
98 ENTRY (TYPE_CODE_FLT
),
99 ENTRY (TYPE_CODE_VOID
),
100 ENTRY (TYPE_CODE_SET
),
101 ENTRY (TYPE_CODE_RANGE
),
102 ENTRY (TYPE_CODE_STRING
),
103 ENTRY (TYPE_CODE_ERROR
),
104 ENTRY (TYPE_CODE_METHOD
),
105 ENTRY (TYPE_CODE_METHODPTR
),
106 ENTRY (TYPE_CODE_MEMBERPTR
),
107 ENTRY (TYPE_CODE_REF
),
108 ENTRY (TYPE_CODE_RVALUE_REF
),
109 ENTRY (TYPE_CODE_CHAR
),
110 ENTRY (TYPE_CODE_BOOL
),
111 ENTRY (TYPE_CODE_COMPLEX
),
112 ENTRY (TYPE_CODE_TYPEDEF
),
113 ENTRY (TYPE_CODE_NAMESPACE
),
114 ENTRY (TYPE_CODE_DECFLOAT
),
115 ENTRY (TYPE_CODE_INTERNAL_FUNCTION
),
116 { TYPE_CODE_UNDEF
, NULL
}
122 field_dealloc (PyObject
*obj
)
124 field_object
*f
= (field_object
*) obj
;
126 Py_XDECREF (f
->dict
);
127 Py_TYPE (obj
)->tp_free (obj
);
133 gdbpy_ref
<field_object
> result (PyObject_New (field_object
,
134 &field_object_type
));
138 result
->dict
= PyDict_New ();
142 return (PyObject
*) result
.release ();
147 /* Return true if OBJ is of type gdb.Field, false otherwise. */
150 gdbpy_is_field (PyObject
*obj
)
152 return PyObject_TypeCheck (obj
, &field_object_type
);
155 /* Return the code for this type. */
157 typy_get_code (PyObject
*self
, void *closure
)
159 struct type
*type
= ((type_object
*) self
)->type
;
161 return PyInt_FromLong (TYPE_CODE (type
));
164 /* Helper function for typy_fields which converts a single field to a
165 gdb.Field object. Returns NULL on error. */
168 convert_field (struct type
*type
, int field
)
170 gdbpy_ref
<> result (field_new ());
175 gdbpy_ref
<> arg (type_to_type_object (type
));
178 if (PyObject_SetAttrString (result
.get (), "parent_type", arg
.get ()) < 0)
181 if (!field_is_static (&TYPE_FIELD (type
, field
)))
183 const char *attrstring
;
185 if (TYPE_CODE (type
) == TYPE_CODE_ENUM
)
187 arg
.reset (gdb_py_long_from_longest (TYPE_FIELD_ENUMVAL (type
,
189 attrstring
= "enumval";
193 arg
.reset (gdb_py_long_from_longest (TYPE_FIELD_BITPOS (type
,
195 attrstring
= "bitpos";
201 if (PyObject_SetAttrString (result
.get (), attrstring
, arg
.get ()) < 0)
206 if (TYPE_FIELD_NAME (type
, field
))
208 const char *field_name
= TYPE_FIELD_NAME (type
, field
);
210 if (field_name
[0] != '\0')
212 arg
.reset (PyString_FromString (TYPE_FIELD_NAME (type
, field
)));
218 arg
= gdbpy_ref
<>::new_reference (Py_None
);
220 if (PyObject_SetAttrString (result
.get (), "name", arg
.get ()) < 0)
223 arg
= gdbpy_ref
<>::new_reference (TYPE_FIELD_ARTIFICIAL (type
, field
)
224 ? Py_True
: Py_False
);
225 if (PyObject_SetAttrString (result
.get (), "artificial", arg
.get ()) < 0)
228 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
229 arg
= gdbpy_ref
<>::new_reference (field
< TYPE_N_BASECLASSES (type
)
230 ? Py_True
: Py_False
);
232 arg
= gdbpy_ref
<>::new_reference (Py_False
);
233 if (PyObject_SetAttrString (result
.get (), "is_base_class", arg
.get ()) < 0)
236 arg
.reset (PyLong_FromLong (TYPE_FIELD_BITSIZE (type
, field
)));
239 if (PyObject_SetAttrString (result
.get (), "bitsize", arg
.get ()) < 0)
242 /* A field can have a NULL type in some situations. */
243 if (TYPE_FIELD_TYPE (type
, field
) == NULL
)
244 arg
= gdbpy_ref
<>::new_reference (Py_None
);
246 arg
.reset (type_to_type_object (TYPE_FIELD_TYPE (type
, field
)));
249 if (PyObject_SetAttrString (result
.get (), "type", arg
.get ()) < 0)
255 /* Helper function to return the name of a field, as a gdb.Field object.
256 If the field doesn't have a name, None is returned. */
259 field_name (struct type
*type
, int field
)
263 if (TYPE_FIELD_NAME (type
, field
))
264 result
.reset (PyString_FromString (TYPE_FIELD_NAME (type
, field
)));
266 result
= gdbpy_ref
<>::new_reference (Py_None
);
271 /* Helper function for Type standard mapping methods. Returns a
272 Python object for field i of the type. "kind" specifies what to
273 return: the name of the field, a gdb.Field object corresponding to
274 the field, or a tuple consisting of field name and gdb.Field
278 make_fielditem (struct type
*type
, int i
, enum gdbpy_iter_kind kind
)
284 gdbpy_ref
<> key (field_name (type
, i
));
287 gdbpy_ref
<> value
= convert_field (type
, i
);
290 gdbpy_ref
<> item (PyTuple_New (2));
293 PyTuple_SET_ITEM (item
.get (), 0, key
.release ());
294 PyTuple_SET_ITEM (item
.get (), 1, value
.release ());
298 return field_name (type
, i
);
300 return convert_field (type
, i
);
302 gdb_assert_not_reached ("invalid gdbpy_iter_kind");
305 /* Return a sequence of all field names, fields, or (name, field) pairs.
306 Each field is a gdb.Field object. */
309 typy_fields_items (PyObject
*self
, enum gdbpy_iter_kind kind
)
311 PyObject
*py_type
= self
;
312 struct type
*type
= ((type_object
*) py_type
)->type
;
313 struct type
*checked_type
= type
;
317 checked_type
= check_typedef (checked_type
);
319 catch (const gdb_exception
&except
)
321 GDB_PY_HANDLE_EXCEPTION (except
);
324 gdbpy_ref
<> type_holder
;
325 if (checked_type
!= type
)
327 type_holder
.reset (type_to_type_object (checked_type
));
328 if (type_holder
== nullptr)
330 py_type
= type_holder
.get ();
332 gdbpy_ref
<> iter (typy_make_iter (py_type
, kind
));
336 return PySequence_List (iter
.get ());
339 /* Return a sequence of all fields. Each field is a gdb.Field object. */
342 typy_values (PyObject
*self
, PyObject
*args
)
344 return typy_fields_items (self
, iter_values
);
347 /* Return a sequence of all fields. Each field is a gdb.Field object.
348 This method is similar to typy_values, except where the supplied
349 gdb.Type is an array, in which case it returns a list of one entry
350 which is a gdb.Field object for a range (the array bounds). */
353 typy_fields (PyObject
*self
, PyObject
*args
)
355 struct type
*type
= ((type_object
*) self
)->type
;
357 if (TYPE_CODE (type
) != TYPE_CODE_ARRAY
)
358 return typy_fields_items (self
, iter_values
);
360 /* Array type. Handle this as a special case because the common
361 machinery wants struct or union or enum types. Build a list of
362 one entry which is the range for the array. */
363 gdbpy_ref
<> r
= convert_field (type
, 0);
367 return Py_BuildValue ("[O]", r
.get ());
370 /* Return a sequence of all field names. Each field is a gdb.Field object. */
373 typy_field_names (PyObject
*self
, PyObject
*args
)
375 return typy_fields_items (self
, iter_keys
);
378 /* Return a sequence of all (name, fields) pairs. Each field is a
382 typy_items (PyObject
*self
, PyObject
*args
)
384 return typy_fields_items (self
, iter_items
);
387 /* Return the type's name, or None. */
390 typy_get_name (PyObject
*self
, void *closure
)
392 struct type
*type
= ((type_object
*) self
)->type
;
394 if (TYPE_NAME (type
) == NULL
)
396 return PyString_FromString (TYPE_NAME (type
));
399 /* Return the type's tag, or None. */
401 typy_get_tag (PyObject
*self
, void *closure
)
403 struct type
*type
= ((type_object
*) self
)->type
;
404 const char *tagname
= nullptr;
406 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
407 || TYPE_CODE (type
) == TYPE_CODE_UNION
408 || TYPE_CODE (type
) == TYPE_CODE_ENUM
)
409 tagname
= TYPE_NAME (type
);
411 if (tagname
== nullptr)
413 return PyString_FromString (tagname
);
416 /* Return the type, stripped of typedefs. */
418 typy_strip_typedefs (PyObject
*self
, PyObject
*args
)
420 struct type
*type
= ((type_object
*) self
)->type
;
424 type
= check_typedef (type
);
426 catch (const gdb_exception
&except
)
428 GDB_PY_HANDLE_EXCEPTION (except
);
431 return type_to_type_object (type
);
434 /* Strip typedefs and pointers/reference from a type. Then check that
435 it is a struct, union, or enum type. If not, raise TypeError. */
438 typy_get_composite (struct type
*type
)
445 type
= check_typedef (type
);
447 catch (const gdb_exception
&except
)
449 GDB_PY_HANDLE_EXCEPTION (except
);
452 if (TYPE_CODE (type
) != TYPE_CODE_PTR
&& !TYPE_IS_REFERENCE (type
))
454 type
= TYPE_TARGET_TYPE (type
);
457 /* If this is not a struct, union, or enum type, raise TypeError
459 if (TYPE_CODE (type
) != TYPE_CODE_STRUCT
460 && TYPE_CODE (type
) != TYPE_CODE_UNION
461 && TYPE_CODE (type
) != TYPE_CODE_ENUM
462 && TYPE_CODE (type
) != TYPE_CODE_FUNC
)
464 PyErr_SetString (PyExc_TypeError
,
465 "Type is not a structure, union, enum, or function type.");
472 /* Helper for typy_array and typy_vector. */
475 typy_array_1 (PyObject
*self
, PyObject
*args
, int is_vector
)
478 PyObject
*n2_obj
= NULL
;
479 struct type
*array
= NULL
;
480 struct type
*type
= ((type_object
*) self
)->type
;
482 if (! PyArg_ParseTuple (args
, "l|O", &n1
, &n2_obj
))
487 if (!PyInt_Check (n2_obj
))
489 PyErr_SetString (PyExc_RuntimeError
,
490 _("Array bound must be an integer"));
494 if (! gdb_py_int_as_long (n2_obj
, &n2
))
503 if (n2
< n1
- 1) /* Note: An empty array has n2 == n1 - 1. */
505 PyErr_SetString (PyExc_ValueError
,
506 _("Array length must not be negative"));
512 array
= lookup_array_range_type (type
, n1
, n2
);
514 make_vector_type (array
);
516 catch (const gdb_exception
&except
)
518 GDB_PY_HANDLE_EXCEPTION (except
);
521 return type_to_type_object (array
);
524 /* Return an array type. */
527 typy_array (PyObject
*self
, PyObject
*args
)
529 return typy_array_1 (self
, args
, 0);
532 /* Return a vector type. */
535 typy_vector (PyObject
*self
, PyObject
*args
)
537 return typy_array_1 (self
, args
, 1);
540 /* Return a Type object which represents a pointer to SELF. */
542 typy_pointer (PyObject
*self
, PyObject
*args
)
544 struct type
*type
= ((type_object
*) self
)->type
;
548 type
= lookup_pointer_type (type
);
550 catch (const gdb_exception
&except
)
552 GDB_PY_HANDLE_EXCEPTION (except
);
555 return type_to_type_object (type
);
558 /* Return the range of a type represented by SELF. The return type is
559 a tuple. The first element of the tuple contains the low bound,
560 while the second element of the tuple contains the high bound. */
562 typy_range (PyObject
*self
, PyObject
*args
)
564 struct type
*type
= ((type_object
*) self
)->type
;
565 /* Initialize these to appease GCC warnings. */
566 LONGEST low
= 0, high
= 0;
568 if (TYPE_CODE (type
) != TYPE_CODE_ARRAY
569 && TYPE_CODE (type
) != TYPE_CODE_STRING
570 && TYPE_CODE (type
) != TYPE_CODE_RANGE
)
572 PyErr_SetString (PyExc_RuntimeError
,
573 _("This type does not have a range."));
577 switch (TYPE_CODE (type
))
579 case TYPE_CODE_ARRAY
:
580 case TYPE_CODE_STRING
:
581 low
= TYPE_LOW_BOUND (TYPE_INDEX_TYPE (type
));
582 high
= TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (type
));
584 case TYPE_CODE_RANGE
:
585 low
= TYPE_LOW_BOUND (type
);
586 high
= TYPE_HIGH_BOUND (type
);
590 gdbpy_ref
<> low_bound (PyLong_FromLong (low
));
591 if (low_bound
== NULL
)
594 gdbpy_ref
<> high_bound (PyLong_FromLong (high
));
595 if (high_bound
== NULL
)
598 gdbpy_ref
<> result (PyTuple_New (2));
602 if (PyTuple_SetItem (result
.get (), 0, low_bound
.release ()) != 0
603 || PyTuple_SetItem (result
.get (), 1, high_bound
.release ()) != 0)
605 return result
.release ();
608 /* Return a Type object which represents a reference to SELF. */
610 typy_reference (PyObject
*self
, PyObject
*args
)
612 struct type
*type
= ((type_object
*) self
)->type
;
616 type
= lookup_lvalue_reference_type (type
);
618 catch (const gdb_exception
&except
)
620 GDB_PY_HANDLE_EXCEPTION (except
);
623 return type_to_type_object (type
);
626 /* Return a Type object which represents the target type of SELF. */
628 typy_target (PyObject
*self
, PyObject
*args
)
630 struct type
*type
= ((type_object
*) self
)->type
;
632 if (!TYPE_TARGET_TYPE (type
))
634 PyErr_SetString (PyExc_RuntimeError
,
635 _("Type does not have a target."));
639 return type_to_type_object (TYPE_TARGET_TYPE (type
));
642 /* Return a const-qualified type variant. */
644 typy_const (PyObject
*self
, PyObject
*args
)
646 struct type
*type
= ((type_object
*) self
)->type
;
650 type
= make_cv_type (1, 0, type
, NULL
);
652 catch (const gdb_exception
&except
)
654 GDB_PY_HANDLE_EXCEPTION (except
);
657 return type_to_type_object (type
);
660 /* Return a volatile-qualified type variant. */
662 typy_volatile (PyObject
*self
, PyObject
*args
)
664 struct type
*type
= ((type_object
*) self
)->type
;
668 type
= make_cv_type (0, 1, type
, NULL
);
670 catch (const gdb_exception
&except
)
672 GDB_PY_HANDLE_EXCEPTION (except
);
675 return type_to_type_object (type
);
678 /* Return an unqualified type variant. */
680 typy_unqualified (PyObject
*self
, PyObject
*args
)
682 struct type
*type
= ((type_object
*) self
)->type
;
686 type
= make_cv_type (0, 0, type
, NULL
);
688 catch (const gdb_exception
&except
)
690 GDB_PY_HANDLE_EXCEPTION (except
);
693 return type_to_type_object (type
);
696 /* Return the size of the type represented by SELF, in bytes. */
698 typy_get_sizeof (PyObject
*self
, void *closure
)
700 struct type
*type
= ((type_object
*) self
)->type
;
704 check_typedef (type
);
706 catch (const gdb_exception
&except
)
710 /* Ignore exceptions. */
712 return gdb_py_long_from_longest (TYPE_LENGTH (type
));
715 /* Return the alignment of the type represented by SELF, in bytes. */
717 typy_get_alignof (PyObject
*self
, void *closure
)
719 struct type
*type
= ((type_object
*) self
)->type
;
724 align
= type_align (type
);
726 catch (const gdb_exception
&except
)
731 /* Ignore exceptions. */
733 return gdb_py_object_from_ulongest (align
).release ();
737 typy_lookup_typename (const char *type_name
, const struct block
*block
)
739 struct type
*type
= NULL
;
743 if (startswith (type_name
, "struct "))
744 type
= lookup_struct (type_name
+ 7, NULL
);
745 else if (startswith (type_name
, "union "))
746 type
= lookup_union (type_name
+ 6, NULL
);
747 else if (startswith (type_name
, "enum "))
748 type
= lookup_enum (type_name
+ 5, NULL
);
750 type
= lookup_typename (python_language
, python_gdbarch
,
751 type_name
, block
, 0);
753 catch (const gdb_exception
&except
)
755 GDB_PY_HANDLE_EXCEPTION (except
);
762 typy_lookup_type (struct demangle_component
*demangled
,
763 const struct block
*block
)
765 struct type
*type
, *rtype
= NULL
;
766 enum demangle_component_type demangled_type
;
768 /* Save the type: typy_lookup_type() may (indirectly) overwrite
769 memory pointed by demangled. */
770 demangled_type
= demangled
->type
;
772 if (demangled_type
== DEMANGLE_COMPONENT_POINTER
773 || demangled_type
== DEMANGLE_COMPONENT_REFERENCE
774 || demangled_type
== DEMANGLE_COMPONENT_RVALUE_REFERENCE
775 || demangled_type
== DEMANGLE_COMPONENT_CONST
776 || demangled_type
== DEMANGLE_COMPONENT_VOLATILE
)
778 type
= typy_lookup_type (demangled
->u
.s_binary
.left
, block
);
784 /* If the demangled_type matches with one of the types
785 below, run the corresponding function and save the type
786 to return later. We cannot just return here as we are in
787 an exception handler. */
788 switch (demangled_type
)
790 case DEMANGLE_COMPONENT_REFERENCE
:
791 rtype
= lookup_lvalue_reference_type (type
);
793 case DEMANGLE_COMPONENT_RVALUE_REFERENCE
:
794 rtype
= lookup_rvalue_reference_type (type
);
796 case DEMANGLE_COMPONENT_POINTER
:
797 rtype
= lookup_pointer_type (type
);
799 case DEMANGLE_COMPONENT_CONST
:
800 rtype
= make_cv_type (1, 0, type
, NULL
);
802 case DEMANGLE_COMPONENT_VOLATILE
:
803 rtype
= make_cv_type (0, 1, type
, NULL
);
807 catch (const gdb_exception
&except
)
809 GDB_PY_HANDLE_EXCEPTION (except
);
813 /* If we have a type from the switch statement above, just return
818 /* We don't have a type, so lookup the type. */
819 gdb::unique_xmalloc_ptr
<char> type_name
= cp_comp_to_string (demangled
, 10);
820 return typy_lookup_typename (type_name
.get (), block
);
823 /* This is a helper function for typy_template_argument that is used
824 when the type does not have template symbols attached. It works by
825 parsing the type name. This happens with compilers, like older
826 versions of GCC, that do not emit DW_TAG_template_*. */
829 typy_legacy_template_argument (struct type
*type
, const struct block
*block
,
833 struct demangle_component
*demangled
;
834 std::unique_ptr
<demangle_parse_info
> info
;
836 struct type
*argtype
;
838 if (TYPE_NAME (type
) == NULL
)
840 PyErr_SetString (PyExc_RuntimeError
, _("Null type name."));
846 /* Note -- this is not thread-safe. */
847 info
= cp_demangled_name_to_comp (TYPE_NAME (type
), &err
);
849 catch (const gdb_exception
&except
)
851 GDB_PY_HANDLE_EXCEPTION (except
);
856 PyErr_SetString (PyExc_RuntimeError
, err
.c_str ());
859 demangled
= info
->tree
;
861 /* Strip off component names. */
862 while (demangled
->type
== DEMANGLE_COMPONENT_QUAL_NAME
863 || demangled
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
864 demangled
= demangled
->u
.s_binary
.right
;
866 if (demangled
->type
!= DEMANGLE_COMPONENT_TEMPLATE
)
868 PyErr_SetString (PyExc_RuntimeError
, _("Type is not a template."));
872 /* Skip from the template to the arguments. */
873 demangled
= demangled
->u
.s_binary
.right
;
875 for (i
= 0; demangled
&& i
< argno
; ++i
)
876 demangled
= demangled
->u
.s_binary
.right
;
880 PyErr_Format (PyExc_RuntimeError
, _("No argument %d in template."),
885 argtype
= typy_lookup_type (demangled
->u
.s_binary
.left
, block
);
889 return type_to_type_object (argtype
);
893 typy_template_argument (PyObject
*self
, PyObject
*args
)
896 struct type
*type
= ((type_object
*) self
)->type
;
897 const struct block
*block
= NULL
;
898 PyObject
*block_obj
= NULL
;
900 struct value
*val
= NULL
;
902 if (! PyArg_ParseTuple (args
, "i|O", &argno
, &block_obj
))
907 PyErr_SetString (PyExc_RuntimeError
,
908 _("Template argument number must be non-negative"));
914 block
= block_object_to_block (block_obj
);
917 PyErr_SetString (PyExc_RuntimeError
,
918 _("Second argument must be block."));
925 type
= check_typedef (type
);
926 if (TYPE_IS_REFERENCE (type
))
927 type
= check_typedef (TYPE_TARGET_TYPE (type
));
929 catch (const gdb_exception
&except
)
931 GDB_PY_HANDLE_EXCEPTION (except
);
934 /* We might not have DW_TAG_template_*, so try to parse the type's
935 name. This is inefficient if we do not have a template type --
936 but that is going to wind up as an error anyhow. */
937 if (! TYPE_N_TEMPLATE_ARGUMENTS (type
))
938 return typy_legacy_template_argument (type
, block
, argno
);
940 if (argno
>= TYPE_N_TEMPLATE_ARGUMENTS (type
))
942 PyErr_Format (PyExc_RuntimeError
, _("No argument %d in template."),
947 sym
= TYPE_TEMPLATE_ARGUMENT (type
, argno
);
948 if (SYMBOL_CLASS (sym
) == LOC_TYPEDEF
)
949 return type_to_type_object (SYMBOL_TYPE (sym
));
950 else if (SYMBOL_CLASS (sym
) == LOC_OPTIMIZED_OUT
)
952 PyErr_Format (PyExc_RuntimeError
,
953 _("Template argument is optimized out"));
959 val
= value_of_variable (sym
, block
);
961 catch (const gdb_exception
&except
)
963 GDB_PY_HANDLE_EXCEPTION (except
);
966 return value_to_value_object (val
);
970 typy_str (PyObject
*self
)
976 LA_PRINT_TYPE (type_object_to_type (self
), "", &thetype
, -1, 0,
977 &type_print_raw_options
);
979 catch (const gdb_exception
&except
)
981 GDB_PY_HANDLE_EXCEPTION (except
);
984 return PyUnicode_Decode (thetype
.c_str (), thetype
.size (),
985 host_charset (), NULL
);
988 /* Implement the richcompare method. */
991 typy_richcompare (PyObject
*self
, PyObject
*other
, int op
)
994 struct type
*type1
= type_object_to_type (self
);
995 struct type
*type2
= type_object_to_type (other
);
997 /* We can only compare ourselves to another Type object, and only
998 for equality or inequality. */
999 if (type2
== NULL
|| (op
!= Py_EQ
&& op
!= Py_NE
))
1001 Py_INCREF (Py_NotImplemented
);
1002 return Py_NotImplemented
;
1011 result
= types_deeply_equal (type1
, type2
);
1013 catch (const gdb_exception
&except
)
1015 /* If there is a GDB exception, a comparison is not capable
1016 (or trusted), so exit. */
1017 GDB_PY_HANDLE_EXCEPTION (except
);
1021 if (op
== (result
? Py_EQ
: Py_NE
))
1028 static const struct objfile_data
*typy_objfile_data_key
;
1031 save_objfile_types (struct objfile
*objfile
, void *datum
)
1033 type_object
*obj
= (type_object
*) datum
;
1034 htab_t copied_types
;
1036 if (!gdb_python_initialized
)
1039 /* This prevents another thread from freeing the objects we're
1041 gdbpy_enter
enter_py (get_objfile_arch (objfile
), current_language
);
1043 copied_types
= create_copied_types_hash (objfile
);
1047 type_object
*next
= obj
->next
;
1049 htab_empty (copied_types
);
1051 obj
->type
= copy_type_recursive (objfile
, obj
->type
, copied_types
);
1059 htab_delete (copied_types
);
1063 set_type (type_object
*obj
, struct type
*type
)
1067 if (type
&& TYPE_OBJFILE (type
))
1069 struct objfile
*objfile
= TYPE_OBJFILE (type
);
1071 obj
->next
= ((struct pyty_type_object
*)
1072 objfile_data (objfile
, typy_objfile_data_key
));
1074 obj
->next
->prev
= obj
;
1075 set_objfile_data (objfile
, typy_objfile_data_key
, obj
);
1082 typy_dealloc (PyObject
*obj
)
1084 type_object
*type
= (type_object
*) obj
;
1087 type
->prev
->next
= type
->next
;
1088 else if (type
->type
&& TYPE_OBJFILE (type
->type
))
1090 /* Must reset head of list. */
1091 struct objfile
*objfile
= TYPE_OBJFILE (type
->type
);
1094 set_objfile_data (objfile
, typy_objfile_data_key
, type
->next
);
1097 type
->next
->prev
= type
->prev
;
1099 Py_TYPE (type
)->tp_free (type
);
1102 /* Return number of fields ("length" of the field dictionary). */
1105 typy_length (PyObject
*self
)
1107 struct type
*type
= ((type_object
*) self
)->type
;
1109 type
= typy_get_composite (type
);
1113 return TYPE_NFIELDS (type
);
1116 /* Implements boolean evaluation of gdb.Type. Handle this like other
1117 Python objects that don't have a meaningful truth value -- all
1121 typy_nonzero (PyObject
*self
)
1126 /* Return optimized out value of this type. */
1129 typy_optimized_out (PyObject
*self
, PyObject
*args
)
1131 struct type
*type
= ((type_object
*) self
)->type
;
1133 return value_to_value_object (allocate_optimized_out_value (type
));
1136 /* Return a gdb.Field object for the field named by the argument. */
1139 typy_getitem (PyObject
*self
, PyObject
*key
)
1141 struct type
*type
= ((type_object
*) self
)->type
;
1144 gdb::unique_xmalloc_ptr
<char> field
= python_string_to_host_string (key
);
1148 /* We want just fields of this type, not of base types, so instead of
1149 using lookup_struct_elt_type, portions of that function are
1152 type
= typy_get_composite (type
);
1156 for (i
= 0; i
< TYPE_NFIELDS (type
); i
++)
1158 const char *t_field_name
= TYPE_FIELD_NAME (type
, i
);
1160 if (t_field_name
&& (strcmp_iw (t_field_name
, field
.get ()) == 0))
1161 return convert_field (type
, i
).release ();
1163 PyErr_SetObject (PyExc_KeyError
, key
);
1167 /* Implement the "get" method on the type object. This is the
1168 same as getitem if the key is present, but returns the supplied
1169 default value or None if the key is not found. */
1172 typy_get (PyObject
*self
, PyObject
*args
)
1174 PyObject
*key
, *defval
= Py_None
, *result
;
1176 if (!PyArg_UnpackTuple (args
, "get", 1, 2, &key
, &defval
))
1179 result
= typy_getitem (self
, key
);
1183 /* typy_getitem returned error status. If the exception is
1184 KeyError, clear the exception status and return the defval
1185 instead. Otherwise return the exception unchanged. */
1186 if (!PyErr_ExceptionMatches (PyExc_KeyError
))
1194 /* Implement the "has_key" method on the type object. */
1197 typy_has_key (PyObject
*self
, PyObject
*args
)
1199 struct type
*type
= ((type_object
*) self
)->type
;
1203 if (!PyArg_ParseTuple (args
, "s", &field
))
1206 /* We want just fields of this type, not of base types, so instead of
1207 using lookup_struct_elt_type, portions of that function are
1210 type
= typy_get_composite (type
);
1214 for (i
= 0; i
< TYPE_NFIELDS (type
); i
++)
1216 const char *t_field_name
= TYPE_FIELD_NAME (type
, i
);
1218 if (t_field_name
&& (strcmp_iw (t_field_name
, field
) == 0))
1224 /* Make an iterator object to iterate over keys, values, or items. */
1227 typy_make_iter (PyObject
*self
, enum gdbpy_iter_kind kind
)
1229 typy_iterator_object
*typy_iter_obj
;
1231 /* Check that "self" is a structure or union type. */
1232 if (typy_get_composite (((type_object
*) self
)->type
) == NULL
)
1235 typy_iter_obj
= PyObject_New (typy_iterator_object
,
1236 &type_iterator_object_type
);
1237 if (typy_iter_obj
== NULL
)
1240 typy_iter_obj
->field
= 0;
1241 typy_iter_obj
->kind
= kind
;
1243 typy_iter_obj
->source
= (type_object
*) self
;
1245 return (PyObject
*) typy_iter_obj
;
1248 /* iteritems() method. */
1251 typy_iteritems (PyObject
*self
, PyObject
*args
)
1253 return typy_make_iter (self
, iter_items
);
1256 /* iterkeys() method. */
1259 typy_iterkeys (PyObject
*self
, PyObject
*args
)
1261 return typy_make_iter (self
, iter_keys
);
1264 /* Iterating over the class, same as iterkeys except for the function
1268 typy_iter (PyObject
*self
)
1270 return typy_make_iter (self
, iter_keys
);
1273 /* itervalues() method. */
1276 typy_itervalues (PyObject
*self
, PyObject
*args
)
1278 return typy_make_iter (self
, iter_values
);
1281 /* Return a reference to the type iterator. */
1284 typy_iterator_iter (PyObject
*self
)
1290 /* Return the next field in the iteration through the list of fields
1294 typy_iterator_iternext (PyObject
*self
)
1296 typy_iterator_object
*iter_obj
= (typy_iterator_object
*) self
;
1297 struct type
*type
= iter_obj
->source
->type
;
1299 if (iter_obj
->field
< TYPE_NFIELDS (type
))
1301 gdbpy_ref
<> result
= make_fielditem (type
, iter_obj
->field
,
1305 return result
.release ();
1312 typy_iterator_dealloc (PyObject
*obj
)
1314 typy_iterator_object
*iter_obj
= (typy_iterator_object
*) obj
;
1316 Py_DECREF (iter_obj
->source
);
1319 /* Create a new Type referring to TYPE. */
1321 type_to_type_object (struct type
*type
)
1323 type_object
*type_obj
;
1325 type_obj
= PyObject_New (type_object
, &type_object_type
);
1327 set_type (type_obj
, type
);
1329 return (PyObject
*) type_obj
;
1333 type_object_to_type (PyObject
*obj
)
1335 if (! PyObject_TypeCheck (obj
, &type_object_type
))
1337 return ((type_object
*) obj
)->type
;
1342 /* Implementation of gdb.lookup_type. */
1344 gdbpy_lookup_type (PyObject
*self
, PyObject
*args
, PyObject
*kw
)
1346 static const char *keywords
[] = { "name", "block", NULL
};
1347 const char *type_name
= NULL
;
1348 struct type
*type
= NULL
;
1349 PyObject
*block_obj
= NULL
;
1350 const struct block
*block
= NULL
;
1352 if (!gdb_PyArg_ParseTupleAndKeywords (args
, kw
, "s|O", keywords
,
1353 &type_name
, &block_obj
))
1358 block
= block_object_to_block (block_obj
);
1361 PyErr_SetString (PyExc_RuntimeError
,
1362 _("'block' argument must be a Block."));
1367 type
= typy_lookup_typename (type_name
, block
);
1371 return type_to_type_object (type
);
1375 gdbpy_initialize_types (void)
1379 typy_objfile_data_key
1380 = register_objfile_data_with_cleanup (save_objfile_types
, NULL
);
1382 if (PyType_Ready (&type_object_type
) < 0)
1384 if (PyType_Ready (&field_object_type
) < 0)
1386 if (PyType_Ready (&type_iterator_object_type
) < 0)
1389 for (i
= 0; pyty_codes
[i
].name
; ++i
)
1391 if (PyModule_AddIntConstant (gdb_module
, pyty_codes
[i
].name
,
1392 pyty_codes
[i
].code
) < 0)
1396 if (gdb_pymodule_addobject (gdb_module
, "Type",
1397 (PyObject
*) &type_object_type
) < 0)
1400 if (gdb_pymodule_addobject (gdb_module
, "TypeIterator",
1401 (PyObject
*) &type_iterator_object_type
) < 0)
1404 return gdb_pymodule_addobject (gdb_module
, "Field",
1405 (PyObject
*) &field_object_type
);
1410 static gdb_PyGetSetDef type_object_getset
[] =
1412 { "alignof", typy_get_alignof
, NULL
,
1413 "The alignment of this type, in bytes.", NULL
},
1414 { "code", typy_get_code
, NULL
,
1415 "The code for this type.", NULL
},
1416 { "name", typy_get_name
, NULL
,
1417 "The name for this type, or None.", NULL
},
1418 { "sizeof", typy_get_sizeof
, NULL
,
1419 "The size of this type, in bytes.", NULL
},
1420 { "tag", typy_get_tag
, NULL
,
1421 "The tag name for this type, or None.", NULL
},
1425 static PyMethodDef type_object_methods
[] =
1427 { "array", typy_array
, METH_VARARGS
,
1428 "array ([LOW_BOUND,] HIGH_BOUND) -> Type\n\
1429 Return a type which represents an array of objects of this type.\n\
1430 The bounds of the array are [LOW_BOUND, HIGH_BOUND] inclusive.\n\
1431 If LOW_BOUND is omitted, a value of zero is used." },
1432 { "vector", typy_vector
, METH_VARARGS
,
1433 "vector ([LOW_BOUND,] HIGH_BOUND) -> Type\n\
1434 Return a type which represents a vector of objects of this type.\n\
1435 The bounds of the array are [LOW_BOUND, HIGH_BOUND] inclusive.\n\
1436 If LOW_BOUND is omitted, a value of zero is used.\n\
1437 Vectors differ from arrays in that if the current language has C-style\n\
1438 arrays, vectors don't decay to a pointer to the first element.\n\
1439 They are first class values." },
1440 { "__contains__", typy_has_key
, METH_VARARGS
,
1441 "T.__contains__(k) -> True if T has a field named k, else False" },
1442 { "const", typy_const
, METH_NOARGS
,
1443 "const () -> Type\n\
1444 Return a const variant of this type." },
1445 { "optimized_out", typy_optimized_out
, METH_NOARGS
,
1446 "optimized_out() -> Value\n\
1447 Return optimized out value of this type." },
1448 { "fields", typy_fields
, METH_NOARGS
,
1449 "fields () -> list\n\
1450 Return a list holding all the fields of this type.\n\
1451 Each field is a gdb.Field object." },
1452 { "get", typy_get
, METH_VARARGS
,
1453 "T.get(k[,default]) -> returns field named k in T, if it exists;\n\
1454 otherwise returns default, if supplied, or None if not." },
1455 { "has_key", typy_has_key
, METH_VARARGS
,
1456 "T.has_key(k) -> True if T has a field named k, else False" },
1457 { "items", typy_items
, METH_NOARGS
,
1458 "items () -> list\n\
1459 Return a list of (name, field) pairs of this type.\n\
1460 Each field is a gdb.Field object." },
1461 { "iteritems", typy_iteritems
, METH_NOARGS
,
1462 "iteritems () -> an iterator over the (name, field)\n\
1463 pairs of this type. Each field is a gdb.Field object." },
1464 { "iterkeys", typy_iterkeys
, METH_NOARGS
,
1465 "iterkeys () -> an iterator over the field names of this type." },
1466 { "itervalues", typy_itervalues
, METH_NOARGS
,
1467 "itervalues () -> an iterator over the fields of this type.\n\
1468 Each field is a gdb.Field object." },
1469 { "keys", typy_field_names
, METH_NOARGS
,
1471 Return a list holding all the fields names of this type." },
1472 { "pointer", typy_pointer
, METH_NOARGS
,
1473 "pointer () -> Type\n\
1474 Return a type of pointer to this type." },
1475 { "range", typy_range
, METH_NOARGS
,
1476 "range () -> tuple\n\
1477 Return a tuple containing the lower and upper range for this type."},
1478 { "reference", typy_reference
, METH_NOARGS
,
1479 "reference () -> Type\n\
1480 Return a type of reference to this type." },
1481 { "strip_typedefs", typy_strip_typedefs
, METH_NOARGS
,
1482 "strip_typedefs () -> Type\n\
1483 Return a type formed by stripping this type of all typedefs."},
1484 { "target", typy_target
, METH_NOARGS
,
1485 "target () -> Type\n\
1486 Return the target type of this type." },
1487 { "template_argument", typy_template_argument
, METH_VARARGS
,
1488 "template_argument (arg, [block]) -> Type\n\
1489 Return the type of a template argument." },
1490 { "unqualified", typy_unqualified
, METH_NOARGS
,
1491 "unqualified () -> Type\n\
1492 Return a variant of this type without const or volatile attributes." },
1493 { "values", typy_values
, METH_NOARGS
,
1494 "values () -> list\n\
1495 Return a list holding all the fields of this type.\n\
1496 Each field is a gdb.Field object." },
1497 { "volatile", typy_volatile
, METH_NOARGS
,
1498 "volatile () -> Type\n\
1499 Return a volatile variant of this type" },
1503 static PyNumberMethods type_object_as_number
= {
1505 NULL
, /* nb_subtract */
1506 NULL
, /* nb_multiply */
1508 NULL
, /* nb_divide */
1510 NULL
, /* nb_remainder */
1511 NULL
, /* nb_divmod */
1512 NULL
, /* nb_power */
1513 NULL
, /* nb_negative */
1514 NULL
, /* nb_positive */
1515 NULL
, /* nb_absolute */
1516 typy_nonzero
, /* nb_nonzero */
1517 NULL
, /* nb_invert */
1518 NULL
, /* nb_lshift */
1519 NULL
, /* nb_rshift */
1525 NULL
, /* reserved */
1527 NULL
, /* nb_coerce */
1531 NULL
, /* nb_float */
1538 static PyMappingMethods typy_mapping
= {
1541 NULL
/* no "set" method */
1544 PyTypeObject type_object_type
=
1546 PyVarObject_HEAD_INIT (NULL
, 0)
1547 "gdb.Type", /*tp_name*/
1548 sizeof (type_object
), /*tp_basicsize*/
1550 typy_dealloc
, /*tp_dealloc*/
1556 &type_object_as_number
, /*tp_as_number*/
1557 0, /*tp_as_sequence*/
1558 &typy_mapping
, /*tp_as_mapping*/
1561 typy_str
, /*tp_str*/
1565 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_ITER
, /*tp_flags*/
1566 "GDB type object", /* tp_doc */
1567 0, /* tp_traverse */
1569 typy_richcompare
, /* tp_richcompare */
1570 0, /* tp_weaklistoffset */
1571 typy_iter
, /* tp_iter */
1572 0, /* tp_iternext */
1573 type_object_methods
, /* tp_methods */
1575 type_object_getset
, /* tp_getset */
1578 0, /* tp_descr_get */
1579 0, /* tp_descr_set */
1580 0, /* tp_dictoffset */
1586 static gdb_PyGetSetDef field_object_getset
[] =
1588 { "__dict__", gdb_py_generic_dict
, NULL
,
1589 "The __dict__ for this field.", &field_object_type
},
1593 PyTypeObject field_object_type
=
1595 PyVarObject_HEAD_INIT (NULL
, 0)
1596 "gdb.Field", /*tp_name*/
1597 sizeof (field_object
), /*tp_basicsize*/
1599 field_dealloc
, /*tp_dealloc*/
1606 0, /*tp_as_sequence*/
1607 0, /*tp_as_mapping*/
1614 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_ITER
, /*tp_flags*/
1615 "GDB field object", /* tp_doc */
1616 0, /* tp_traverse */
1618 0, /* tp_richcompare */
1619 0, /* tp_weaklistoffset */
1621 0, /* tp_iternext */
1624 field_object_getset
, /* tp_getset */
1627 0, /* tp_descr_get */
1628 0, /* tp_descr_set */
1629 offsetof (field_object
, dict
), /* tp_dictoffset */
1635 PyTypeObject type_iterator_object_type
= {
1636 PyVarObject_HEAD_INIT (NULL
, 0)
1637 "gdb.TypeIterator", /*tp_name*/
1638 sizeof (typy_iterator_object
), /*tp_basicsize*/
1640 typy_iterator_dealloc
, /*tp_dealloc*/
1647 0, /*tp_as_sequence*/
1648 0, /*tp_as_mapping*/
1655 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_ITER
, /*tp_flags*/
1656 "GDB type iterator object", /*tp_doc */
1659 0, /*tp_richcompare */
1660 0, /*tp_weaklistoffset */
1661 typy_iterator_iter
, /*tp_iter */
1662 typy_iterator_iternext
, /*tp_iternext */