2011-11-04 Phil Muldoon <pmuldoon@redhat.com>
authorPhil Muldoon <pmuldoon@redhat.com>
Fri, 4 Nov 2011 11:57:04 +0000 (11:57 +0000)
committerPhil Muldoon <pmuldoon@redhat.com>
Fri, 4 Nov 2011 11:57:04 +0000 (11:57 +0000)
PR Python/13363

* python/py-type.c (typy_lookup_type): Do not return a type in
          an exception handler.

gdb/ChangeLog
gdb/python/py-type.c

index 2e9647a..d9af3e5 100644 (file)
@@ -1,3 +1,10 @@
+2011-11-04  Phil Muldoon  <pmuldoon@redhat.com>
+
+       PR Python/13363
+
+       * python/py-type.c (typy_lookup_type): Do not return a type in
+          an exception handler.
+
 2011-11-03  Jan Kratochvil  <jan.kratochvil@redhat.com>
            Eli Zaretskii  <eliz@gnu.org>
 
index 585100d..67696fd 100644 (file)
@@ -606,7 +606,7 @@ static struct type *
 typy_lookup_type (struct demangle_component *demangled,
                  const struct block *block)
 {
-  struct type *type;
+  struct type *type, *rtype = NULL;
   char *type_name = NULL;
   enum demangle_component_type demangled_type;
   volatile struct gdb_exception except;
@@ -626,19 +626,25 @@ typy_lookup_type (struct demangle_component *demangled,
 
       TRY_CATCH (except, RETURN_MASK_ALL)
        {
+         /* If the demangled_type matches with one of the types
+            below, run the corresponding function and save the type
+            to return later.  We cannot just return here as we are in
+            an exception handler.  */
          switch (demangled_type)
            {
            case DEMANGLE_COMPONENT_REFERENCE:
-             return lookup_reference_type (type);
+             rtype =  lookup_reference_type (type);
+             break;
            case DEMANGLE_COMPONENT_POINTER:
-             return lookup_pointer_type (type);
+             rtype = lookup_pointer_type (type);
+             break;
            case DEMANGLE_COMPONENT_CONST:
-             return make_cv_type (1, 0, type, NULL);
+             rtype = make_cv_type (1, 0, type, NULL);
+             break;
            case DEMANGLE_COMPONENT_VOLATILE:
-             return make_cv_type (0, 1, type, NULL);
+             rtype = make_cv_type (0, 1, type, NULL);
+             break;
            }
-
-         type_name = cp_comp_to_string (demangled, 10);
        }
       if (except.reason < 0)
        {
@@ -646,7 +652,14 @@ typy_lookup_type (struct demangle_component *demangled,
          return NULL;
        }
     }
-
+  
+  /* 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);
   xfree (type_name);