Fix step-over-{trips-on-watchpoint|lands-on-breakpoint}.exp race
[deliverable/binutils-gdb.git] / gdb / python / py-type.c
index 1f4e72c71ca86ee2a07be2fd70a422c71d4743c2..e202c83732dc9038ca167aebdc0e1793ea004c8f 100644 (file)
@@ -1,6 +1,6 @@
 /* Python interface to types.
 
-   Copyright (C) 2008-2012 Free Software Foundation, Inc.
+   Copyright (C) 2008-2015 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -19,7 +19,6 @@
 
 #include "defs.h"
 #include "value.h"
-#include "exceptions.h"
 #include "python-internal.h"
 #include "charset.h"
 #include "gdbtypes.h"
@@ -28,8 +27,6 @@
 #include "objfiles.h"
 #include "language.h"
 #include "vec.h"
-#include "bcache.h"
-#include "dwarf2loc.h"
 #include "typeprint.h"
 
 typedef struct pyty_type_object
@@ -44,7 +41,8 @@ typedef struct pyty_type_object
   struct pyty_type_object *next;
 } type_object;
 
-static PyTypeObject type_object_type;
+extern PyTypeObject type_object_type
+    CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("type_object");
 
 /* A Field object.  */
 typedef struct pyty_field_object
@@ -55,7 +53,8 @@ typedef struct pyty_field_object
   PyObject *dict;
 } field_object;
 
-static PyTypeObject field_object_type;
+extern PyTypeObject field_object_type
+    CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("field_object");
 
 /* A type iterator object.  */
 typedef struct {
@@ -68,7 +67,8 @@ typedef struct {
   struct pyty_type_object *source;
 } typy_iterator_object;
 
-static PyTypeObject type_iterator_object_type;
+extern PyTypeObject type_iterator_object_type
+    CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("typy_iterator_object");
 
 /* This is used to initialize various gdb.TYPE_ constants.  */
 struct pyty_code
@@ -123,7 +123,7 @@ field_dealloc (PyObject *obj)
   field_object *f = (field_object *) obj;
 
   Py_XDECREF (f->dict);
-  f->ob_type->tp_free (obj);
+  Py_TYPE (obj)->tp_free (obj);
 }
 
 static PyObject *
@@ -145,6 +145,14 @@ field_new (void)
 
 \f
 
+/* Return true if OBJ is of type gdb.Field, false otherwise.  */
+
+int
+gdbpy_is_field (PyObject *obj)
+{
+  return PyObject_TypeCheck (obj, &field_object_type);
+}
+
 /* Return the code for this type.  */
 static PyObject *
 typy_get_code (PyObject *self, void *closure)
@@ -166,6 +174,13 @@ convert_field (struct type *type, int field)
   if (!result)
     return NULL;
 
+  arg = type_to_type_object (type);
+  if (arg == NULL)
+    goto fail;
+  if (PyObject_SetAttrString (result, "parent_type", arg) < 0)
+    goto failarg;
+  Py_DECREF (arg);
+
   if (!field_is_static (&TYPE_FIELD (type, field)))
     {
       const char *attrstring;
@@ -190,15 +205,23 @@ convert_field (struct type *type, int field)
       Py_DECREF (arg);
     }
 
+  arg = NULL;
   if (TYPE_FIELD_NAME (type, field))
-    arg = PyString_FromString (TYPE_FIELD_NAME (type, field));
-  else
+    {
+      const char *field_name = TYPE_FIELD_NAME (type, field);
+
+      if (field_name[0] != '\0')
+       {
+         arg = PyString_FromString (TYPE_FIELD_NAME (type, field));
+         if (arg == NULL)
+           goto fail;
+       }
+    }
+  if (arg == NULL)
     {
       arg = Py_None;
       Py_INCREF (arg);
     }
-  if (!arg)
-    goto fail;
   if (PyObject_SetAttrString (result, "name", arg) < 0)
     goto failarg;
   Py_DECREF (arg);
@@ -209,7 +232,7 @@ convert_field (struct type *type, int field)
     goto failarg;
   Py_DECREF (arg);
 
-  if (TYPE_CODE (type) == TYPE_CODE_CLASS)
+  if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
     arg = field < TYPE_N_BASECLASSES (type) ? Py_True : Py_False;
   else
     arg = Py_False;
@@ -298,9 +321,11 @@ make_fielditem (struct type *type, int i, enum gdbpy_iter_kind kind)
     case iter_values:
       item =  convert_field (type, i);
       break;
+    default:
+      gdb_assert_not_reached ("invalid gdbpy_iter_kind");
     }
   return item;
-  
+
  fail:
   Py_XDECREF (key);
   Py_XDECREF (value);
