[PATCH] [python] Fix gdb.Value.dynamic_type for reference values.

Siva Chandra sivachandra@google.com
Fri Mar 21 18:41:00 GMT 2014


Hi,

gdb.Value.dynamic_type is supposed to work for reference and pointer
values.  However, the value object in the function 'valpy_get_dynamic_type'
was being dereferenced using 'value_ind' irrespective of the value type
being TYPE_CODE_PTR or TYPE_CODE_REF.  This patch fixes that to use
'coerce_ref' for TYPE_CODE_REF values.

ChangeLog:
2014-03-21  Siva Chandra Reddy  <sivachandra@google.com>

        * python/py-value.c (valpy_get_dynamic_type): Use coerce_ref to
        dereference TYPE_CODE_REF values.

        testsuite/
        * gdb.python/py-value.c: Improve test case.
        * gdb.python/py-value.exp: Add new test.
-------------- next part --------------
diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c
index a118f6c..54da67a 100644
--- a/gdb/python/py-value.c
+++ b/gdb/python/py-value.c
@@ -309,7 +309,10 @@ valpy_get_dynamic_type (PyObject *self, void *closure)
 	  struct value *target;
 	  int was_pointer = TYPE_CODE (type) == TYPE_CODE_PTR;
 
-	  target = value_ind (val);
+	  if (was_pointer)
+	    target = value_ind (val);
+	  else
+	    target = coerce_ref (val);
 	  type = value_rtti_type (target, NULL, NULL, NULL);
 
 	  if (type)
diff --git a/gdb/testsuite/gdb.python/py-value.c b/gdb/testsuite/gdb.python/py-value.c
index 90dc055..4d1c9c6 100644
--- a/gdb/testsuite/gdb.python/py-value.c
+++ b/gdb/testsuite/gdb.python/py-value.c
@@ -58,6 +58,8 @@ struct Derived : public Base {
 };
 
 Base *base = new Derived ();
+Derived derived;
+Base &base_ref = derived;
 
 void ptr_ref(int*& rptr_int)
 {
diff --git a/gdb/testsuite/gdb.python/py-value.exp b/gdb/testsuite/gdb.python/py-value.exp
index ed332db..13433fd 100644
--- a/gdb/testsuite/gdb.python/py-value.exp
+++ b/gdb/testsuite/gdb.python/py-value.exp
@@ -416,6 +416,8 @@ proc test_subscript_regression {exefile lang} {
      # Likewise.
      gdb_test "python print (gdb.parse_and_eval('base').dynamic_type)" \
 	 "Derived \[*\]"
+     gdb_test "python print (gdb.parse_and_eval('base_ref').dynamic_type)" \
+	 "Derived \[&\]"
      # A static type case.
      gdb_test "python print (gdb.parse_and_eval('5').dynamic_type)" \
 	 "int"


More information about the Gdb-patches mailing list