diff options
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/python/py-type.c | 29 |
2 files changed, 28 insertions, 8 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2e9647a..d9af3e5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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> diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index 585100d..67696fd 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); |