xref: /dragonfly/contrib/gdb-7/gdb/python/py-type.c (revision fb151170)
1 /* Python interface to types.
2 
3    Copyright (C) 2008, 2009, 2010, 2011 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 "exceptions.h"
23 #include "python-internal.h"
24 #include "charset.h"
25 #include "gdbtypes.h"
26 #include "cp-support.h"
27 #include "demangle.h"
28 #include "objfiles.h"
29 #include "language.h"
30 #include "vec.h"
31 #include "bcache.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 static PyTypeObject type_object_type;
46 
47 /* A Field object.  */
48 typedef struct pyty_field_object
49 {
50   PyObject_HEAD
51 
52   /* Dictionary holding our attributes.  */
53   PyObject *dict;
54 } field_object;
55 
56 static PyTypeObject field_object_type;
57 
58 /* This is used to initialize various gdb.TYPE_ constants.  */
59 struct pyty_code
60 {
61   /* The code.  */
62   enum type_code code;
63   /* The name.  */
64   const char *name;
65 };
66 
67 #define ENTRY(X) { X, #X }
68 
69 static struct pyty_code pyty_codes[] =
70 {
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 }
98 };
99 
100 
101 
102 static void
103 field_dealloc (PyObject *obj)
104 {
105   field_object *f = (field_object *) obj;
106 
107   Py_XDECREF (f->dict);
108   f->ob_type->tp_free (obj);
109 }
110 
111 static PyObject *
112 field_new (void)
113 {
114   field_object *result = PyObject_New (field_object, &field_object_type);
115 
116   if (result)
117     {
118       result->dict = PyDict_New ();
119       if (!result->dict)
120 	{
121 	  Py_DECREF (result);
122 	  result = NULL;
123 	}
124     }
125   return (PyObject *) result;
126 }
127 
128 
129 
130 /* Return the code for this type.  */
131 static PyObject *
132 typy_get_code (PyObject *self, void *closure)
133 {
134   struct type *type = ((type_object *) self)->type;
135 
136   return PyInt_FromLong (TYPE_CODE (type));
137 }
138 
139 /* Helper function for typy_fields which converts a single field to a
140    dictionary.  Returns NULL on error.  */
141 static PyObject *
142 convert_field (struct type *type, int field)
143 {
144   PyObject *result = field_new ();
145   PyObject *arg;
146 
147   if (!result)
148     return NULL;
149 
150   if (!field_is_static (&TYPE_FIELD (type, field)))
151     {
152       arg = PyLong_FromLong (TYPE_FIELD_BITPOS (type, field));
153       if (!arg)
154 	goto fail;
155 
156       if (PyObject_SetAttrString (result, "bitpos", arg) < 0)
157 	goto failarg;
158     }
159 
160   if (TYPE_FIELD_NAME (type, field))
161     arg = PyString_FromString (TYPE_FIELD_NAME (type, field));
162   else
163     {
164       arg = Py_None;
165       Py_INCREF (arg);
166     }
167   if (!arg)
168     goto fail;
169   if (PyObject_SetAttrString (result, "name", arg) < 0)
170     goto failarg;
171 
172   arg = TYPE_FIELD_ARTIFICIAL (type, field) ? Py_True : Py_False;
173   Py_INCREF (arg);
174   if (PyObject_SetAttrString (result, "artificial", arg) < 0)
175     goto failarg;
176 
177   if (TYPE_CODE (type) == TYPE_CODE_CLASS)
178     arg = field < TYPE_N_BASECLASSES (type) ? Py_True : Py_False;
179   else
180     arg = Py_False;
181   Py_INCREF (arg);
182   if (PyObject_SetAttrString (result, "is_base_class", arg) < 0)
183     goto failarg;
184 
185   arg = PyLong_FromLong (TYPE_FIELD_BITSIZE (type, field));
186   if (!arg)
187     goto fail;
188   if (PyObject_SetAttrString (result, "bitsize", arg) < 0)
189     goto failarg;
190 
191   /* A field can have a NULL type in some situations.  */
192   if (TYPE_FIELD_TYPE (type, field) == NULL)
193     {
194       arg = Py_None;
195       Py_INCREF (arg);
196     }
197   else
198     arg = type_to_type_object (TYPE_FIELD_TYPE (type, field));
199   if (!arg)
200     goto fail;
201   if (PyObject_SetAttrString (result, "type", arg) < 0)
202     goto failarg;
203 
204   return result;
205 
206  failarg:
207   Py_DECREF (arg);
208  fail:
209   Py_DECREF (result);
210   return NULL;
211 }
212 
213 /* Return a sequence of all fields.  Each field is a dictionary with
214    some pre-defined keys.  */
215 static PyObject *
216 typy_fields (PyObject *self, PyObject *args)
217 {
218   PyObject *result;
219   int i;
220   struct type *type = ((type_object *) self)->type;
221   volatile struct gdb_exception except;
222 
223   TRY_CATCH (except, RETURN_MASK_ALL)
224     {
225       CHECK_TYPEDEF (type);
226     }
227   GDB_PY_HANDLE_EXCEPTION (except);
228 
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);
233 
234   for (i = 0; i < TYPE_NFIELDS (type); ++i)
235     {
236       PyObject *dict = convert_field (type, i);
237 
238       if (!dict)
239 	{
240 	  Py_DECREF (result);
241 	  return NULL;
242 	}
243       if (PyList_Append (result, dict))
244 	{
245 	  Py_DECREF (dict);
246 	  Py_DECREF (result);
247 	  return NULL;
248 	}
249     }
250 
251   return result;
252 }
253 
254 /* Return the type's tag, or None.  */
255 static PyObject *
256 typy_get_tag (PyObject *self, void *closure)
257 {
258   struct type *type = ((type_object *) self)->type;
259 
260   if (!TYPE_TAG_NAME (type))
261     Py_RETURN_NONE;
262   return PyString_FromString (TYPE_TAG_NAME (type));
263 }
264 
265 /* Return the type, stripped of typedefs. */
266 static PyObject *
267 typy_strip_typedefs (PyObject *self, PyObject *args)
268 {
269   struct type *type = ((type_object *) self)->type;
270 
271   return type_to_type_object (check_typedef (type));
272 }
273 
274 /* Return an array type.  */
275 
276 static PyObject *
277 typy_array (PyObject *self, PyObject *args)
278 {
279   long n1, n2;
280   PyObject *n2_obj = NULL;
281   struct type *array = NULL;
282   struct type *type = ((type_object *) self)->type;
283   volatile struct gdb_exception except;
284 
285   if (! PyArg_ParseTuple (args, "l|O", &n1, &n2_obj))
286     return NULL;
287 
288   if (n2_obj)
289     {
290       if (!PyInt_Check (n2_obj))
291 	{
292 	  PyErr_SetString (PyExc_RuntimeError,
293 			   _("Array bound must be an integer"));
294 	  return NULL;
295 	}
296 
297       if (! gdb_py_int_as_long (n2_obj, &n2))
298 	return NULL;
299     }
300   else
301     {
302       n2 = n1;
303       n1 = 0;
304     }
305 
306   if (n2 < n1)
307     {
308       PyErr_SetString (PyExc_ValueError,
309 		       _("Array length must not be negative"));
310       return NULL;
311     }
312 
313   TRY_CATCH (except, RETURN_MASK_ALL)
314     {
315       array = lookup_array_range_type (type, n1, n2);
316     }
317   GDB_PY_HANDLE_EXCEPTION (except);
318 
319   return type_to_type_object (array);
320 }
321 
322 /* Return a Type object which represents a pointer to SELF.  */
323 static PyObject *
324 typy_pointer (PyObject *self, PyObject *args)
325 {
326   struct type *type = ((type_object *) self)->type;
327   volatile struct gdb_exception except;
328 
329   TRY_CATCH (except, RETURN_MASK_ALL)
330     {
331       type = lookup_pointer_type (type);
332     }
333   GDB_PY_HANDLE_EXCEPTION (except);
334 
335   return type_to_type_object (type);
336 }
337 
338 /* Return the range of a type represented by SELF.  The return type is
339    a tuple.  The first element of the tuple contains the low bound,
340    while the second element of the tuple contains the high bound.  */
341 static PyObject *
342 typy_range (PyObject *self, PyObject *args)
343 {
344   struct type *type = ((type_object *) self)->type;
345   PyObject *result;
346   PyObject *low_bound = NULL, *high_bound = NULL;
347   /* Initialize these to appease GCC warnings.  */
348   LONGEST low = 0, high = 0;
349 
350   if (TYPE_CODE (type) != TYPE_CODE_ARRAY
351       && TYPE_CODE (type) != TYPE_CODE_STRING
352       && TYPE_CODE (type) != TYPE_CODE_RANGE)
353     {
354       PyErr_SetString (PyExc_RuntimeError,
355 		       _("This type does not have a range."));
356       return NULL;
357     }
358 
359   switch (TYPE_CODE (type))
360     {
361     case TYPE_CODE_ARRAY:
362     case TYPE_CODE_STRING:
363       low = TYPE_LOW_BOUND (TYPE_INDEX_TYPE (type));
364       high = TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (type));
365       break;
366     case TYPE_CODE_RANGE:
367       low = TYPE_LOW_BOUND (type);
368       high = TYPE_HIGH_BOUND (type);
369       break;
370     }
371 
372   low_bound = PyLong_FromLong (low);
373   if (!low_bound)
374     goto failarg;
375 
376   high_bound = PyLong_FromLong (high);
377   if (!high_bound)
378     goto failarg;
379 
380   result = PyTuple_New (2);
381   if (!result)
382     goto failarg;
383 
384   if (PyTuple_SetItem (result, 0, low_bound) != 0)
385     {
386       Py_DECREF (result);
387       goto failarg;
388     }
389   if (PyTuple_SetItem (result, 1, high_bound) != 0)
390     {
391       Py_DECREF (high_bound);
392       Py_DECREF (result);
393       return NULL;
394     }
395   return result;
396 
397  failarg:
398   Py_XDECREF (high_bound);
399   Py_XDECREF (low_bound);
400   return NULL;
401 }
402 
403 /* Return a Type object which represents a reference to SELF.  */
404 static PyObject *
405 typy_reference (PyObject *self, PyObject *args)
406 {
407   struct type *type = ((type_object *) self)->type;
408   volatile struct gdb_exception except;
409 
410   TRY_CATCH (except, RETURN_MASK_ALL)
411     {
412       type = lookup_reference_type (type);
413     }
414   GDB_PY_HANDLE_EXCEPTION (except);
415 
416   return type_to_type_object (type);
417 }
418 
419 /* Return a Type object which represents the target type of SELF.  */
420 static PyObject *
421 typy_target (PyObject *self, PyObject *args)
422 {
423   struct type *type = ((type_object *) self)->type;
424 
425   if (!TYPE_TARGET_TYPE (type))
426     {
427       PyErr_SetString (PyExc_RuntimeError,
428 		       _("Type does not have a target."));
429       return NULL;
430     }
431 
432   return type_to_type_object (TYPE_TARGET_TYPE (type));
433 }
434 
435 /* Return a const-qualified type variant.  */
436 static PyObject *
437 typy_const (PyObject *self, PyObject *args)
438 {
439   struct type *type = ((type_object *) self)->type;
440   volatile struct gdb_exception except;
441 
442   TRY_CATCH (except, RETURN_MASK_ALL)
443     {
444       type = make_cv_type (1, 0, type, NULL);
445     }
446   GDB_PY_HANDLE_EXCEPTION (except);
447 
448   return type_to_type_object (type);
449 }
450 
451 /* Return a volatile-qualified type variant.  */
452 static PyObject *
453 typy_volatile (PyObject *self, PyObject *args)
454 {
455   struct type *type = ((type_object *) self)->type;
456   volatile struct gdb_exception except;
457 
458   TRY_CATCH (except, RETURN_MASK_ALL)
459     {
460       type = make_cv_type (0, 1, type, NULL);
461     }
462   GDB_PY_HANDLE_EXCEPTION (except);
463 
464   return type_to_type_object (type);
465 }
466 
467 /* Return an unqualified type variant.  */
468 static PyObject *
469 typy_unqualified (PyObject *self, PyObject *args)
470 {
471   struct type *type = ((type_object *) self)->type;
472   volatile struct gdb_exception except;
473 
474   TRY_CATCH (except, RETURN_MASK_ALL)
475     {
476       type = make_cv_type (0, 0, type, NULL);
477     }
478   GDB_PY_HANDLE_EXCEPTION (except);
479 
480   return type_to_type_object (type);
481 }
482 
483 /* Return the size of the type represented by SELF, in bytes.  */
484 static PyObject *
485 typy_get_sizeof (PyObject *self, void *closure)
486 {
487   struct type *type = ((type_object *) self)->type;
488   volatile struct gdb_exception except;
489 
490   TRY_CATCH (except, RETURN_MASK_ALL)
491     {
492       check_typedef (type);
493     }
494   /* Ignore exceptions.  */
495 
496   return PyLong_FromLong (TYPE_LENGTH (type));
497 }
498 
499 static struct type *
500 typy_lookup_typename (char *type_name, struct block *block)
501 {
502   struct type *type = NULL;
503   volatile struct gdb_exception except;
504 
505   TRY_CATCH (except, RETURN_MASK_ALL)
506     {
507       if (!strncmp (type_name, "struct ", 7))
508 	type = lookup_struct (type_name + 7, NULL);
509       else if (!strncmp (type_name, "union ", 6))
510 	type = lookup_union (type_name + 6, NULL);
511       else if (!strncmp (type_name, "enum ", 5))
512 	type = lookup_enum (type_name + 5, NULL);
513       else
514 	type = lookup_typename (python_language, python_gdbarch,
515 				type_name, block, 0);
516     }
517   if (except.reason < 0)
518     {
519       PyErr_Format (except.reason == RETURN_QUIT
520 		    ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
521 		    "%s", except.message);
522       return NULL;
523     }
524 
525   return type;
526 }
527 
528 static struct type *
529 typy_lookup_type (struct demangle_component *demangled,
530 		  struct block *block)
531 {
532   struct type *type;
533   char *type_name;
534   enum demangle_component_type demangled_type;
535 
536   /* Save the type: typy_lookup_type() may (indirectly) overwrite
537      memory pointed by demangled.  */
538   demangled_type = demangled->type;
539 
540   if (demangled_type == DEMANGLE_COMPONENT_POINTER
541       || demangled_type == DEMANGLE_COMPONENT_REFERENCE
542       || demangled_type == DEMANGLE_COMPONENT_CONST
543       || demangled_type == DEMANGLE_COMPONENT_VOLATILE)
544     {
545       type = typy_lookup_type (demangled->u.s_binary.left, block);
546       if (! type)
547 	return NULL;
548 
549       switch (demangled_type)
550 	{
551 	case DEMANGLE_COMPONENT_REFERENCE:
552 	  return lookup_reference_type (type);
553 	case DEMANGLE_COMPONENT_POINTER:
554 	  return lookup_pointer_type (type);
555 	case DEMANGLE_COMPONENT_CONST:
556 	  return make_cv_type (1, 0, type, NULL);
557 	case DEMANGLE_COMPONENT_VOLATILE:
558 	  return make_cv_type (0, 1, type, NULL);
559 	}
560     }
561 
562   type_name = cp_comp_to_string (demangled, 10);
563   type = typy_lookup_typename (type_name, block);
564   xfree (type_name);
565 
566   return type;
567 }
568 
569 /* This is a helper function for typy_template_argument that is used
570    when the type does not have template symbols attached.  It works by
571    parsing the type name.  This happens with compilers, like older
572    versions of GCC, that do not emit DW_TAG_template_*.  */
573 
574 static PyObject *
575 typy_legacy_template_argument (struct type *type, struct block *block,
576 			       int argno)
577 {
578   int i;
579   struct demangle_component *demangled;
580   const char *err;
581   struct type *argtype;
582 
583   if (TYPE_NAME (type) == NULL)
584     {
585       PyErr_SetString (PyExc_RuntimeError, _("Null type name."));
586       return NULL;
587     }
588 
589   /* Note -- this is not thread-safe.  */
590   demangled = cp_demangled_name_to_comp (TYPE_NAME (type), &err);
591   if (! demangled)
592     {
593       PyErr_SetString (PyExc_RuntimeError, err);
594       return NULL;
595     }
596 
597   /* Strip off component names.  */
598   while (demangled->type == DEMANGLE_COMPONENT_QUAL_NAME
599 	 || demangled->type == DEMANGLE_COMPONENT_LOCAL_NAME)
600     demangled = demangled->u.s_binary.right;
601 
602   if (demangled->type != DEMANGLE_COMPONENT_TEMPLATE)
603     {
604       PyErr_SetString (PyExc_RuntimeError, _("Type is not a template."));
605       return NULL;
606     }
607 
608   /* Skip from the template to the arguments.  */
609   demangled = demangled->u.s_binary.right;
610 
611   for (i = 0; demangled && i < argno; ++i)
612     demangled = demangled->u.s_binary.right;
613 
614   if (! demangled)
615     {
616       PyErr_Format (PyExc_RuntimeError, _("No argument %d in template."),
617 		    argno);
618       return NULL;
619     }
620 
621   argtype = typy_lookup_type (demangled->u.s_binary.left, block);
622   if (! argtype)
623     return NULL;
624 
625   return type_to_type_object (argtype);
626 }
627 
628 static PyObject *
629 typy_template_argument (PyObject *self, PyObject *args)
630 {
631   int argno;
632   struct type *type = ((type_object *) self)->type;
633   struct block *block = NULL;
634   PyObject *block_obj = NULL;
635   struct symbol *sym;
636   struct value *val = NULL;
637   volatile struct gdb_exception except;
638 
639   if (! PyArg_ParseTuple (args, "i|O", &argno, &block_obj))
640     return NULL;
641 
642   if (block_obj)
643     {
644       block = block_object_to_block (block_obj);
645       if (! block)
646 	{
647 	  PyErr_SetString (PyExc_RuntimeError,
648 			   _("Second argument must be block."));
649 	  return NULL;
650 	}
651     }
652 
653   TRY_CATCH (except, RETURN_MASK_ALL)
654     {
655       type = check_typedef (type);
656       if (TYPE_CODE (type) == TYPE_CODE_REF)
657 	type = check_typedef (TYPE_TARGET_TYPE (type));
658     }
659   GDB_PY_HANDLE_EXCEPTION (except);
660 
661   /* We might not have DW_TAG_template_*, so try to parse the type's
662      name.  This is inefficient if we do not have a template type --
663      but that is going to wind up as an error anyhow.  */
664   if (! TYPE_N_TEMPLATE_ARGUMENTS (type))
665     return typy_legacy_template_argument (type, block, argno);
666 
667   if (argno >= TYPE_N_TEMPLATE_ARGUMENTS (type))
668     {
669       PyErr_Format (PyExc_RuntimeError, _("No argument %d in template."),
670 		    argno);
671       return NULL;
672     }
673 
674   sym = TYPE_TEMPLATE_ARGUMENT (type, argno);
675   if (SYMBOL_CLASS (sym) == LOC_TYPEDEF)
676     return type_to_type_object (SYMBOL_TYPE (sym));
677   else if (SYMBOL_CLASS (sym) == LOC_OPTIMIZED_OUT)
678     {
679       PyErr_Format (PyExc_RuntimeError,
680 		    _("Template argument is optimized out"));
681       return NULL;
682     }
683 
684   TRY_CATCH (except, RETURN_MASK_ALL)
685     {
686       val = value_of_variable (sym, block);
687     }
688   GDB_PY_HANDLE_EXCEPTION (except);
689 
690   return value_to_value_object (val);
691 }
692 
693 static PyObject *
694 typy_str (PyObject *self)
695 {
696   volatile struct gdb_exception except;
697   char *thetype = NULL;
698   long length = 0;
699   PyObject *result;
700 
701   TRY_CATCH (except, RETURN_MASK_ALL)
702     {
703       struct cleanup *old_chain;
704       struct ui_file *stb;
705 
706       stb = mem_fileopen ();
707       old_chain = make_cleanup_ui_file_delete (stb);
708 
709       type_print (type_object_to_type (self), "", stb, -1);
710 
711       thetype = ui_file_xstrdup (stb, &length);
712       do_cleanups (old_chain);
713     }
714   if (except.reason < 0)
715     {
716       xfree (thetype);
717       GDB_PY_HANDLE_EXCEPTION (except);
718     }
719 
720   result = PyUnicode_Decode (thetype, length, host_charset (), NULL);
721   xfree (thetype);
722 
723   return result;
724 }
725 
726 /* An entry in the type-equality bcache.  */
727 
728 typedef struct type_equality_entry
729 {
730   struct type *type1, *type2;
731 } type_equality_entry_d;
732 
733 DEF_VEC_O (type_equality_entry_d);
734 
735 /* A helper function to compare two strings.  Returns 1 if they are
736    the same, 0 otherwise.  Handles NULLs properly.  */
737 
738 static int
739 compare_strings (const char *s, const char *t)
740 {
741   if (s == NULL && t != NULL)
742     return 0;
743   else if (s != NULL && t == NULL)
744     return 0;
745   else if (s == NULL && t== NULL)
746     return 1;
747   return strcmp (s, t) == 0;
748 }
749 
750 /* A helper function for typy_richcompare that checks two types for
751    "deep" equality.  Returns Py_EQ if the types are considered the
752    same, Py_NE otherwise.  */
753 
754 static int
755 check_types_equal (struct type *type1, struct type *type2,
756 		   VEC (type_equality_entry_d) **worklist)
757 {
758   CHECK_TYPEDEF (type1);
759   CHECK_TYPEDEF (type2);
760 
761   if (type1 == type2)
762     return Py_EQ;
763 
764   if (TYPE_CODE (type1) != TYPE_CODE (type2)
765       || TYPE_LENGTH (type1) != TYPE_LENGTH (type2)
766       || TYPE_UNSIGNED (type1) != TYPE_UNSIGNED (type2)
767       || TYPE_NOSIGN (type1) != TYPE_NOSIGN (type2)
768       || TYPE_VARARGS (type1) != TYPE_VARARGS (type2)
769       || TYPE_VECTOR (type1) != TYPE_VECTOR (type2)
770       || TYPE_NOTTEXT (type1) != TYPE_NOTTEXT (type2)
771       || TYPE_INSTANCE_FLAGS (type1) != TYPE_INSTANCE_FLAGS (type2)
772       || TYPE_NFIELDS (type1) != TYPE_NFIELDS (type2))
773     return Py_NE;
774 
775   if (!compare_strings (TYPE_TAG_NAME (type1), TYPE_TAG_NAME (type2)))
776     return Py_NE;
777   if (!compare_strings (TYPE_NAME (type1), TYPE_NAME (type2)))
778     return Py_NE;
779 
780   if (TYPE_CODE (type1) == TYPE_CODE_RANGE)
781     {
782       if (memcmp (TYPE_RANGE_DATA (type1), TYPE_RANGE_DATA (type2),
783 		  sizeof (*TYPE_RANGE_DATA (type1))) != 0)
784 	return Py_NE;
785     }
786   else
787     {
788       int i;
789 
790       for (i = 0; i < TYPE_NFIELDS (type1); ++i)
791 	{
792 	  const struct field *field1 = &TYPE_FIELD (type1, i);
793 	  const struct field *field2 = &TYPE_FIELD (type2, i);
794 	  struct type_equality_entry entry;
795 
796 	  if (FIELD_ARTIFICIAL (*field1) != FIELD_ARTIFICIAL (*field2)
797 	      || FIELD_BITSIZE (*field1) != FIELD_BITSIZE (*field2)
798 	      || FIELD_LOC_KIND (*field1) != FIELD_LOC_KIND (*field2))
799 	    return Py_NE;
800 	  if (!compare_strings (FIELD_NAME (*field1), FIELD_NAME (*field2)))
801 	    return Py_NE;
802 	  switch (FIELD_LOC_KIND (*field1))
803 	    {
804 	    case FIELD_LOC_KIND_BITPOS:
805 	      if (FIELD_BITPOS (*field1) != FIELD_BITPOS (*field2))
806 		return Py_NE;
807 	      break;
808 	    case FIELD_LOC_KIND_PHYSADDR:
809 	      if (FIELD_STATIC_PHYSADDR (*field1)
810 		  != FIELD_STATIC_PHYSADDR (*field2))
811 		return Py_NE;
812 	      break;
813 	    case FIELD_LOC_KIND_PHYSNAME:
814 	      if (!compare_strings (FIELD_STATIC_PHYSNAME (*field1),
815 				    FIELD_STATIC_PHYSNAME (*field2)))
816 		return Py_NE;
817 	      break;
818 	    }
819 
820 	  entry.type1 = FIELD_TYPE (*field1);
821 	  entry.type2 = FIELD_TYPE (*field2);
822 	  VEC_safe_push (type_equality_entry_d, *worklist, &entry);
823 	}
824     }
825 
826   if (TYPE_TARGET_TYPE (type1) != NULL)
827     {
828       struct type_equality_entry entry;
829       int added;
830 
831       if (TYPE_TARGET_TYPE (type2) == NULL)
832 	return Py_NE;
833 
834       entry.type1 = TYPE_TARGET_TYPE (type1);
835       entry.type2 = TYPE_TARGET_TYPE (type2);
836       VEC_safe_push (type_equality_entry_d, *worklist, &entry);
837     }
838   else if (TYPE_TARGET_TYPE (type2) != NULL)
839     return Py_NE;
840 
841   return Py_EQ;
842 }
843 
844 /* Check types on a worklist for equality.  Returns Py_NE if any pair
845    is not equal, Py_EQ if they are all considered equal.  */
846 
847 static int
848 check_types_worklist (VEC (type_equality_entry_d) **worklist,
849 		      struct bcache *cache)
850 {
851   while (!VEC_empty (type_equality_entry_d, *worklist))
852     {
853       struct type_equality_entry entry;
854       int added;
855 
856       entry = *VEC_last (type_equality_entry_d, *worklist);
857       VEC_pop (type_equality_entry_d, *worklist);
858 
859       /* If the type pair has already been visited, we know it is
860 	 ok.  */
861       bcache_full (&entry, sizeof (entry), cache, &added);
862       if (!added)
863 	continue;
864 
865       if (check_types_equal (entry.type1, entry.type2, worklist) == Py_NE)
866 	return Py_NE;
867     }
868 
869   return Py_EQ;
870 }
871 
872 /* Implement the richcompare method.  */
873 
874 static PyObject *
875 typy_richcompare (PyObject *self, PyObject *other, int op)
876 {
877   int result = Py_NE;
878   struct type *type1 = type_object_to_type (self);
879   struct type *type2 = type_object_to_type (other);
880   volatile struct gdb_exception except;
881 
882   /* We can only compare ourselves to another Type object, and only
883      for equality or inequality.  */
884   if (type2 == NULL || (op != Py_EQ && op != Py_NE))
885     {
886       Py_INCREF (Py_NotImplemented);
887       return Py_NotImplemented;
888     }
889 
890   if (type1 == type2)
891     result = Py_EQ;
892   else
893     {
894       struct bcache *cache;
895       VEC (type_equality_entry_d) *worklist = NULL;
896       struct type_equality_entry entry;
897 
898       cache = bcache_xmalloc (NULL, NULL);
899 
900       entry.type1 = type1;
901       entry.type2 = type2;
902       VEC_safe_push (type_equality_entry_d, worklist, &entry);
903 
904       TRY_CATCH (except, RETURN_MASK_ALL)
905 	{
906 	  result = check_types_worklist (&worklist, cache);
907 	}
908       if (except.reason < 0)
909 	result = Py_NE;
910 
911       bcache_xfree (cache);
912       VEC_free (type_equality_entry_d, worklist);
913     }
914 
915   if (op == result)
916     Py_RETURN_TRUE;
917   Py_RETURN_FALSE;
918 }
919 
920 
921 
922 static const struct objfile_data *typy_objfile_data_key;
923 
924 static void
925 save_objfile_types (struct objfile *objfile, void *datum)
926 {
927   type_object *obj = datum;
928   htab_t copied_types;
929   struct cleanup *cleanup;
930 
931   /* This prevents another thread from freeing the objects we're
932      operating on.  */
933   cleanup = ensure_python_env (get_objfile_arch (objfile), current_language);
934 
935   copied_types = create_copied_types_hash (objfile);
936 
937   while (obj)
938     {
939       type_object *next = obj->next;
940 
941       htab_empty (copied_types);
942 
943       obj->type = copy_type_recursive (objfile, obj->type, copied_types);
944 
945       obj->next = NULL;
946       obj->prev = NULL;
947 
948       obj = next;
949     }
950 
951   htab_delete (copied_types);
952 
953   do_cleanups (cleanup);
954 }
955 
956 static void
957 set_type (type_object *obj, struct type *type)
958 {
959   obj->type = type;
960   obj->prev = NULL;
961   if (type && TYPE_OBJFILE (type))
962     {
963       struct objfile *objfile = TYPE_OBJFILE (type);
964 
965       obj->next = objfile_data (objfile, typy_objfile_data_key);
966       if (obj->next)
967 	obj->next->prev = obj;
968       set_objfile_data (objfile, typy_objfile_data_key, obj);
969     }
970   else
971     obj->next = NULL;
972 }
973 
974 static void
975 typy_dealloc (PyObject *obj)
976 {
977   type_object *type = (type_object *) obj;
978 
979   if (type->prev)
980     type->prev->next = type->next;
981   else if (type->type && TYPE_OBJFILE (type->type))
982     {
983       /* Must reset head of list.  */
984       struct objfile *objfile = TYPE_OBJFILE (type->type);
985 
986       if (objfile)
987 	set_objfile_data (objfile, typy_objfile_data_key, type->next);
988     }
989   if (type->next)
990     type->next->prev = type->prev;
991 
992   type->ob_type->tp_free (type);
993 }
994 
995 /* Create a new Type referring to TYPE.  */
996 PyObject *
997 type_to_type_object (struct type *type)
998 {
999   type_object *type_obj;
1000 
1001   type_obj = PyObject_New (type_object, &type_object_type);
1002   if (type_obj)
1003     set_type (type_obj, type);
1004 
1005   return (PyObject *) type_obj;
1006 }
1007 
1008 struct type *
1009 type_object_to_type (PyObject *obj)
1010 {
1011   if (! PyObject_TypeCheck (obj, &type_object_type))
1012     return NULL;
1013   return ((type_object *) obj)->type;
1014 }
1015 
1016 
1017 
1018 /* Implementation of gdb.lookup_type.  */
1019 PyObject *
1020 gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw)
1021 {
1022   static char *keywords[] = { "name", "block", NULL };
1023   char *type_name = NULL;
1024   struct type *type = NULL;
1025   PyObject *block_obj = NULL;
1026   struct block *block = NULL;
1027 
1028   if (! PyArg_ParseTupleAndKeywords (args, kw, "s|O", keywords,
1029 				     &type_name, &block_obj))
1030     return NULL;
1031 
1032   if (block_obj)
1033     {
1034       block = block_object_to_block (block_obj);
1035       if (! block)
1036 	{
1037 	  PyErr_SetString (PyExc_RuntimeError,
1038 			   _("'block' argument must be a Block."));
1039 	  return NULL;
1040 	}
1041     }
1042 
1043   type = typy_lookup_typename (type_name, block);
1044   if (! type)
1045     return NULL;
1046 
1047   return (PyObject *) type_to_type_object (type);
1048 }
1049 
1050 void
1051 gdbpy_initialize_types (void)
1052 {
1053   int i;
1054 
1055   typy_objfile_data_key
1056     = register_objfile_data_with_cleanup (save_objfile_types, NULL);
1057 
1058   if (PyType_Ready (&type_object_type) < 0)
1059     return;
1060   if (PyType_Ready (&field_object_type) < 0)
1061     return;
1062 
1063   for (i = 0; pyty_codes[i].name; ++i)
1064     {
1065       if (PyModule_AddIntConstant (gdb_module,
1066 				   /* Cast needed for Python 2.4.  */
1067 				   (char *) pyty_codes[i].name,
1068 				   pyty_codes[i].code) < 0)
1069 	return;
1070     }
1071 
1072   Py_INCREF (&type_object_type);
1073   PyModule_AddObject (gdb_module, "Type", (PyObject *) &type_object_type);
1074 
1075   Py_INCREF (&field_object_type);
1076   PyModule_AddObject (gdb_module, "Field", (PyObject *) &field_object_type);
1077 }
1078 
1079 
1080 
1081 static PyGetSetDef type_object_getset[] =
1082 {
1083   { "code", typy_get_code, NULL,
1084     "The code for this type.", NULL },
1085   { "sizeof", typy_get_sizeof, NULL,
1086     "The size of this type, in bytes.", NULL },
1087   { "tag", typy_get_tag, NULL,
1088     "The tag name for this type, or None.", NULL },
1089   { NULL }
1090 };
1091 
1092 static PyMethodDef type_object_methods[] =
1093 {
1094   { "array", typy_array, METH_VARARGS,
1095     "array (N) -> Type\n\
1096 Return a type which represents an array of N objects of this type." },
1097   { "const", typy_const, METH_NOARGS,
1098     "const () -> Type\n\
1099 Return a const variant of this type." },
1100   { "fields", typy_fields, METH_NOARGS,
1101     "field () -> list\n\
1102 Return a sequence holding all the fields of this type.\n\
1103 Each field is a dictionary." },
1104   { "pointer", typy_pointer, METH_NOARGS,
1105     "pointer () -> Type\n\
1106 Return a type of pointer to this type." },
1107   { "range", typy_range, METH_NOARGS,
1108     "range () -> tuple\n\
1109 Return a tuple containing the lower and upper range for this type."},
1110   { "reference", typy_reference, METH_NOARGS,
1111     "reference () -> Type\n\
1112 Return a type of reference to this type." },
1113   { "strip_typedefs", typy_strip_typedefs, METH_NOARGS,
1114     "strip_typedefs () -> Type\n\
1115 Return a type formed by stripping this type of all typedefs."},
1116   { "target", typy_target, METH_NOARGS,
1117     "target () -> Type\n\
1118 Return the target type of this type." },
1119   { "template_argument", typy_template_argument, METH_VARARGS,
1120     "template_argument (arg, [block]) -> Type\n\
1121 Return the type of a template argument." },
1122   { "unqualified", typy_unqualified, METH_NOARGS,
1123     "unqualified () -> Type\n\
1124 Return a variant of this type without const or volatile attributes." },
1125   { "volatile", typy_volatile, METH_NOARGS,
1126     "volatile () -> Type\n\
1127 Return a volatile variant of this type" },
1128   { NULL }
1129 };
1130 
1131 static PyTypeObject type_object_type =
1132 {
1133   PyObject_HEAD_INIT (NULL)
1134   0,				  /*ob_size*/
1135   "gdb.Type",			  /*tp_name*/
1136   sizeof (type_object),		  /*tp_basicsize*/
1137   0,				  /*tp_itemsize*/
1138   typy_dealloc,			  /*tp_dealloc*/
1139   0,				  /*tp_print*/
1140   0,				  /*tp_getattr*/
1141   0,				  /*tp_setattr*/
1142   0,				  /*tp_compare*/
1143   0,				  /*tp_repr*/
1144   0,				  /*tp_as_number*/
1145   0,				  /*tp_as_sequence*/
1146   0,				  /*tp_as_mapping*/
1147   0,				  /*tp_hash */
1148   0,				  /*tp_call*/
1149   typy_str,			  /*tp_str*/
1150   0,				  /*tp_getattro*/
1151   0,				  /*tp_setattro*/
1152   0,				  /*tp_as_buffer*/
1153   Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER,  /*tp_flags*/
1154   "GDB type object",		  /* tp_doc */
1155   0,				  /* tp_traverse */
1156   0,				  /* tp_clear */
1157   typy_richcompare,		  /* tp_richcompare */
1158   0,				  /* tp_weaklistoffset */
1159   0,				  /* tp_iter */
1160   0,				  /* tp_iternext */
1161   type_object_methods,		  /* tp_methods */
1162   0,				  /* tp_members */
1163   type_object_getset,		  /* tp_getset */
1164   0,				  /* tp_base */
1165   0,				  /* tp_dict */
1166   0,				  /* tp_descr_get */
1167   0,				  /* tp_descr_set */
1168   0,				  /* tp_dictoffset */
1169   0,				  /* tp_init */
1170   0,				  /* tp_alloc */
1171   0,				  /* tp_new */
1172 };
1173 
1174 static PyTypeObject field_object_type =
1175 {
1176   PyObject_HEAD_INIT (NULL)
1177   0,				  /*ob_size*/
1178   "gdb.Field",			  /*tp_name*/
1179   sizeof (field_object),	  /*tp_basicsize*/
1180   0,				  /*tp_itemsize*/
1181   field_dealloc,		  /*tp_dealloc*/
1182   0,				  /*tp_print*/
1183   0,				  /*tp_getattr*/
1184   0,				  /*tp_setattr*/
1185   0,				  /*tp_compare*/
1186   0,				  /*tp_repr*/
1187   0,				  /*tp_as_number*/
1188   0,				  /*tp_as_sequence*/
1189   0,				  /*tp_as_mapping*/
1190   0,				  /*tp_hash */
1191   0,				  /*tp_call*/
1192   0,				  /*tp_str*/
1193   0,				  /*tp_getattro*/
1194   0,				  /*tp_setattro*/
1195   0,				  /*tp_as_buffer*/
1196   Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER,  /*tp_flags*/
1197   "GDB field object",		  /* tp_doc */
1198   0,				  /* tp_traverse */
1199   0,				  /* tp_clear */
1200   0,				  /* tp_richcompare */
1201   0,				  /* tp_weaklistoffset */
1202   0,				  /* tp_iter */
1203   0,				  /* tp_iternext */
1204   0,				  /* tp_methods */
1205   0,				  /* tp_members */
1206   0,				  /* tp_getset */
1207   0,				  /* tp_base */
1208   0,				  /* tp_dict */
1209   0,				  /* tp_descr_get */
1210   0,				  /* tp_descr_set */
1211   offsetof (field_object, dict),  /* tp_dictoffset */
1212   0,				  /* tp_init */
1213   0,				  /* tp_alloc */
1214   0,				  /* tp_new */
1215 };
1216