@@ -316,15 +341,18 @@ typy_fields_items (PyObject *self, enum gdbpy_iter_kind kind)
 {
   PyObject *py_type = self;
   PyObject *result = NULL, *iter = NULL;
-  volatile struct gdb_exception except;
   struct type *type = ((type_object *) py_type)->type;
   struct type *checked_type = type;
 
-  TRY_CATCH (except, RETURN_MASK_ALL)
+  TRY
     {
-      CHECK_TYPEDEF (checked_type);
+      checked_type = check_typedef (checked_type);
+    }
+  CATCH (except, RETURN_MASK_ALL)
+    {
+      GDB_PY_HANDLE_EXCEPTION (except);
     }
-  GDB_PY_HANDLE_EXCEPTION (except);
+  END_CATCH
 
   if (checked_type != type)
     py_type = type_to_type_object (checked_type);
@@ -353,7 +381,7 @@ typy_values (PyObject *self, PyObject *args)
 }
 
 /* Return a sequence of all fields.  Each field is a gdb.Field object.
-   This method is similar to typy_values, except where the supplied 
+   This method is similar to typy_values, except where the supplied
    gdb.Type is an array, in which case it returns a list of one entry
    which is a gdb.Field object for a range (the array bounds).  */
 
@@ -362,7 +390,7 @@ typy_fields (PyObject *self, PyObject *args)
 {
   struct type *type = ((type_object *) self)->type;
   PyObject *r, *rl;
-  
+
   if (TYPE_CODE (type) != TYPE_CODE_ARRAY)
     return typy_fields_items (self, iter_values);
 
@@ -372,12 +400,9 @@ typy_fields (PyObject *self, PyObject *args)
   r = convert_field (type, 0);
   if (r == NULL)
     return NULL;
-  
+
   rl = Py_BuildValue ("[O]", r);
-  if (rl == NULL)
-    {
-      Py_DECREF (r);
-    }
+  Py_DECREF (r);
 
   return rl;
 }
@@ -390,7 +415,7 @@ typy_field_names (PyObject *self, PyObject *args)
   return typy_fields_items (self, iter_keys);
 }
 
-/* Return a sequence of all (name, fields) pairs.  Each field is a 
+/* Return a sequence of all (name, fields) pairs.  Each field is a
    gdb.Field object.  */
 
 static PyObject *
@@ -399,6 +424,18 @@ typy_items (PyObject *self, PyObject *args)
   return typy_fields_items (self, iter_items);
 }
 
+/* Return the type's name, or None.  */
+
+static PyObject *
+typy_get_name (PyObject *self, void *closure)
+{
+  struct type *type = ((type_object *) self)->type;
+
+  if (TYPE_NAME (type) == NULL)
+    Py_RETURN_NONE;
+  return PyString_FromString (TYPE_NAME (type));
+}
+
 /* Return the type's tag, or None.  */
 static PyObject *
 typy_get_tag (PyObject *self, void *closure)
@@ -415,15 +452,18 @@ static PyObject *
 typy_strip_typedefs (PyObject *self, PyObject *args)
 {
   struct type *type = ((type_object *) self)->type;
-  volatile struct gdb_exception except;
 
-  TRY_CATCH (except, RETURN_MASK_ALL)
+  TRY
     {
       type = check_typedef (type);
     }
-  GDB_PY_HANDLE_EXCEPTION (except);
+  CATCH (except, RETURN_MASK_ALL)
+    {
+      GDB_PY_HANDLE_EXCEPTION (except);
+    }
+  END_CATCH
 
-  return type_to_type_object (check_typedef (type));
+  return type_to_type_object (type);
 }
 
 /* Strip typedefs and pointers/reference from a type.  Then check that
@@ -432,21 +472,18 @@ typy_strip_typedefs (PyObject *self, PyObject *args)
 static struct type *
 typy_get_composite (struct type *type)
 {
-  volatile struct gdb_exception except;
 
   for (;;)
     {
-      TRY_CATCH (except, RETURN_MASK_ALL)
+      TRY
        {
-         CHECK_TYPEDEF (type);
+         type = check_typedef (type);
        }
-      /* Don't use GDB_PY_HANDLE_EXCEPTION here because that returns
-        a (NULL) pointer of the wrong type.  */
-      if (except.reason < 0)
+      CATCH (except, RETURN_MASK_ALL)
        {
-         gdbpy_convert_exception (except);
-         return NULL;
+         GDB_PY_HANDLE_EXCEPTION (except);
        }
+      END_CATCH
 
       if (TYPE_CODE (type) != TYPE_CODE_PTR
          && TYPE_CODE (type) != TYPE_CODE_REF)
@@ -456,7 +493,7 @@ typy_get_composite (struct type *type)
 
   /* If this is not a struct, union, or enum type, raise TypeError
      exception.  */
-  if (TYPE_CODE (type) != TYPE_CODE_STRUCT 
+  if (TYPE_CODE (type) != TYPE_CODE_STRUCT
       && TYPE_CODE (type) != TYPE_CODE_UNION
       && TYPE_CODE (type) != TYPE_CODE_ENUM)
     {
@@ -464,7 +501,7 @@ typy_get_composite (struct type *type)
                       "Type is not a structure, union, or enum type.");
       return NULL;
     }
-  
+
   return type;
 }
 
