This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH v4 08/11] [PR gdb/14441] gdb: python: support rvalue references in the gdb module
- From: Artemiy Volkov <artemiyv at acm dot org>
- To: Keith Seitz <keiths at redhat dot com>
- Cc: gdb-patches at sourceware dot org
- Date: Sat, 2 Apr 2016 01:27:09 -0700
- Subject: Re: [PATCH v4 08/11] [PR gdb/14441] gdb: python: support rvalue references in the gdb module
- Authentication-results: sourceware.org; auth=none
- References: <1457147955-21871-1-git-send-email-artemiyv at acm dot org> <1458593958-25656-1-git-send-email-artemiyv at acm dot org> <1458593958-25656-9-git-send-email-artemiyv at acm dot org> <56FD8A19 dot 8050403 at redhat dot com>
On Thu, Mar 31, 2016 at 01:35:37PM -0700, Keith Seitz wrote:
[snip]
> Both of the above hunks need to keep the deleted whitespace. We like a
> blank line between the (last) variable declaration and the first line of
> code:
>
> else if (TYPE_IS_REFERENCE 9obj_type))
> {
> struct type *this_ref
> = lookup_reference_type (this_type, TYPE_CODE (obj_type));
>
> if (!types_equal (obj_type, this_ref))
> ...
> }
OK, see the fix below.
---
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 | 10 ++++++----
5 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/gdb/python/lib/gdb/command/explore.py
b/gdb/python/lib/gdb/command/explore.py
index 6c9f17b..ed25fa6 100644
--- a/gdb/python/lib/gdb/command/explore.py
+++ b/gdb/python/lib/gdb/command/explore.py
@@ -132,6 +132,7 @@ class Explorer(object):
gdb.TYPE_CODE_UNION : CompoundExplorer,
gdb.TYPE_CODE_PTR : PointerExplorer,
gdb.TYPE_CODE_REF : ReferenceExplorer,
+ gdb.TYPE_CODE_RVALUE_REF : ReferenceExplorer,
gdb.TYPE_CODE_TYPEDEF : TypedefExplorer,
gdb.TYPE_CODE_ARRAY : ArrayExplorer
}
@@ -318,7 +319,6 @@ class ReferenceExplorer(object):
Explorer.explore_type(name, target_type, is_child)
return False
-
class ArrayExplorer(object):
"""Internal class used to explore arrays."""
diff --git a/gdb/python/lib/gdb/types.py b/gdb/python/lib/gdb/types.py
index c22e8a9..59b7df2 100644
--- a/gdb/python/lib/gdb/types.py
+++ b/gdb/python/lib/gdb/types.py
@@ -31,8 +31,10 @@ def get_basic_type(type_):
"""
while (type_.code == gdb.TYPE_CODE_REF or
+ type_.code == gdb.TYPE_CODE_RVALUE_REF or
type_.code == gdb.TYPE_CODE_TYPEDEF):
- if type_.code == gdb.TYPE_CODE_REF:
+ if (type_.code == gdb.TYPE_CODE_REF or
+ type_.code == gdb.TYPE_CODE_RVALUE_REF):
type_ = type_.target()
else:
type_ = type_.strip_typedefs()
diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c
index 4ec920e..259bb70 100644
--- a/gdb/python/py-type.c
+++ b/gdb/python/py-type.c
@@ -105,6 +105,7 @@ static struct pyty_code pyty_codes[] =
ENTRY (TYPE_CODE_METHODPTR),
ENTRY (TYPE_CODE_MEMBERPTR),
ENTRY (TYPE_CODE_REF),
+ ENTRY (TYPE_CODE_RVALUE_REF),
ENTRY (TYPE_CODE_CHAR),
ENTRY (TYPE_CODE_BOOL),
ENTRY (TYPE_CODE_COMPLEX),
diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c
index 141f180..7802ae0 100644
--- a/gdb/python/py-value.c
+++ b/gdb/python/py-value.c
@@ -768,6 +768,9 @@ valpy_getitem (PyObject *self, PyObject *key)
else if (TYPE_CODE (val_type) == TYPE_CODE_REF)
res_val = value_cast (lookup_lvalue_reference_type
(base_class_type),
tmp);
+ else if (TYPE_CODE (val_type) == TYPE_CODE_RVALUE_REF)
+ res_val = value_cast (lookup_rvalue_reference_type
(base_class_type),
+ tmp);
else
res_val = value_cast (base_class_type, tmp);
}
diff --git a/gdb/python/py-xmethods.c b/gdb/python/py-xmethods.c
index d70cdd1..debc3a8 100644
--- a/gdb/python/py-xmethods.c
+++ b/gdb/python/py-xmethods.c
@@ -548,9 +548,10 @@ 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
+ = lookup_reference_type (this_type, TYPE_CODE (obj_type));
if (!types_equal (obj_type, this_ref))
obj = value_cast (this_ref, obj);
@@ -634,9 +635,10 @@ 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
+ = lookup_reference_type (this_type, TYPE_CODE (obj_type));
if (!types_equal (obj_type, this_ref))
obj = value_cast (this_ref, obj);
--
2.7.3