This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH v3 08/11] [PR gdb/14441] gdb: python: support rvalue references in the gdb module
- From: Keith Seitz <keiths at redhat dot com>
- To: Artemiy Volkov <artemiyv at acm dot org>, gdb-patches at sourceware dot org
- Date: Wed, 16 Mar 2016 15:32:02 -0700
- Subject: Re: [PATCH v3 08/11] [PR gdb/14441] gdb: python: support rvalue references in the gdb module
- Authentication-results: sourceware.org; auth=none
- References: <1453229609-20159-1-git-send-email-artemiyv at acm dot org> <1457147955-21871-1-git-send-email-artemiyv at acm dot org> <1457147955-21871-9-git-send-email-artemiyv at acm dot org>
On 03/04/2016 07:19 PM, Artemiy Volkov wrote:
> This patch adds the ability to inspect rvalue reference types and values using
> the gdb python module. This is achieved by simply using the ReferenceExplorer
> class to handle the objects of rvalue reference types and placing necessary
> checks for a TYPE_CODE_RVALUE_REF type code next to the checks for a
> TYPE_CODE_REF type code.
>
> gdb/ChangeLog:
>
> 2016-03-04 Artemiy Volkov <artemiyv@acm.org>
>
> * python/lib/gdb/command/explore.py: Support exploring values
> of rvalue reference types.
> * python/lib/gdb/types.py: Implement get_basic_type() for
> rvalue reference types.
> * python/py-type.c (pyty_codes) <TYPE_CODE_RVALUE_REF>: New
> constant.
> * python/py-value.c (valpy_getitem): Add an rvalue reference
> check.
> * python/py-xmethods.c (gdbpy_get_xmethod_result_type)
> (gdbpy_invoke_xmethod): Likewise.
> ---
> gdb/python/lib/gdb/command/explore.py | 2 +-
> gdb/python/lib/gdb/types.py | 4 +++-
> gdb/python/py-type.c | 1 +
> gdb/python/py-value.c | 3 +++
> gdb/python/py-xmethods.c | 14 ++++++++------
> 5 files changed, 16 insertions(+), 8 deletions(-)
>
> diff --git a/gdb/python/py-xmethods.c b/gdb/python/py-xmethods.c
> index d70cdd1..859e346 100644
> --- a/gdb/python/py-xmethods.c
> +++ b/gdb/python/py-xmethods.c
> @@ -548,10 +548,11 @@ gdbpy_get_xmethod_result_type (const struct extension_language_defn *extlang,
> if (!types_equal (obj_type, this_ptr))
> obj = value_cast (this_ptr, obj);
> }
> - else if (TYPE_CODE (obj_type) == TYPE_CODE_REF)
> + else if (TYPE_IS_REFERENCE (obj_type))
> {
> - struct type *this_ref = lookup_lvalue_reference_type (this_type);
> -
> + struct type *this_ref = TYPE_CODE (obj_type) == TYPE_CODE_REF
> + ? lookup_lvalue_reference_type (this_type)
> + : lookup_rvalue_reference_type (this_type);
> if (!types_equal (obj_type, this_ref))
> obj = value_cast (this_ref, obj);
> }
I see this same paradigm repeated in a handful of places... In other
places, I've seen
struct type *this_ref
= lookup_reference_type (this_type, TYPE_CODE (obj_type);
Those are equivalent, right? If so, let's use the above. It's a lot
easier/quicker to read than the ternary conditional.
> @@ -634,10 +635,11 @@ gdbpy_invoke_xmethod (const struct extension_language_defn *extlang,
> if (!types_equal (obj_type, this_ptr))
> obj = value_cast (this_ptr, obj);
> }
> - else if (TYPE_CODE (obj_type) == TYPE_CODE_REF)
> + else if (TYPE_IS_REFERENCE (obj_type))
> {
> - struct type *this_ref = lookup_lvalue_reference_type (this_type);
> -
> + struct type *this_ref = TYPE_CODE (obj_type) == TYPE_CODE_REF
> + ? lookup_lvalue_reference_type (this_type)
> + : lookup_rvalue_reference_type (this_type);
> if (!types_equal (obj_type, this_ref))
> obj = value_cast (this_ref, obj);
> }
>
Likewise?
Keith