@@ -477,7 +514,6 @@ typy_array_1 (PyObject *self, PyObject *args, int is_vector)
   PyObject *n2_obj = NULL;
   struct type *array = NULL;
   struct type *type = ((type_object *) self)->type;
-  volatile struct gdb_exception except;
 
   if (! PyArg_ParseTuple (args, "l|O", &n1, &n2_obj))
     return NULL;
@@ -500,20 +536,24 @@ typy_array_1 (PyObject *self, PyObject *args, int is_vector)
       n1 = 0;
     }
 
-  if (n2 < n1)
+  if (n2 < n1 - 1) /* Note: An empty array has n2 == n1 - 1.  */
     {
       PyErr_SetString (PyExc_ValueError,
                       _("Array length must not be negative"));
       return NULL;
     }
 
-  TRY_CATCH (except, RETURN_MASK_ALL)
+  TRY
     {
       array = lookup_array_range_type (type, n1, n2);
       if (is_vector)
        make_vector_type (array);
     }
-  GDB_PY_HANDLE_EXCEPTION (except);
+  CATCH (except, RETURN_MASK_ALL)
+    {
+      GDB_PY_HANDLE_EXCEPTION (except);
+    }
+  END_CATCH
 
   return type_to_type_object (array);
 }
@@ -539,13 +579,16 @@ static PyObject *
 typy_pointer (PyObject *self, PyObject *args)
 {
   struct type *type = ((type_object *) self)->type;
-  volatile struct gdb_exception except;
 
-  TRY_CATCH (except, RETURN_MASK_ALL)
+  TRY
     {
       type = lookup_pointer_type (type);
     }
-  GDB_PY_HANDLE_EXCEPTION (except);
+  CATCH (except, RETURN_MASK_ALL)
+    {
+      GDB_PY_HANDLE_EXCEPTION (except);
+    }
+  END_CATCH
 
   return type_to_type_object (type);
 }
@@ -608,7 +651,7 @@ typy_range (PyObject *self, PyObject *args)
       return NULL;
     }
   return result;
-  
+
  failarg:
   Py_XDECREF (high_bound);
   Py_XDECREF (low_bound);
@@ -620,13 +663,16 @@ static PyObject *
 typy_reference (PyObject *self, PyObject *args)
 {
   struct type *type = ((type_object *) self)->type;
-  volatile struct gdb_exception except;
 
-  TRY_CATCH (except, RETURN_MASK_ALL)
+  TRY
     {
       type = lookup_reference_type (type);
     }
-  GDB_PY_HANDLE_EXCEPTION (except);
+  CATCH (except, RETURN_MASK_ALL)
+    {
+      GDB_PY_HANDLE_EXCEPTION (except);
+    }
+  END_CATCH
 
   return type_to_type_object (type);
 }
