summaryrefslogtreecommitdiff
path: root/gdb/python/py-type.c
diff options
context:
space:
mode:
authorpmuldoon <pmuldoon>2011-11-04 11:57:02 +0000
committerpmuldoon <pmuldoon>2011-11-04 11:57:02 +0000
commit9a415fbabb3599129f7f954d55d69d9d9c7e9f02 (patch)
treeac244cee99a2ec64d7a51a5d4246ea37687a9aee /gdb/python/py-type.c
parentb1ed9c82e4198d2707a2c15fe2c41940ba705cb1 (diff)
downloadgdb-9a415fbabb3599129f7f954d55d69d9d9c7e9f02.tar.gz
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.
Diffstat (limited to 'gdb/python/py-type.c')
-rw-r--r--gdb/python/py-type.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c
index 585100dd25b..67696fd80a7 100644
--- a/gdb/python/py-type.c
+++ b/gdb/python/py-type.c
@@ -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);