1 /* Python interface to types.
3 Copyright (C) 2008, 2009, 2010, 2011 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 "exceptions.h"
23 #include "python-internal.h"
26 #include "cp-support.h"
33 typedef struct pyty_type_object
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
;
45 static PyTypeObject type_object_type
;
48 typedef struct pyty_field_object
52 /* Dictionary holding our attributes. */
56 static PyTypeObject field_object_type
;
58 /* This is used to initialize various gdb.TYPE_ constants. */
67 #define ENTRY(X) { X, #X }
69 static struct pyty_code pyty_codes
[] =
71 ENTRY (TYPE_CODE_PTR
),
72 ENTRY (TYPE_CODE_ARRAY
),
73 ENTRY (TYPE_CODE_STRUCT
),
74 ENTRY (TYPE_CODE_UNION
),
75 ENTRY (TYPE_CODE_ENUM
),
76 ENTRY (TYPE_CODE_FLAGS
),
77 ENTRY (TYPE_CODE_FUNC
),
78 ENTRY (TYPE_CODE_INT
),
79 ENTRY (TYPE_CODE_FLT
),
80 ENTRY (TYPE_CODE_VOID
),
81 ENTRY (TYPE_CODE_SET
),
82 ENTRY (TYPE_CODE_RANGE
),
83 ENTRY (TYPE_CODE_STRING
),
84 ENTRY (TYPE_CODE_BITSTRING
),
85 ENTRY (TYPE_CODE_ERROR
),
86 ENTRY (TYPE_CODE_METHOD
),
87 ENTRY (TYPE_CODE_METHODPTR
),
88 ENTRY (TYPE_CODE_MEMBERPTR
),
89 ENTRY (TYPE_CODE_REF
),
90 ENTRY (TYPE_CODE_CHAR
),
91 ENTRY (TYPE_CODE_BOOL
),
92 ENTRY (TYPE_CODE_COMPLEX
),
93 ENTRY (TYPE_CODE_TYPEDEF
),
94 ENTRY (TYPE_CODE_NAMESPACE
),
95 ENTRY (TYPE_CODE_DECFLOAT
),
96 ENTRY (TYPE_CODE_INTERNAL_FUNCTION
),
97 { TYPE_CODE_UNDEF
, NULL
}
103 field_dealloc (PyObject
*obj
)
105 field_object
*f
= (field_object
*) obj
;
107 Py_XDECREF (f
->dict
);
108 f
->ob_type
->tp_free (obj
);
114 field_object
*result
= PyObject_New (field_object
, &field_object_type
);
118 result
->dict
= PyDict_New ();
125 return (PyObject
*) result
;
130 /* Return the code for this type. */
132 typy_get_code (PyObject
*self
, void *closure
)
134 struct type
*type
= ((type_object
*) self
)->type
;
136 return PyInt_FromLong (TYPE_CODE (type
));
139 /* Helper function for typy_fields which converts a single field to a
140 dictionary. Returns NULL on error. */
142 convert_field (struct type
*type
, int field
)
144 PyObject
*result
= field_new ();
150 if (!field_is_static (&TYPE_FIELD (type
, field
)))
152 arg
= PyLong_FromLong (TYPE_FIELD_BITPOS (type
, field
));
156 if (PyObject_SetAttrString (result
, "bitpos", arg
) < 0)
160 if (TYPE_FIELD_NAME (type
, field
))
161 arg
= PyString_FromString (TYPE_FIELD_NAME (type
, field
));
169 if (PyObject_SetAttrString (result
, "name", arg
) < 0)
172 arg
= TYPE_FIELD_ARTIFICIAL (type
, field
) ? Py_True
: Py_False
;
174 if (PyObject_SetAttrString (result
, "artificial", arg
) < 0)
177 if (TYPE_CODE (type
) == TYPE_CODE_CLASS
)
178 arg
= field
< TYPE_N_BASECLASSES (type
) ? Py_True
: Py_False
;
182 if (PyObject_SetAttrString (result
, "is_base_class", arg
) < 0)
185 arg
= PyLong_FromLong (TYPE_FIELD_BITSIZE (type
, field
));
188 if (PyObject_SetAttrString (result
, "bitsize", arg
) < 0)
191 /* A field can have a NULL type in some situations. */
192 if (TYPE_FIELD_TYPE (type
, field
) == NULL
)
198 arg
= type_to_type_object (TYPE_FIELD_TYPE (type
, field
));
201 if (PyObject_SetAttrString (result
, "type", arg
) < 0)
213 /* Return a sequence of all fields. Each field is a dictionary with
214 some pre-defined keys. */
216 typy_fields (PyObject
*self
, PyObject
*args
)
220 struct type
*type
= ((type_object
*) self
)->type
;
221 volatile struct gdb_exception except
;
223 TRY_CATCH (except
, RETURN_MASK_ALL
)
225 CHECK_TYPEDEF (type
);
227 GDB_PY_HANDLE_EXCEPTION (except
);
229 /* We would like to make a tuple here, make fields immutable, and
230 then memoize the result (and perhaps make Field.type() lazy).
231 However, that can lead to cycles. */
232 result
= PyList_New (0);
234 for (i
= 0; i
< TYPE_NFIELDS (type
); ++i
)
236 PyObject
*dict
= convert_field (type
, i
);
243 if (PyList_Append (result
, dict
))
255 /* Return the type's tag, or None. */
257 typy_get_tag (PyObject
*self
, void *closure
)
259 struct type
*type
= ((type_object
*) self
)->type
;
261 if (!TYPE_TAG_NAME (type
))
263 return PyString_FromString (TYPE_TAG_NAME (type
));
266 /* Return the type, stripped of typedefs. */
268 typy_strip_typedefs (PyObject
*self
, PyObject
*args
)
270 struct type
*type
= ((type_object
*) self
)->type
;
272 return type_to_type_object (check_typedef (type
));
275 /* Return an array type. */
278 typy_array (PyObject
*self
, PyObject
*args
)
281 PyObject
*n2_obj
= NULL
;
282 struct type
*array
= NULL
;
283 struct type
*type
= ((type_object
*) self
)->type
;
284 volatile struct gdb_exception except
;
286 if (! PyArg_ParseTuple (args
, "l|O", &n1
, &n2_obj
))
291 if (!PyInt_Check (n2_obj
))
293 PyErr_SetString (PyExc_RuntimeError
,
294 _("Array bound must be an integer"));
298 if (! gdb_py_int_as_long (n2_obj
, &n2
))
309 PyErr_SetString (PyExc_ValueError
,
310 _("Array length must not be negative"));
314 TRY_CATCH (except
, RETURN_MASK_ALL
)
316 array
= lookup_array_range_type (type
, n1
, n2
);
318 GDB_PY_HANDLE_EXCEPTION (except
);
320 return type_to_type_object (array
);
323 /* Return a Type object which represents a pointer to SELF. */
325 typy_pointer (PyObject
*self
, PyObject
*args
)
327 struct type
*type
= ((type_object
*) self
)->type
;
328 volatile struct gdb_exception except
;
330 TRY_CATCH (except
, RETURN_MASK_ALL
)
332 type
= lookup_pointer_type (type
);
334 GDB_PY_HANDLE_EXCEPTION (except
);
336 return type_to_type_object (type
);
339 /* Return the range of a type represented by SELF. The return type is
340 a tuple. The first element of the tuple contains the low bound,
341 while the second element of the tuple contains the high bound. */
343 typy_range (PyObject
*self
, PyObject
*args
)
345 struct type
*type
= ((type_object
*) self
)->type
;
347 PyObject
*low_bound
= NULL
, *high_bound
= NULL
;
348 /* Initialize these to appease GCC warnings. */
349 LONGEST low
= 0, high
= 0;
351 if (TYPE_CODE (type
) != TYPE_CODE_ARRAY
352 && TYPE_CODE (type
) != TYPE_CODE_STRING
353 && TYPE_CODE (type
) != TYPE_CODE_RANGE
)
355 PyErr_SetString (PyExc_RuntimeError
,
356 _("This type does not have a range."));
360 switch (TYPE_CODE (type
))
362 case TYPE_CODE_ARRAY
:
363 case TYPE_CODE_STRING
:
364 low
= TYPE_LOW_BOUND (TYPE_INDEX_TYPE (type
));
365 high
= TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (type
));
367 case TYPE_CODE_RANGE
:
368 low
= TYPE_LOW_BOUND (type
);
369 high
= TYPE_HIGH_BOUND (type
);
373 low_bound
= PyLong_FromLong (low
);
377 high_bound
= PyLong_FromLong (high
);
381 result
= PyTuple_New (2);
385 if (PyTuple_SetItem (result
, 0, low_bound
) != 0)
390 if (PyTuple_SetItem (result
, 1, high_bound
) != 0)
392 Py_DECREF (high_bound
);
399 Py_XDECREF (high_bound
);
400 Py_XDECREF (low_bound
);
404 /* Return a Type object which represents a reference to SELF. */
406 typy_reference (PyObject
*self
, PyObject
*args
)
408 struct type
*type
= ((type_object
*) self
)->type
;
409 volatile struct gdb_exception except
;
411 TRY_CATCH (except
, RETURN_MASK_ALL
)
413 type
= lookup_reference_type (type
);
415 GDB_PY_HANDLE_EXCEPTION (except
);
417 return type_to_type_object (type
);
420 /* Return a Type object which represents the target type of SELF. */
422 typy_target (PyObject
*self
, PyObject
*args
)
424 struct type
*type
= ((type_object
*) self
)->type
;
426 if (!TYPE_TARGET_TYPE (type
))
428 PyErr_SetString (PyExc_RuntimeError
,
429 _("Type does not have a target."));
433 return type_to_type_object (TYPE_TARGET_TYPE (type
));
436 /* Return a const-qualified type variant. */
438 typy_const (PyObject
*self
, PyObject
*args
)
440 struct type
*type
= ((type_object
*) self
)->type
;
441 volatile struct gdb_exception except
;
443 TRY_CATCH (except
, RETURN_MASK_ALL
)
445 type
= make_cv_type (1, 0, type
, NULL
);
447 GDB_PY_HANDLE_EXCEPTION (except
);
449 return type_to_type_object (type
);
452 /* Return a volatile-qualified type variant. */
454 typy_volatile (PyObject
*self
, PyObject
*args
)
456 struct type
*type
= ((type_object
*) self
)->type
;
457 volatile struct gdb_exception except
;
459 TRY_CATCH (except
, RETURN_MASK_ALL
)
461 type
= make_cv_type (0, 1, type
, NULL
);
463 GDB_PY_HANDLE_EXCEPTION (except
);
465 return type_to_type_object (type
);
468 /* Return an unqualified type variant. */
470 typy_unqualified (PyObject
*self
, PyObject
*args
)
472 struct type
*type
= ((type_object
*) self
)->type
;
473 volatile struct gdb_exception except
;
475 TRY_CATCH (except
, RETURN_MASK_ALL
)
477 type
= make_cv_type (0, 0, type
, NULL
);
479 GDB_PY_HANDLE_EXCEPTION (except
);
481 return type_to_type_object (type
);
484 /* Return the size of the type represented by SELF, in bytes. */
486 typy_get_sizeof (PyObject
*self
, void *closure
)
488 struct type
*type
= ((type_object
*) self
)->type
;
489 volatile struct gdb_exception except
;
491 TRY_CATCH (except
, RETURN_MASK_ALL
)
493 check_typedef (type
);
495 /* Ignore exceptions. */
497 return PyLong_FromLong (TYPE_LENGTH (type
));
501 typy_lookup_typename (const char *type_name
, struct block
*block
)
503 struct type
*type
= NULL
;
504 volatile struct gdb_exception except
;
506 TRY_CATCH (except
, RETURN_MASK_ALL
)
508 if (!strncmp (type_name
, "struct ", 7))
509 type
= lookup_struct (type_name
+ 7, NULL
);
510 else if (!strncmp (type_name
, "union ", 6))
511 type
= lookup_union (type_name
+ 6, NULL
);
512 else if (!strncmp (type_name
, "enum ", 5))
513 type
= lookup_enum (type_name
+ 5, NULL
);
515 type
= lookup_typename (python_language
, python_gdbarch
,
516 type_name
, block
, 0);
518 if (except
.reason
< 0)
520 PyErr_Format (except
.reason
== RETURN_QUIT
521 ? PyExc_KeyboardInterrupt
: PyExc_RuntimeError
,
522 "%s", except
.message
);
530 typy_lookup_type (struct demangle_component
*demangled
,
535 enum demangle_component_type demangled_type
;
537 /* Save the type: typy_lookup_type() may (indirectly) overwrite
538 memory pointed by demangled. */
539 demangled_type
= demangled
->type
;
541 if (demangled_type
== DEMANGLE_COMPONENT_POINTER
542 || demangled_type
== DEMANGLE_COMPONENT_REFERENCE
543 || demangled_type
== DEMANGLE_COMPONENT_CONST
544 || demangled_type
== DEMANGLE_COMPONENT_VOLATILE
)
546 type
= typy_lookup_type (demangled
->u
.s_binary
.left
, block
);
550 switch (demangled_type
)
552 case DEMANGLE_COMPONENT_REFERENCE
:
553 return lookup_reference_type (type
);
554 case DEMANGLE_COMPONENT_POINTER
:
555 return lookup_pointer_type (type
);
556 case DEMANGLE_COMPONENT_CONST
:
557 return make_cv_type (1, 0, type
, NULL
);
558 case DEMANGLE_COMPONENT_VOLATILE
:
559 return make_cv_type (0, 1, type
, NULL
);
563 type_name
= cp_comp_to_string (demangled
, 10);
564 type
= typy_lookup_typename (type_name
, block
);
570 /* This is a helper function for typy_template_argument that is used
571 when the type does not have template symbols attached. It works by
572 parsing the type name. This happens with compilers, like older
573 versions of GCC, that do not emit DW_TAG_template_*. */
576 typy_legacy_template_argument (struct type
*type
, struct block
*block
,
580 struct demangle_component
*demangled
;
581 struct demangle_parse_info
*info
;
583 struct type
*argtype
;
584 struct cleanup
*cleanup
;
586 if (TYPE_NAME (type
) == NULL
)
588 PyErr_SetString (PyExc_RuntimeError
, _("Null type name."));
592 /* Note -- this is not thread-safe. */
593 info
= cp_demangled_name_to_comp (TYPE_NAME (type
), &err
);
596 PyErr_SetString (PyExc_RuntimeError
, err
);
599 demangled
= info
->tree
;
600 cleanup
= make_cleanup_cp_demangled_name_parse_free (info
);
602 /* Strip off component names. */
603 while (demangled
->type
== DEMANGLE_COMPONENT_QUAL_NAME
604 || demangled
->type
== DEMANGLE_COMPONENT_LOCAL_NAME
)
605 demangled
= demangled
->u
.s_binary
.right
;
607 if (demangled
->type
!= DEMANGLE_COMPONENT_TEMPLATE
)
609 do_cleanups (cleanup
);
610 PyErr_SetString (PyExc_RuntimeError
, _("Type is not a template."));
614 /* Skip from the template to the arguments. */
615 demangled
= demangled
->u
.s_binary
.right
;
617 for (i
= 0; demangled
&& i
< argno
; ++i
)
618 demangled
= demangled
->u
.s_binary
.right
;
622 do_cleanups (cleanup
);
623 PyErr_Format (PyExc_RuntimeError
, _("No argument %d in template."),
628 argtype
= typy_lookup_type (demangled
->u
.s_binary
.left
, block
);
629 do_cleanups (cleanup
);
633 return type_to_type_object (argtype
);
637 typy_template_argument (PyObject
*self
, PyObject
*args
)
640 struct type
*type
= ((type_object
*) self
)->type
;
641 struct block
*block
= NULL
;
642 PyObject
*block_obj
= NULL
;
644 struct value
*val
= NULL
;
645 volatile struct gdb_exception except
;
647 if (! PyArg_ParseTuple (args
, "i|O", &argno
, &block_obj
))
652 block
= block_object_to_block (block_obj
);
655 PyErr_SetString (PyExc_RuntimeError
,
656 _("Second argument must be block."));
661 TRY_CATCH (except
, RETURN_MASK_ALL
)
663 type
= check_typedef (type
);
664 if (TYPE_CODE (type
) == TYPE_CODE_REF
)
665 type
= check_typedef (TYPE_TARGET_TYPE (type
));
667 GDB_PY_HANDLE_EXCEPTION (except
);
669 /* We might not have DW_TAG_template_*, so try to parse the type's
670 name. This is inefficient if we do not have a template type --
671 but that is going to wind up as an error anyhow. */
672 if (! TYPE_N_TEMPLATE_ARGUMENTS (type
))
673 return typy_legacy_template_argument (type
, block
, argno
);
675 if (argno
>= TYPE_N_TEMPLATE_ARGUMENTS (type
))
677 PyErr_Format (PyExc_RuntimeError
, _("No argument %d in template."),
682 sym
= TYPE_TEMPLATE_ARGUMENT (type
, argno
);
683 if (SYMBOL_CLASS (sym
) == LOC_TYPEDEF
)
684 return type_to_type_object (SYMBOL_TYPE (sym
));
685 else if (SYMBOL_CLASS (sym
) == LOC_OPTIMIZED_OUT
)
687 PyErr_Format (PyExc_RuntimeError
,
688 _("Template argument is optimized out"));
692 TRY_CATCH (except
, RETURN_MASK_ALL
)
694 val
= value_of_variable (sym
, block
);
696 GDB_PY_HANDLE_EXCEPTION (except
);
698 return value_to_value_object (val
);
702 typy_str (PyObject
*self
)
704 volatile struct gdb_exception except
;
705 char *thetype
= NULL
;
709 TRY_CATCH (except
, RETURN_MASK_ALL
)
711 struct cleanup
*old_chain
;
714 stb
= mem_fileopen ();
715 old_chain
= make_cleanup_ui_file_delete (stb
);
717 type_print (type_object_to_type (self
), "", stb
, -1);
719 thetype
= ui_file_xstrdup (stb
, &length
);
720 do_cleanups (old_chain
);
722 if (except
.reason
< 0)
725 GDB_PY_HANDLE_EXCEPTION (except
);
728 result
= PyUnicode_Decode (thetype
, length
, host_charset (), NULL
);
734 /* An entry in the type-equality bcache. */
736 typedef struct type_equality_entry
738 struct type
*type1
, *type2
;
739 } type_equality_entry_d
;
741 DEF_VEC_O (type_equality_entry_d
);
743 /* A helper function to compare two strings. Returns 1 if they are
744 the same, 0 otherwise. Handles NULLs properly. */
747 compare_strings (const char *s
, const char *t
)
749 if (s
== NULL
&& t
!= NULL
)
751 else if (s
!= NULL
&& t
== NULL
)
753 else if (s
== NULL
&& t
== NULL
)
755 return strcmp (s
, t
) == 0;
758 /* A helper function for typy_richcompare that checks two types for
759 "deep" equality. Returns Py_EQ if the types are considered the
760 same, Py_NE otherwise. */
763 check_types_equal (struct type
*type1
, struct type
*type2
,
764 VEC (type_equality_entry_d
) **worklist
)
766 CHECK_TYPEDEF (type1
);
767 CHECK_TYPEDEF (type2
);
772 if (TYPE_CODE (type1
) != TYPE_CODE (type2
)
773 || TYPE_LENGTH (type1
) != TYPE_LENGTH (type2
)
774 || TYPE_UNSIGNED (type1
) != TYPE_UNSIGNED (type2
)
775 || TYPE_NOSIGN (type1
) != TYPE_NOSIGN (type2
)
776 || TYPE_VARARGS (type1
) != TYPE_VARARGS (type2
)
777 || TYPE_VECTOR (type1
) != TYPE_VECTOR (type2
)
778 || TYPE_NOTTEXT (type1
) != TYPE_NOTTEXT (type2
)
779 || TYPE_INSTANCE_FLAGS (type1
) != TYPE_INSTANCE_FLAGS (type2
)
780 || TYPE_NFIELDS (type1
) != TYPE_NFIELDS (type2
))
783 if (!compare_strings (TYPE_TAG_NAME (type1
), TYPE_TAG_NAME (type2
)))
785 if (!compare_strings (TYPE_NAME (type1
), TYPE_NAME (type2
)))
788 if (TYPE_CODE (type1
) == TYPE_CODE_RANGE
)
790 if (memcmp (TYPE_RANGE_DATA (type1
), TYPE_RANGE_DATA (type2
),
791 sizeof (*TYPE_RANGE_DATA (type1
))) != 0)
798 for (i
= 0; i
< TYPE_NFIELDS (type1
); ++i
)
800 const struct field
*field1
= &TYPE_FIELD (type1
, i
);
801 const struct field
*field2
= &TYPE_FIELD (type2
, i
);
802 struct type_equality_entry entry
;
804 if (FIELD_ARTIFICIAL (*field1
) != FIELD_ARTIFICIAL (*field2
)
805 || FIELD_BITSIZE (*field1
) != FIELD_BITSIZE (*field2
)
806 || FIELD_LOC_KIND (*field1
) != FIELD_LOC_KIND (*field2
))
808 if (!compare_strings (FIELD_NAME (*field1
), FIELD_NAME (*field2
)))
810 switch (FIELD_LOC_KIND (*field1
))
812 case FIELD_LOC_KIND_BITPOS
:
813 if (FIELD_BITPOS (*field1
) != FIELD_BITPOS (*field2
))
816 case FIELD_LOC_KIND_PHYSADDR
:
817 if (FIELD_STATIC_PHYSADDR (*field1
)
818 != FIELD_STATIC_PHYSADDR (*field2
))
821 case FIELD_LOC_KIND_PHYSNAME
:
822 if (!compare_strings (FIELD_STATIC_PHYSNAME (*field1
),
823 FIELD_STATIC_PHYSNAME (*field2
)))
828 entry
.type1
= FIELD_TYPE (*field1
);
829 entry
.type2
= FIELD_TYPE (*field2
);
830 VEC_safe_push (type_equality_entry_d
, *worklist
, &entry
);
834 if (TYPE_TARGET_TYPE (type1
) != NULL
)
836 struct type_equality_entry entry
;
839 if (TYPE_TARGET_TYPE (type2
) == NULL
)
842 entry
.type1
= TYPE_TARGET_TYPE (type1
);
843 entry
.type2
= TYPE_TARGET_TYPE (type2
);
844 VEC_safe_push (type_equality_entry_d
, *worklist
, &entry
);
846 else if (TYPE_TARGET_TYPE (type2
) != NULL
)
852 /* Check types on a worklist for equality. Returns Py_NE if any pair
853 is not equal, Py_EQ if they are all considered equal. */
856 check_types_worklist (VEC (type_equality_entry_d
) **worklist
,
857 struct bcache
*cache
)
859 while (!VEC_empty (type_equality_entry_d
, *worklist
))
861 struct type_equality_entry entry
;
864 entry
= *VEC_last (type_equality_entry_d
, *worklist
);
865 VEC_pop (type_equality_entry_d
, *worklist
);
867 /* If the type pair has already been visited, we know it is
869 bcache_full (&entry
, sizeof (entry
), cache
, &added
);
873 if (check_types_equal (entry
.type1
, entry
.type2
, worklist
) == Py_NE
)
880 /* Implement the richcompare method. */
883 typy_richcompare (PyObject
*self
, PyObject
*other
, int op
)
886 struct type
*type1
= type_object_to_type (self
);
887 struct type
*type2
= type_object_to_type (other
);
888 volatile struct gdb_exception except
;
890 /* We can only compare ourselves to another Type object, and only
891 for equality or inequality. */
892 if (type2
== NULL
|| (op
!= Py_EQ
&& op
!= Py_NE
))
894 Py_INCREF (Py_NotImplemented
);
895 return Py_NotImplemented
;
902 struct bcache
*cache
;
903 VEC (type_equality_entry_d
) *worklist
= NULL
;
904 struct type_equality_entry entry
;
906 cache
= bcache_xmalloc (NULL
, NULL
);
910 VEC_safe_push (type_equality_entry_d
, worklist
, &entry
);
912 TRY_CATCH (except
, RETURN_MASK_ALL
)
914 result
= check_types_worklist (&worklist
, cache
);
916 if (except
.reason
< 0)
919 bcache_xfree (cache
);
920 VEC_free (type_equality_entry_d
, worklist
);
930 static const struct objfile_data
*typy_objfile_data_key
;
933 save_objfile_types (struct objfile
*objfile
, void *datum
)
935 type_object
*obj
= datum
;
937 struct cleanup
*cleanup
;
939 /* This prevents another thread from freeing the objects we're
941 cleanup
= ensure_python_env (get_objfile_arch (objfile
), current_language
);
943 copied_types
= create_copied_types_hash (objfile
);
947 type_object
*next
= obj
->next
;
949 htab_empty (copied_types
);
951 obj
->type
= copy_type_recursive (objfile
, obj
->type
, copied_types
);
959 htab_delete (copied_types
);
961 do_cleanups (cleanup
);
965 set_type (type_object
*obj
, struct type
*type
)
969 if (type
&& TYPE_OBJFILE (type
))
971 struct objfile
*objfile
= TYPE_OBJFILE (type
);
973 obj
->next
= objfile_data (objfile
, typy_objfile_data_key
);
975 obj
->next
->prev
= obj
;
976 set_objfile_data (objfile
, typy_objfile_data_key
, obj
);
983 typy_dealloc (PyObject
*obj
)
985 type_object
*type
= (type_object
*) obj
;
988 type
->prev
->next
= type
->next
;
989 else if (type
->type
&& TYPE_OBJFILE (type
->type
))
991 /* Must reset head of list. */
992 struct objfile
*objfile
= TYPE_OBJFILE (type
->type
);
995 set_objfile_data (objfile
, typy_objfile_data_key
, type
->next
);
998 type
->next
->prev
= type
->prev
;
1000 type
->ob_type
->tp_free (type
);
1003 /* Create a new Type referring to TYPE. */
1005 type_to_type_object (struct type
*type
)
1007 type_object
*type_obj
;
1009 type_obj
= PyObject_New (type_object
, &type_object_type
);
1011 set_type (type_obj
, type
);
1013 return (PyObject
*) type_obj
;
1017 type_object_to_type (PyObject
*obj
)
1019 if (! PyObject_TypeCheck (obj
, &type_object_type
))
1021 return ((type_object
*) obj
)->type
;
1026 /* Implementation of gdb.lookup_type. */
1028 gdbpy_lookup_type (PyObject
*self
, PyObject
*args
, PyObject
*kw
)
1030 static char *keywords
[] = { "name", "block", NULL
};
1031 const char *type_name
= NULL
;
1032 struct type
*type
= NULL
;
1033 PyObject
*block_obj
= NULL
;
1034 struct block
*block
= NULL
;
1036 if (! PyArg_ParseTupleAndKeywords (args
, kw
, "s|O", keywords
,
1037 &type_name
, &block_obj
))
1042 block
= block_object_to_block (block_obj
);
1045 PyErr_SetString (PyExc_RuntimeError
,
1046 _("'block' argument must be a Block."));
1051 type
= typy_lookup_typename (type_name
, block
);
1055 return (PyObject
*) type_to_type_object (type
);
1059 gdbpy_initialize_types (void)
1063 typy_objfile_data_key
1064 = register_objfile_data_with_cleanup (save_objfile_types
, NULL
);
1066 if (PyType_Ready (&type_object_type
) < 0)
1068 if (PyType_Ready (&field_object_type
) < 0)
1071 for (i
= 0; pyty_codes
[i
].name
; ++i
)
1073 if (PyModule_AddIntConstant (gdb_module
,
1074 /* Cast needed for Python 2.4. */
1075 (char *) pyty_codes
[i
].name
,
1076 pyty_codes
[i
].code
) < 0)
1080 Py_INCREF (&type_object_type
);
1081 PyModule_AddObject (gdb_module
, "Type", (PyObject
*) &type_object_type
);
1083 Py_INCREF (&field_object_type
);
1084 PyModule_AddObject (gdb_module
, "Field", (PyObject
*) &field_object_type
);
1089 static PyGetSetDef type_object_getset
[] =
1091 { "code", typy_get_code
, NULL
,
1092 "The code for this type.", NULL
},
1093 { "sizeof", typy_get_sizeof
, NULL
,
1094 "The size of this type, in bytes.", NULL
},
1095 { "tag", typy_get_tag
, NULL
,
1096 "The tag name for this type, or None.", NULL
},
1100 static PyMethodDef type_object_methods
[] =
1102 { "array", typy_array
, METH_VARARGS
,
1103 "array (N) -> Type\n\
1104 Return a type which represents an array of N objects of this type." },
1105 { "const", typy_const
, METH_NOARGS
,
1106 "const () -> Type\n\
1107 Return a const variant of this type." },
1108 { "fields", typy_fields
, METH_NOARGS
,
1109 "field () -> list\n\
1110 Return a sequence holding all the fields of this type.\n\
1111 Each field is a dictionary." },
1112 { "pointer", typy_pointer
, METH_NOARGS
,
1113 "pointer () -> Type\n\
1114 Return a type of pointer to this type." },
1115 { "range", typy_range
, METH_NOARGS
,
1116 "range () -> tuple\n\
1117 Return a tuple containing the lower and upper range for this type."},
1118 { "reference", typy_reference
, METH_NOARGS
,
1119 "reference () -> Type\n\
1120 Return a type of reference to this type." },
1121 { "strip_typedefs", typy_strip_typedefs
, METH_NOARGS
,
1122 "strip_typedefs () -> Type\n\
1123 Return a type formed by stripping this type of all typedefs."},
1124 { "target", typy_target
, METH_NOARGS
,
1125 "target () -> Type\n\
1126 Return the target type of this type." },
1127 { "template_argument", typy_template_argument
, METH_VARARGS
,
1128 "template_argument (arg, [block]) -> Type\n\
1129 Return the type of a template argument." },
1130 { "unqualified", typy_unqualified
, METH_NOARGS
,
1131 "unqualified () -> Type\n\
1132 Return a variant of this type without const or volatile attributes." },
1133 { "volatile", typy_volatile
, METH_NOARGS
,
1134 "volatile () -> Type\n\
1135 Return a volatile variant of this type" },
1139 static PyTypeObject type_object_type
=
1141 PyObject_HEAD_INIT (NULL
)
1143 "gdb.Type", /*tp_name*/
1144 sizeof (type_object
), /*tp_basicsize*/
1146 typy_dealloc
, /*tp_dealloc*/
1153 0, /*tp_as_sequence*/
1154 0, /*tp_as_mapping*/
1157 typy_str
, /*tp_str*/
1161 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_ITER
, /*tp_flags*/
1162 "GDB type object", /* tp_doc */
1163 0, /* tp_traverse */
1165 typy_richcompare
, /* tp_richcompare */
1166 0, /* tp_weaklistoffset */
1168 0, /* tp_iternext */
1169 type_object_methods
, /* tp_methods */
1171 type_object_getset
, /* tp_getset */
1174 0, /* tp_descr_get */
1175 0, /* tp_descr_set */
1176 0, /* tp_dictoffset */
1182 static PyTypeObject field_object_type
=
1184 PyObject_HEAD_INIT (NULL
)
1186 "gdb.Field", /*tp_name*/
1187 sizeof (field_object
), /*tp_basicsize*/
1189 field_dealloc
, /*tp_dealloc*/
1196 0, /*tp_as_sequence*/
1197 0, /*tp_as_mapping*/
1204 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_ITER
, /*tp_flags*/
1205 "GDB field object", /* tp_doc */
1206 0, /* tp_traverse */
1208 0, /* tp_richcompare */
1209 0, /* tp_weaklistoffset */
1211 0, /* tp_iternext */
1217 0, /* tp_descr_get */
1218 0, /* tp_descr_set */
1219 offsetof (field_object
, dict
), /* tp_dictoffset */