@@ -639,7 +685,7 @@ typy_target (PyObject *self, PyObject *args)
 
   if (!TYPE_TARGET_TYPE (type))
     {
-      PyErr_SetString (PyExc_RuntimeError, 
+      PyErr_SetString (PyExc_RuntimeError,
                       _("Type does not have a target."));
       return NULL;
     }
@@ -652,13 +698,16 @@ static PyObject *
 typy_const (PyObject *self, PyObject *args)
 {
   struct type *type = ((type_object *) self)->type;
-  volatile struct gdb_exception except;
 
-  TRY_CATCH (except, RETURN_MASK_ALL)
+  TRY
     {
       type = make_cv_type (1, 0, type, NULL);
     }
-  GDB_PY_HANDLE_EXCEPTION (except);
+  CATCH (except, RETURN_MASK_ALL)
+    {
+      GDB_PY_HANDLE_EXCEPTION (except);
+    }
+  END_CATCH
 
   return type_to_type_object (type);
 }
@@ -668,13 +717,16 @@ static PyObject *
 typy_volatile (PyObject *self, PyObject *args)
 {
   struct type *type = ((type_object *) self)->type;
-  volatile struct gdb_exception except;
 
-  TRY_CATCH (except, RETURN_MASK_ALL)
+  TRY
     {
       type = make_cv_type (0, 1, type, NULL);
     }
-  GDB_PY_HANDLE_EXCEPTION (except);
+  CATCH (except, RETURN_MASK_ALL)
+    {
+      GDB_PY_HANDLE_EXCEPTION (except);
+    }
+  END_CATCH
 
   return type_to_type_object (type);
 }
@@ -684,13 +736,16 @@ static PyObject *
 typy_unqualified (PyObject *self, PyObject *args)
 {
   struct type *type = ((type_object *) self)->type;
-  volatile struct gdb_exception except;
 
-  TRY_CATCH (except, RETURN_MASK_ALL)
+  TRY
     {
       type = make_cv_type (0, 0, type, NULL);
     }
-  GDB_PY_HANDLE_EXCEPTION (except);
+  CATCH (except, RETURN_MASK_ALL)
+    {
+      GDB_PY_HANDLE_EXCEPTION (except);
+    }
+  END_CATCH
 
   return type_to_type_object (type);
 }
@@ -700,12 +755,16 @@ static PyObject *
 typy_get_sizeof (PyObject *self, void *closure)
 {
   struct type *type = ((type_object *) self)->type;
-  volatile struct gdb_exception except;
 
-  TRY_CATCH (except, RETURN_MASK_ALL)
+  TRY
     {
       check_typedef (type);
     }
+  CATCH (except, RETURN_MASK_ALL)
+    {
+    }
+  END_CATCH
+
   /* Ignore exceptions.  */
 
   return gdb_py_long_from_longest (TYPE_LENGTH (type));
@@ -715,25 +774,24 @@ static struct type *
 typy_lookup_typename (const char *type_name, const struct block *block)
 {
   struct type *type = NULL;
-  volatile struct gdb_exception except;
 
-  TRY_CATCH (except, RETURN_MASK_ALL)
+  TRY
     {
-      if (!strncmp (type_name, "struct ", 7))
+      if (startswith (type_name, "struct "))
        type = lookup_struct (type_name + 7, NULL);
-      else if (!strncmp (type_name, "union ", 6))
+      else if (startswith (type_name, "union "))
        type = lookup_union (type_name + 6, NULL);
-      else if (!strncmp (type_name, "enum ", 5))
+      else if (startswith (type_name, "enum "))
        type = lookup_enum (type_name + 5, NULL);
       else
        type = lookup_typename (python_language, python_gdbarch,
                                type_name, block, 0);
     }
-  if (except.reason < 0)
+  CATCH (except, RETURN_MASK_ALL)
     {
-      gdbpy_convert_exception (except);
-      return NULL;
+      GDB_PY_HANDLE_EXCEPTION (except);
     }
+  END_CATCH
 
   return type;
 }
@@ -745,7 +803,6 @@ typy_lookup_type (struct demangle_component *demangled,
   struct type *type, *rtype = NULL;
   char *type_name = NULL;
   enum demangle_component_type demangled_type;
-  volatile struct gdb_exception except;
 
   /* Save the type: typy_lookup_type() may (indirectly) overwrite
      memory pointed by demangled.  */
@@ -760,7 +817,7 @@ typy_lookup_type (struct demangle_component *demangled,
       if (! type)
        return NULL;
 
-      TRY_CATCH (except, RETURN_MASK_ALL)
+      TRY
        {
          /* If the demangled_type matches with one of the types
             below, run the corresponding function and save the type
@@ -782,18 +839,18 @@ typy_lookup_type (struct demangle_component *demangled,
              break;
            }
        }
-      if (except.reason < 0)
+      CATCH (except, RETURN_MASK_ALL)
        {
-         gdbpy_convert_exception (except);
-         return NULL;
+         GDB_PY_HANDLE_EXCEPTION (except);
        }
+      END_CATCH
     }
-  
+
   /* If we have a type from the switch statement above, just return
      that.  */
   if (rtype)
     return rtype;
-  
+
   /* We don't have a type, so lookup the type.  */
   type_name = cp_comp_to_string (demangled, 10);
   type = typy_lookup_typename (type_name, block);
@@ -817,7 +874,6 @@ typy_legacy_template_argument (struct type *type, const struct block *block,
   const char *err;
   struct type *argtype;
   struct cleanup *cleanup;
-  volatile struct gdb_exception except;
 
   if (TYPE_NAME (type) == NULL)
     {
@@ -825,12 +881,16 @@ typy_legacy_template_argument (struct type *type, const struct block *block,
       return NULL;
     }
 
-  TRY_CATCH (except, RETURN_MASK_ALL)
+  TRY
     {
       /* Note -- this is not thread-safe.  */
       info = cp_demangled_name_to_comp (TYPE_NAME (type), &err);
     }
-  GDB_PY_HANDLE_EXCEPTION (except);
+  CATCH (except, RETURN_MASK_ALL)
+    {
+      GDB_PY_HANDLE_EXCEPTION (except);
+    }
+  END_CATCH
 
   if (! info)
     {
@@ -883,7 +943,6 @@ typy_template_argument (PyObject *self, PyObject *args)
   PyObject *block_obj = NULL;
   struct symbol *sym;
   struct value *val = NULL;
-  volatile struct gdb_exception except;
 
   if (! PyArg_ParseTuple (args, "i|O", &argno, &block_obj))
     return NULL;
@@ -899,13 +958,17 @@ typy_template_argument (PyObject *self, PyObject *args)
        }
     }
 
-  TRY_CATCH (except, RETURN_MASK_ALL)
+  TRY
     {
       type = check_typedef (type);
       if (TYPE_CODE (type) == TYPE_CODE_REF)
        type = check_typedef (TYPE_TARGET_TYPE (type));
     }
-  GDB_PY_HANDLE_EXCEPTION (except);
+  CATCH (except, RETURN_MASK_ALL)
+    {
+      GDB_PY_HANDLE_EXCEPTION (except);
+    }
+  END_CATCH
 
   /* We might not have DW_TAG_template_*, so try to parse the type's
      name.  This is inefficient if we do not have a template type --
@@ -930,11 +993,15 @@ typy_template_argument (PyObject *self, PyObject *args)
       return NULL;
     }
 
-  TRY_CATCH (except, RETURN_MASK_ALL)
+  TRY
     {
       val = value_of_variable (sym, block);
     }
-  GDB_PY_HANDLE_EXCEPTION (except);
+  CATCH (except, RETURN_MASK_ALL)
+    {
+      GDB_PY_HANDLE_EXCEPTION (except);
+    }
+  END_CATCH
 
   return value_to_value_object (val);
 }
@@ -942,12 +1009,11 @@ typy_template_argument (PyObject *self, PyObject *args)
 static PyObject *
 typy_str (PyObject *self)
 {
-  volatile struct gdb_exception except;
   char *thetype = NULL;
   long length = 0;
   PyObject *result;
 
-  TRY_CATCH (except, RETURN_MASK_ALL)
+  TRY
     {
       struct cleanup *old_chain;
       struct ui_file *stb;
@@ -961,11 +1027,12 @@ typy_str (PyObject *self)
       thetype = ui_file_xstrdup (stb, &length);
       do_cleanups (old_chain);
     }
-  if (except.reason < 0)
+  CATCH (except, RETURN_MASK_ALL)
     {
       xfree (thetype);
       GDB_PY_HANDLE_EXCEPTION (except);
     }
+  END_CATCH
 
   result = PyUnicode_Decode (thetype, length, host_charset (), NULL);
   xfree (thetype);
@@ -973,173 +1040,6 @@ typy_str (PyObject *self)
   return result;
 }
 
-/* An entry in the type-equality bcache.  */
-
-typedef struct type_equality_entry
-{
-  struct type *type1, *type2;
-} type_equality_entry_d;
-
-DEF_VEC_O (type_equality_entry_d);
-
-/* A helper function to compare two strings.  Returns 1 if they are
-   the same, 0 otherwise.  Handles NULLs properly.  */
-
-static int
-compare_maybe_null_strings (const char *s, const char *t)
-{
-  if (s == NULL && t != NULL)
-    return 0;
-  else if (s != NULL && t == NULL)
-    return 0;
-  else if (s == NULL && t== NULL)
-    return 1;
-  return strcmp (s, t) == 0;
-}
-
-/* A helper function for typy_richcompare that checks two types for
-   "deep" equality.  Returns Py_EQ if the types are considered the
-   same, Py_NE otherwise.  */
-
-static int
-check_types_equal (struct type *type1, struct type *type2,
-                  VEC (type_equality_entry_d) **worklist)
-{
-  CHECK_TYPEDEF (type1);
-  CHECK_TYPEDEF (type2);
-
-  if (type1 == type2)
-    return Py_EQ;
-
-  if (TYPE_CODE (type1) != TYPE_CODE (type2)
-      || TYPE_LENGTH (type1) != TYPE_LENGTH (type2)
-      || TYPE_UNSIGNED (type1) != TYPE_UNSIGNED (type2)
-      || TYPE_NOSIGN (type1) != TYPE_NOSIGN (type2)
-      || TYPE_VARARGS (type1) != TYPE_VARARGS (type2)
-      || TYPE_VECTOR (type1) != TYPE_VECTOR (type2)
-      || TYPE_NOTTEXT (type1) != TYPE_NOTTEXT (type2)
-      || TYPE_INSTANCE_FLAGS (type1) != TYPE_INSTANCE_FLAGS (type2)
-      || TYPE_NFIELDS (type1) != TYPE_NFIELDS (type2))
-    return Py_NE;
-
-  if (!compare_maybe_null_strings (TYPE_TAG_NAME (type1),
-                                  TYPE_TAG_NAME (type2)))
-    return Py_NE;
-  if (!compare_maybe_null_strings (TYPE_NAME (type1), TYPE_NAME (type2)))
-    return Py_NE;
-
-  if (TYPE_CODE (type1) == TYPE_CODE_RANGE)
-    {
-      if (memcmp (TYPE_RANGE_DATA (type1), TYPE_RANGE_DATA (type2),
-                 sizeof (*TYPE_RANGE_DATA (type1))) != 0)
-       return Py_NE;
-    }
-  else
-    {
-      int i;
-
-      for (i = 0; i < TYPE_NFIELDS (type1); ++i)
-       {
-         const struct field *field1 = &TYPE_FIELD (type1, i);
-         const struct field *field2 = &TYPE_FIELD (type2, i);
-         struct type_equality_entry entry;
-
-         if (FIELD_ARTIFICIAL (*field1) != FIELD_ARTIFICIAL (*field2)
-             || FIELD_BITSIZE (*field1) != FIELD_BITSIZE (*field2)
-             || FIELD_LOC_KIND (*field1) != FIELD_LOC_KIND (*field2))
-           return Py_NE;
-         if (!compare_maybe_null_strings (FIELD_NAME (*field1),
-                                          FIELD_NAME (*field2)))
-           return Py_NE;
-         switch (FIELD_LOC_KIND (*field1))
-           {
-           case FIELD_LOC_KIND_BITPOS:
-             if (FIELD_BITPOS (*field1) != FIELD_BITPOS (*field2))
-               return Py_NE;
-             break;
-           case FIELD_LOC_KIND_ENUMVAL:
-             if (FIELD_ENUMVAL (*field1) != FIELD_ENUMVAL (*field2))
-               return Py_NE;
-             break;
-           case FIELD_LOC_KIND_PHYSADDR:
-             if (FIELD_STATIC_PHYSADDR (*field1)
-                 != FIELD_STATIC_PHYSADDR (*field2))
-               return Py_NE;
-             break;
-           case FIELD_LOC_KIND_PHYSNAME:
-             if (!compare_maybe_null_strings (FIELD_STATIC_PHYSNAME (*field1),
-                                              FIELD_STATIC_PHYSNAME (*field2)))
-               return Py_NE;
-             break;
-           case FIELD_LOC_KIND_DWARF_BLOCK:
-             {
-               struct dwarf2_locexpr_baton *block1, *block2;
-
-               block1 = FIELD_DWARF_BLOCK (*field1);
-               block2 = FIELD_DWARF_BLOCK (*field2);
-               if (block1->per_cu != block2->per_cu
-                   || block1->size != block2->size
-                   || memcmp (block1->data, block2->data, block1->size) != 0)
-               return Py_NE;
-             }
-             break;
-           default:
-             internal_error (__FILE__, __LINE__, _("Unsupported field kind "
-                                                   "%d by check_types_equal"),
-                             FIELD_LOC_KIND (*field1));
-           }
-
-         entry.type1 = FIELD_TYPE (*field1);
-         entry.type2 = FIELD_TYPE (*field2);
-         VEC_safe_push (type_equality_entry_d, *worklist, &entry);
-       }
-    }
-
-  if (TYPE_TARGET_TYPE (type1) != NULL)
-    {
-      struct type_equality_entry entry;
-
-      if (TYPE_TARGET_TYPE (type2) == NULL)
-       return Py_NE;
-
-      entry.type1 = TYPE_TARGET_TYPE (type1);
-      entry.type2 = TYPE_TARGET_TYPE (type2);
-      VEC_safe_push (type_equality_entry_d, *worklist, &entry);
-    }
-  else if (TYPE_TARGET_TYPE (type2) != NULL)
-    return Py_NE;
-
-  return Py_EQ;
-}
-
-/* Check types on a worklist for equality.  Returns Py_NE if any pair
-   is not equal, Py_EQ if they are all considered equal.  */
-
-static int
-check_types_worklist (VEC (type_equality_entry_d) **worklist,
-                     struct bcache *cache)
-{
-  while (!VEC_empty (type_equality_entry_d, *worklist))
-    {
-      struct type_equality_entry entry;
-      int added;
-
-      entry = *VEC_last (type_equality_entry_d, *worklist);
-      VEC_pop (type_equality_entry_d, *worklist);
-
-      /* If the type pair has already been visited, we know it is
-        ok.  */
-      bcache_full (&entry, sizeof (entry), cache, &added);
-      if (!added)
-       continue;
-
-      if (check_types_equal (entry.type1, entry.type2, worklist) == Py_NE)
-       return Py_NE;
-    }
-
-  return Py_EQ;
-}
-
 /* Implement the richcompare method.  */
 
 static PyObject *
@@ -1148,7 +1048,6 @@ typy_richcompare (PyObject *self, PyObject *other, int op)
   int result = Py_NE;
   struct type *type1 = type_object_to_type (self);
   struct type *type2 = type_object_to_type (other);
-  volatile struct gdb_exception except;
 
   /* We can only compare ourselves to another Type object, and only
      for equality or inequality.  */
@@ -1162,30 +1061,20 @@ typy_richcompare (PyObject *self, PyObject *other, int op)
     result = Py_EQ;
   else
     {
-      struct bcache *cache;
-      VEC (type_equality_entry_d) *worklist = NULL;
-      struct type_equality_entry entry;
-
-      cache = bcache_xmalloc (NULL, NULL);
-
-      entry.type1 = type1;
-      entry.type2 = type2;
-      VEC_safe_push (type_equality_entry_d, worklist, &entry);
-
-      TRY_CATCH (except, RETURN_MASK_ALL)
+      TRY
        {
-         result = check_types_worklist (&worklist, cache);
+         result = types_deeply_equal (type1, type2);
        }
-      /* check_types_worklist calls several nested Python helper
-        functions, some of which can raise a GDB Exception, so we
-        just check and convert here.  If there is a GDB exception, a
-        comparison is not capable (or trusted), so exit.  */
-      bcache_xfree (cache);
-      VEC_free (type_equality_entry_d, worklist);
-      GDB_PY_HANDLE_EXCEPTION (except);
+      CATCH (except, RETURN_MASK_ALL)
+       {
+         /* If there is a GDB exception, a comparison is not capable
+            (or trusted), so exit.  */
+         GDB_PY_HANDLE_EXCEPTION (except);
+       }
+      END_CATCH
     }
 
-  if (op == result)
+  if (op == (result ? Py_EQ : Py_NE))
     Py_RETURN_TRUE;
   Py_RETURN_FALSE;
 }
@@ -1201,6 +1090,9 @@ save_objfile_types (struct objfile *objfile, void *datum)
   htab_t copied_types;
   struct cleanup *cleanup;
 
+  if (!gdb_python_initialized)
+    return;
+
   /* This prevents another thread from freeing the objects we're
      operating on.  */
   cleanup = ensure_python_env (get_objfile_arch (objfile), current_language);
@@ -1262,7 +1154,7 @@ typy_dealloc (PyObject *obj)
   if (type->next)
     type->next->prev = type->prev;
 
-  type->ob_type->tp_free (type);
+  Py_TYPE (type)->tp_free (type);
 }
 
 /* Return number of fields ("length" of the field dictionary).  */
@@ -1280,7 +1172,7 @@ typy_length (PyObject *self)
 }
 
 /* Implements boolean evaluation of gdb.Type.  Handle this like other
-   Python objects that don't have a meaningful truth value -- all 
+   Python objects that don't have a meaningful truth value -- all
    values are true.  */
 
 static int
@@ -1289,6 +1181,16 @@ typy_nonzero (PyObject *self)
   return 1;
 }
 
+/* Return optimized out value of this type.  */
+
+static PyObject *
+typy_optimized_out (PyObject *self, PyObject *args)
+{
+  struct type *type = ((type_object *) self)->type;
+
+  return value_to_value_object (allocate_optimized_out_value (type));
+}
+
 /* Return a gdb.Field object for the field named by the argument.  */
 
 static PyObject *
@@ -1302,14 +1204,14 @@ typy_getitem (PyObject *self, PyObject *key)
   if (field == NULL)
     return NULL;
 
-  /* We want just fields of this type, not of base types, so instead of 
+  /* We want just fields of this type, not of base types, so instead of
      using lookup_struct_elt_type, portions of that function are
      copied here.  */
 
   type = typy_get_composite (type);
   if (type == NULL)
     return NULL;
-  
+
   for (i = 0; i < TYPE_NFIELDS (type); i++)
     {
       const char *t_field_name = TYPE_FIELD_NAME (type, i);
@@ -1323,7 +1225,7 @@ typy_getitem (PyObject *self, PyObject *key)
   return NULL;
 }
 
-/* Implement the "get" method on the type object.  This is the 
+/* Implement the "get" method on the type object.  This is the
    same as getitem if the key is present, but returns the supplied
    default value or None if the key is not found.  */
 
@@ -1331,20 +1233,20 @@ static PyObject *
 typy_get (PyObject *self, PyObject *args)
 {
   PyObject *key, *defval = Py_None, *result;
-  
+
   if (!PyArg_UnpackTuple (args, "get", 1, 2, &key, &defval))
     return NULL;
-  
+
   result = typy_getitem (self, key);
   if (result != NULL)
     return result;
-  
+
   /* typy_getitem returned error status.  If the exception is
      KeyError, clear the exception status and return the defval
      instead.  Otherwise return the exception unchanged.  */
   if (!PyErr_ExceptionMatches (PyExc_KeyError))
     return NULL;
-  
+
   PyErr_Clear ();
   Py_INCREF (defval);
   return defval;
@@ -1362,7 +1264,7 @@ typy_has_key (PyObject *self, PyObject *args)
   if (!PyArg_ParseTuple (args, "s", &field))
     return NULL;
 
-  /* We want just fields of this type, not of base types, so instead of 
+  /* We want just fields of this type, not of base types, so instead of
      using lookup_struct_elt_type, portions of that function are
      copied here.  */
 
@@ -1390,7 +1292,7 @@ typy_make_iter (PyObject *self, enum gdbpy_iter_kind kind)
   /* Check that "self" is a structure or union type.  */
   if (typy_get_composite (((type_object *) self)->type) == NULL)
     return NULL;
-  
+
   typy_iter_obj = PyObject_New (typy_iterator_object,
                                &type_iterator_object_type);
   if (typy_iter_obj == NULL)
@@ -1455,7 +1357,7 @@ typy_iterator_iternext (PyObject *self)
   typy_iterator_object *iter_obj = (typy_iterator_object *) self;
   struct type *type = iter_obj->source->type;
   PyObject *result;
-  
+
   if (iter_obj->field < TYPE_NFIELDS (type))
     {
       result = make_fielditem (type, iter_obj->field, iter_obj->kind);
@@ -1530,7 +1432,7 @@ gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw)
   return (PyObject *) type_to_type_object (type);
 }
 
-void
+int
 gdbpy_initialize_types (void)
 {
   int i;
@@ -1539,11 +1441,11 @@ gdbpy_initialize_types (void)
     = register_objfile_data_with_cleanup (save_objfile_types, NULL);
 
   if (PyType_Ready (&type_object_type) < 0)
-    return;
+    return -1;
   if (PyType_Ready (&field_object_type) < 0)
-    return;
+    return -1;
   if (PyType_Ready (&type_iterator_object_type) < 0)
-    return;
+    return -1;
 
   for (i = 0; pyty_codes[i].name; ++i)
     {
@@ -1551,18 +1453,19 @@ gdbpy_initialize_types (void)
                                   /* Cast needed for Python 2.4.  */
                                   (char *) pyty_codes[i].name,
                                   pyty_codes[i].code) < 0)
-       return;
+       return -1;
     }
 
-  Py_INCREF (&type_object_type);
-  PyModule_AddObject (gdb_module, "Type", (PyObject *) &type_object_type);
+  if (gdb_pymodule_addobject (gdb_module, "Type",
+                             (PyObject *) &type_object_type) < 0)
+    return -1;
 
-  Py_INCREF (&type_iterator_object_type);
-  PyModule_AddObject (gdb_module, "TypeIterator",
-                     (PyObject *) &type_iterator_object_type);
+  if (gdb_pymodule_addobject (gdb_module, "TypeIterator",
+                             (PyObject *) &type_iterator_object_type) < 0)
+    return -1;
 
-  Py_INCREF (&field_object_type);
-  PyModule_AddObject (gdb_module, "Field", (PyObject *) &field_object_type);
+  return gdb_pymodule_addobject (gdb_module, "Field",
+                                (PyObject *) &field_object_type);
 }
 
 \f
