This is the mail archive of the
archer@sourceware.org
mailing list for the Archer project.
Re: Fix for gdb.template_argument() brokenness WRT const, volatile.
- From: Paul Pluzhnikov <ppluzhnikov at google dot com>
- To: archer at sourceware dot org
- Cc: ppluzhnikov at google dot com
- Date: Thu, 6 Nov 2008 16:07:25 -0800
- Subject: Re: Fix for gdb.template_argument() brokenness WRT const, volatile.
- Dkim-signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta;t=1226016448; bh=lNZKzzSG6Gs680/seu+ER+xCACQ=;h=DomainKey-Signature:MIME-Version:In-Reply-To:References:Date: Message-ID:Subject:From:To:Cc:Content-Type: Content-Transfer-Encoding; b=g6x1SyIJUzlxUNQ4SmRDF9LZ1/LeEl4xA2xqQ0Ec3COFMEb3VPvmj6uFxqltNWMh8KL02YlNHPiMPvq5FbwMhQ==
- Domainkey-signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns;h=mime-version:in-reply-to:references:date:message-id:subject:from:to:cc:content-type:content-transfer-encoding;b=qcrkZ51gCk6P59wEUJqXKRQF8Y1aY7JHLqxuDoythLAWWu98vFd44AahqeoWKOwHESYdQab1m4g87LqgNAE4IQ==
- References: <20081106235909.146BF3A6B0D@localhost>
On Thu, Nov 6, 2008 at 3:59 PM, Paul Pluzhnikov <ppluzhnikov@google.com> wrote:
> RuntimeError: no such type named char const* volatile* const
> Attached patch fixes this.
Updated to handle references as well.
--
Paul Pluzhnikov
2008-11-06 Paul Pluzhnikov <ppluzhnikov@google.com>
* python/python-type.c (typy_lookup_type): New fn.
Handle const and volatile qualified types, pointers and references.
* python/python-type.c (typy_template_argument): Call it.
diff --git a/gdb/python/python-type.c b/gdb/python/python-type.c
index 1d27714..5162986 100644
--- a/gdb/python/python-type.c
+++ b/gdb/python/python-type.c
@@ -128,6 +128,48 @@ typy_lookup_typename (char *type_name, struct block *block)
return type;
}
+static struct type *
+typy_lookup_type (struct demangle_component *demangled,
+ struct block *block)
+{
+ struct type *type;
+ char *type_name;
+
+ if (demangled->type == DEMANGLE_COMPONENT_POINTER
+ || demangled->type == DEMANGLE_COMPONENT_REFERENCE
+ || demangled->type == DEMANGLE_COMPONENT_CONST
+ || demangled->type == DEMANGLE_COMPONENT_VOLATILE)
+ {
+ type = typy_lookup_type (demangled->u.s_binary.left, block);
+ if (! type)
+ return NULL;
+ }
+ switch (demangled->type)
+ {
+ case DEMANGLE_COMPONENT_REFERENCE:
+ return lookup_reference_type (type);
+ case DEMANGLE_COMPONENT_POINTER:
+ return lookup_pointer_type (type);
+ case DEMANGLE_COMPONENT_CONST:
+ return make_cv_type (1, 0, type, NULL);
+ case DEMANGLE_COMPONENT_VOLATILE:
+ return make_cv_type (0, 1, type, NULL);
+ }
+
+ type_name = cp_comp_to_string (demangled, 10);
+ type = typy_lookup_typename (type_name, block);
+ if (! type)
+ {
+ PyErr_Format (PyExc_RuntimeError, "no such type named %s",
+ type_name);
+ xfree (type_name);
+ return NULL;
+ }
+ xfree (type_name);
+
+ return type;
+}
+
static PyObject *
typy_template_argument (PyObject *self, PyObject *args)
{
@@ -135,7 +177,6 @@ typy_template_argument (PyObject *self, PyObject *args)
struct type *type = ((type_object *) self)->type;
struct demangle_component *demangled;
const char *err;
- char *type_name;
struct type *argtype;
struct block *block = NULL;
PyObject *block_obj = NULL;
@@ -196,32 +237,9 @@ typy_template_argument (PyObject *self, PyObject *args)
return NULL;
}
- /* Count pointers and apply later, because lookup_typename does not
- understand '*'. FIXME: should handle references as well. Really
- we should have a generic cp_comp_to_type. */
- demangled = demangled->u.s_binary.left;
- n_pointers = 0;
- while (demangled->type == DEMANGLE_COMPONENT_POINTER)
- {
- ++n_pointers;
- demangled = demangled->u.s_binary.left;
- }
-
- /* FIXME: if argument is a value, we should DTRT. */
- type_name = cp_comp_to_string (demangled, 10);
-
- argtype = typy_lookup_typename (type_name, block);
+ argtype = typy_lookup_type (demangled->u.s_binary.left, block);
if (! argtype)
- {
- PyErr_Format (PyExc_RuntimeError, "no such type named %s",
- type_name);
- xfree (type_name);
- return NULL;
- }
- xfree (type_name);
-
- while (n_pointers--)
- argtype = lookup_pointer_type (argtype);
+ return NULL;
return type_to_type_object (argtype);
}