@@ -1571,6 +1474,8 @@ static PyGetSetDef type_object_getset[] =
 {
   { "code", typy_get_code, NULL,
     "The code for this type.", NULL },
+  { "name", typy_get_name, NULL,
+    "The name for this type, or None.", NULL },
   { "sizeof", typy_get_sizeof, NULL,
     "The size of this type, in bytes.", NULL },
   { "tag", typy_get_tag, NULL,
@@ -1598,6 +1503,9 @@ They are first class values." },
   { "const", typy_const, METH_NOARGS,
     "const () -> Type\n\
 Return a const variant of this type." },
+  { "optimized_out", typy_optimized_out, METH_NOARGS,
+    "optimized_out() -> Value\n\
+Return optimized out value of this type." },
   { "fields", typy_fields, METH_NOARGS,
     "fields () -> list\n\
 Return a list holding all the fields of this type.\n\
@@ -1657,7 +1565,9 @@ static PyNumberMethods type_object_as_number = {
   NULL,                              /* nb_add */
   NULL,                              /* nb_subtract */
   NULL,                              /* nb_multiply */
+#ifndef IS_PY3K
   NULL,                              /* nb_divide */
+#endif
   NULL,                              /* nb_remainder */
   NULL,                              /* nb_divmod */
   NULL,                              /* nb_power */
@@ -1671,12 +1581,19 @@ static PyNumberMethods type_object_as_number = {
   NULL,                              /* nb_and */
   NULL,                              /* nb_xor */
   NULL,                              /* nb_or */
+#ifdef IS_PY3K
+  NULL,                              /* nb_int */
+  NULL,                              /* reserved */
+#else
   NULL,                              /* nb_coerce */
   NULL,                              /* nb_int */
   NULL,                              /* nb_long */
+#endif
   NULL,                              /* nb_float */
+#ifndef IS_PY3K
   NULL,                              /* nb_oct */
   NULL                       /* nb_hex */
+#endif
 };
 
 static PyMappingMethods typy_mapping = {
@@ -1685,10 +1602,9 @@ static PyMappingMethods typy_mapping = {
   NULL                           /* no "set" method */
 };
 
-static PyTypeObject type_object_type =
+PyTypeObject type_object_type =
 {
-  PyObject_HEAD_INIT (NULL)
-  0,                             /*ob_size*/
+  PyVarObject_HEAD_INIT (NULL, 0)
   "gdb.Type",                    /*tp_name*/
   sizeof (type_object),                  /*tp_basicsize*/
   0,                             /*tp_itemsize*/
@@ -1735,10 +1651,9 @@ static PyGetSetDef field_object_getset[] =
   { NULL }
 };
 
-static PyTypeObject field_object_type =
+PyTypeObject field_object_type =
 {
-  PyObject_HEAD_INIT (NULL)
-  0,                             /*ob_size*/
+  PyVarObject_HEAD_INIT (NULL, 0)
   "gdb.Field",                   /*tp_name*/
   sizeof (field_object),         /*tp_basicsize*/
   0,                             /*tp_itemsize*/
@@ -1778,9 +1693,8 @@ static PyTypeObject field_object_type =
   0,                             /* tp_new */
 };
 
-static PyTypeObject type_iterator_object_type = {
-  PyObject_HEAD_INIT (NULL)
-  0,                             /*ob_size*/
+PyTypeObject type_iterator_object_type = {
+  PyVarObject_HEAD_INIT (NULL, 0)
   "gdb.TypeIterator",            /*tp_name*/
   sizeof (typy_iterator_object),  /*tp_basicsize*/
   0,                             /*tp_itemsize*/
This page took 0.039211 seconds and 4 git commands to generate.