* [Python] Add methods reference_value and const_value to gdb.Value
@ 2015-04-27 13:30 Siva Chandra
2015-04-27 14:54 ` Eli Zaretskii
2015-05-04 23:40 ` Siva Chandra
0 siblings, 2 replies; 5+ messages in thread
From: Siva Chandra @ 2015-04-27 13:30 UTC (permalink / raw)
To: gdb-patches; +Cc: Doug Evans
[-- Attachment #1: Type: text/plain, Size: 1074 bytes --]
This will help address libstdc++/65840:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65840
gdb/ChangeLog:
2015-04-27 Siva Chandra Reddy <sivachandra@google.com>
* NEWS (Python Scripting): Mention the new gdb.Value methods.
* python/py-value.c (valpy_reference_value): New function.
(valpy_const_value): Likewise.
(value_object_methods): Add new methods.
* value.c (make_cv_value): New function.
* value.h (make_cv_value): Declare.
gdb/doc/ChangeLog:
2015-04-27 Siva Chandra Reddy <sivachandra@google.com>
* python.texi (Values From Inferior): Add descriptions of new
methods gdb.Value.reference_value and gdb.Value.const_value.
gdb/testsuite/ChangeLog:
2015-04-27 Siva Chandra Reddy <sivachandra@google.com>
* gdb.python/py-xmethods.cc: Enhance test case.
* gdb.python/py-xmethods.exp: New tests.
* gdb.python/py-xmethods.py (A_indexoper): New xmethod worker
function.
(B_indexoper): Likewise.
(global_dm_list) : Add new xmethod worker functions.
[-- Attachment #2: gdb.Value_methods_v1.txt --]
[-- Type: text/plain, Size: 6967 bytes --]
diff --git a/gdb/NEWS b/gdb/NEWS
index b711553..627afd0 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -52,6 +52,9 @@
which is the name of the objfile as specified by the user,
without, for example, resolving symlinks.
** You can now write frame unwinders in Python.
+ ** gdb.Value objects have new methods "reference_value" and
+ "const_value" which return a reference to the value and a
+ "const" version of the value respectively.
* New commands
diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi
index 448fa8b2..1b1079d 100644
--- a/gdb/doc/python.texi
+++ b/gdb/doc/python.texi
@@ -781,6 +781,16 @@ The @code{gdb.Value} object @code{py_val} is identical to that
corresponding to @code{val}.
@end defun
+@defun Value.reference_value ()
+Return a @code{gdb.Value} object which is a reference to the value
+encapsulated by this instance.
+@end defun
+
+@defun Value.const_value ()
+Return a @code{gdb.Value} object which is a @code{const} version of the
+value encapsulated by this instance.
+@end defun
+
@defun Value.dynamic_cast (type)
Like @code{Value.cast}, but works as if the C@t{++} @code{dynamic_cast}
operator were used. Consult a C@t{++} reference for details.
diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c
index 6622d11..94ff9ba 100644
--- a/gdb/python/py-value.c
+++ b/gdb/python/py-value.c
@@ -236,6 +236,60 @@ valpy_referenced_value (PyObject *self, PyObject *args)
return result;
}
+/* Return a value which is a reference to the value. */
+
+static PyObject *
+valpy_reference_value (PyObject *self, PyObject *args)
+{
+ PyObject *result = NULL;
+
+ TRY
+ {
+ struct value *self_val;
+ struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ());
+
+ self_val = ((value_object *) self)->value;
+ result = value_to_value_object (value_ref (self_val));
+
+ do_cleanups (cleanup);
+ }
+ CATCH (except, RETURN_MASK_ALL)
+ {
+ GDB_PY_HANDLE_EXCEPTION (except);
+ }
+ END_CATCH
+
+ return result;
+}
+
+/* Return a "const" qualified version of the value. */
+
+static PyObject *
+valpy_const_value (PyObject *self, PyObject *args)
+{
+ PyObject *result = NULL;
+
+ TRY
+ {
+ struct value *self_val, *res_val;
+ struct type *const_type;
+ struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ());
+
+ self_val = ((value_object *) self)->value;
+ res_val = make_cv_value (1, 0, self_val);
+ result = value_to_value_object (res_val);
+
+ do_cleanups (cleanup);
+ }
+ CATCH (except, RETURN_MASK_ALL)
+ {
+ GDB_PY_HANDLE_EXCEPTION (except);
+ }
+ END_CATCH
+
+ return result;
+}
+
/* Return "&value". */
static PyObject *
valpy_get_address (PyObject *self, void *closure)
@@ -1692,6 +1746,10 @@ reinterpret_cast operator."
{ "dereference", valpy_dereference, METH_NOARGS, "Dereferences the value." },
{ "referenced_value", valpy_referenced_value, METH_NOARGS,
"Return the value referenced by a TYPE_CODE_REF or TYPE_CODE_PTR value." },
+ { "reference_value", valpy_reference_value, METH_NOARGS,
+ "Return a value of type TYPE_CODE_REF referencing this value." },
+ { "const_value", valpy_const_value, METH_NOARGS,
+ "Return a 'const' qualied version of the same value." },
{ "lazy_string", (PyCFunction) valpy_lazy_string,
METH_VARARGS | METH_KEYWORDS,
"lazy_string ([encoding] [, length]) -> lazy_string\n\
diff --git a/gdb/testsuite/gdb.python/py-xmethods.cc b/gdb/testsuite/gdb.python/py-xmethods.cc
index aedd1de..98bdb72 100644
--- a/gdb/testsuite/gdb.python/py-xmethods.cc
+++ b/gdb/testsuite/gdb.python/py-xmethods.cc
@@ -173,7 +173,7 @@ int main(void)
for (int i = 0; i < 10; i++)
{
- a1.array[i] = a2.array[i] = i;
+ a1.array[i] = a2.array[i] = b1.array[i] = i;
}
return 0; /* Break here. */
diff --git a/gdb/testsuite/gdb.python/py-xmethods.exp b/gdb/testsuite/gdb.python/py-xmethods.exp
index a83b14d..eacfa0c 100644
--- a/gdb/testsuite/gdb.python/py-xmethods.exp
+++ b/gdb/testsuite/gdb.python/py-xmethods.exp
@@ -100,6 +100,8 @@ gdb_test "p a1.geta()" "From Python <A_geta>.*5" "After: a1.geta()"
gdb_test "p ++a1" "From Python <plus_plus_A>.*6" "After: ++a1"
gdb_test "p a1.getarrayind(5)" "From Python <A_getarrayind>.*5" \
"After: a1.getarrayind(5)"
+gdb_test "P a1\[6\]" ".*int &.*6" "After a1\[\]"
+gdb_test "P b1\[7\]" ".*const int &.*7" "After b1\[\]"
# Note the following test. Xmethods on dynamc types are not looked up
# currently. Hence, even though a_ptr points to a B object, the xmethod
# defined for A objects is invoked.
diff --git a/gdb/testsuite/gdb.python/py-xmethods.py b/gdb/testsuite/gdb.python/py-xmethods.py
index 78935e1..3194e89 100644
--- a/gdb/testsuite/gdb.python/py-xmethods.py
+++ b/gdb/testsuite/gdb.python/py-xmethods.py
@@ -43,6 +43,12 @@ def A_getarrayind(obj, index):
print('From Python <A_getarrayind>:')
return obj['array'][index]
+def A_indexoper(obj, index):
+ return obj['array'][index].reference_value()
+
+def B_indexoper(obj, index):
+ return obj['array'][index].const_value().reference_value()
+
type_A = gdb.parse_and_eval('(dop::A *) 0').type.target()
type_B = gdb.parse_and_eval('(dop::B *) 0').type.target()
@@ -208,6 +214,16 @@ global_dm_list = [
'^getarrayind$',
A_getarrayind,
type_int),
+ SimpleXMethodMatcher('A_indexoper',
+ '^dop::A$',
+ 'operator\\[\\]',
+ A_indexoper,
+ type_int),
+ SimpleXMethodMatcher('B_indexoper',
+ '^dop::B$',
+ 'operator\\[\\]',
+ B_indexoper,
+ type_int)
]
for matcher in global_dm_list:
diff --git a/gdb/value.c b/gdb/value.c
index cb56849..242b46c 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -1704,6 +1704,22 @@ value_copy (struct value *arg)
return val;
}
+/* Return a "const" and/or "volatile" qualified version of the value V.
+ If CNST is true, then the returned value will be qualified with
+ "const".
+ if VOLTL is true, then the returned value will be qualified with
+ "volatile". */
+
+struct value *
+make_cv_value (int cnst, int voltl, struct value *v)
+{
+ struct value *cv_val = value_copy (v);
+
+ cv_val->type = make_cv_type (cnst, voltl, value_type (v), NULL);
+
+ return cv_val;
+}
+
/* Return a version of ARG that is non-lvalue. */
struct value *
diff --git a/gdb/value.h b/gdb/value.h
index 21baa32..9aeaa4a 100644
--- a/gdb/value.h
+++ b/gdb/value.h
@@ -1040,6 +1040,8 @@ extern struct value *value_non_lval (struct value *);
extern void value_force_lval (struct value *, CORE_ADDR);
+extern struct value *make_cv_value (int, int, struct value *);
+
extern void preserve_one_value (struct value *, struct objfile *, htab_t);
/* From valops.c */
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Python] Add methods reference_value and const_value to gdb.Value
2015-04-27 13:30 [Python] Add methods reference_value and const_value to gdb.Value Siva Chandra
@ 2015-04-27 14:54 ` Eli Zaretskii
2015-05-04 23:40 ` Siva Chandra
1 sibling, 0 replies; 5+ messages in thread
From: Eli Zaretskii @ 2015-04-27 14:54 UTC (permalink / raw)
To: Siva Chandra; +Cc: gdb-patches, dje
> Date: Mon, 27 Apr 2015 06:30:20 -0700
> From: Siva Chandra <sivachandra@google.com>
> Cc: Doug Evans <dje@google.com>
>
> This will help address libstdc++/65840:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65840
>
> gdb/ChangeLog:
>
> 2015-04-27 Siva Chandra Reddy <sivachandra@google.com>
>
> * NEWS (Python Scripting): Mention the new gdb.Value methods.
> * python/py-value.c (valpy_reference_value): New function.
> (valpy_const_value): Likewise.
> (value_object_methods): Add new methods.
> * value.c (make_cv_value): New function.
> * value.h (make_cv_value): Declare.
>
> gdb/doc/ChangeLog:
>
> 2015-04-27 Siva Chandra Reddy <sivachandra@google.com>
>
> * python.texi (Values From Inferior): Add descriptions of new
> methods gdb.Value.reference_value and gdb.Value.const_value.
>
> gdb/testsuite/ChangeLog:
>
> 2015-04-27 Siva Chandra Reddy <sivachandra@google.com>
>
> * gdb.python/py-xmethods.cc: Enhance test case.
> * gdb.python/py-xmethods.exp: New tests.
> * gdb.python/py-xmethods.py (A_indexoper): New xmethod worker
> function.
> (B_indexoper): Likewise.
> (global_dm_list) : Add new xmethod worker functions.
OK for the documentation parts.
Thanks.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Python] Add methods reference_value and const_value to gdb.Value
2015-04-27 13:30 [Python] Add methods reference_value and const_value to gdb.Value Siva Chandra
2015-04-27 14:54 ` Eli Zaretskii
@ 2015-05-04 23:40 ` Siva Chandra
1 sibling, 0 replies; 5+ messages in thread
From: Siva Chandra @ 2015-05-04 23:40 UTC (permalink / raw)
To: gdb-patches; +Cc: Doug Evans
Ping.
On Mon, Apr 27, 2015 at 6:30 AM, Siva Chandra <sivachandra@google.com> wrote:
> This will help address libstdc++/65840:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65840
>
> gdb/ChangeLog:
>
> 2015-04-27 Siva Chandra Reddy <sivachandra@google.com>
>
> * NEWS (Python Scripting): Mention the new gdb.Value methods.
> * python/py-value.c (valpy_reference_value): New function.
> (valpy_const_value): Likewise.
> (value_object_methods): Add new methods.
> * value.c (make_cv_value): New function.
> * value.h (make_cv_value): Declare.
>
> gdb/doc/ChangeLog:
>
> 2015-04-27 Siva Chandra Reddy <sivachandra@google.com>
>
> * python.texi (Values From Inferior): Add descriptions of new
> methods gdb.Value.reference_value and gdb.Value.const_value.
>
> gdb/testsuite/ChangeLog:
>
> 2015-04-27 Siva Chandra Reddy <sivachandra@google.com>
>
> * gdb.python/py-xmethods.cc: Enhance test case.
> * gdb.python/py-xmethods.exp: New tests.
> * gdb.python/py-xmethods.py (A_indexoper): New xmethod worker
> function.
> (B_indexoper): Likewise.
> (global_dm_list) : Add new xmethod worker functions.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Python] Add methods reference_value and const_value to gdb.Value
2015-05-07 23:30 Doug Evans
@ 2015-05-10 0:36 ` Siva Chandra
0 siblings, 0 replies; 5+ messages in thread
From: Siva Chandra @ 2015-05-10 0:36 UTC (permalink / raw)
To: Doug Evans; +Cc: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 1661 bytes --]
On Thu, May 7, 2015 at 4:30 PM, Doug Evans <dje@google.com> wrote:
> Siva Chandra writes:
> > This will help address libstdc++/65840:
> > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65840
> >
> > gdb/ChangeLog:
> >
> > 2015-04-27 Siva Chandra Reddy <sivachandra@google.com>
> >
> > * NEWS (Python Scripting): Mention the new gdb.Value methods.
> > * python/py-value.c (valpy_reference_value): New function.
> > (valpy_const_value): Likewise.
> > (value_object_methods): Add new methods.
> > * value.c (make_cv_value): New function.
> > * value.h (make_cv_value): Declare.
> >
> > gdb/doc/ChangeLog:
> >
> > 2015-04-27 Siva Chandra Reddy <sivachandra@google.com>
> >
> > * python.texi (Values From Inferior): Add descriptions of new
> > methods gdb.Value.reference_value and gdb.Value.const_value.
> >
> > gdb/testsuite/ChangeLog:
> >
> > 2015-04-27 Siva Chandra Reddy <sivachandra@google.com>
> >
> > * gdb.python/py-xmethods.cc: Enhance test case.
> > * gdb.python/py-xmethods.exp: New tests.
> > * gdb.python/py-xmethods.py (A_indexoper): New xmethod worker
> > function.
> > (B_indexoper): Likewise.
> > (global_dm_list) : Add new xmethod worker functions.
>
> Thanks again for the ping.
>
> LGTM with two nits below. grep for ====.
>
> One more nit might be that we already have gdb.Value.referenced_value,
> and now we'll also have gdb.Value.reference_value.
> I'm ok with it.
Thanks for the review. I have committed the attached patch after
addressing the nits: 4c082a81dfebcca45e4ee8cb90490ab733b8e017
[-- Attachment #2: gdb.Value_methods_v2.txt --]
[-- Type: text/plain, Size: 8766 bytes --]
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1004e11..b58f04a 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,12 @@
+2015-05-09 Siva Chandra Reddy <sivachandra@google.com>
+
+ * NEWS (Python Scripting): Mention the new gdb.Value methods.
+ * python/py-value.c (valpy_reference_value): New function.
+ (valpy_const_value): Likewise.
+ (value_object_methods): Add new methods.
+ * value.c (make_cv_value): New function.
+ * value.h (make_cv_value): Declare.
+
2015-05-08 Yao Qi <yao@codesourcery.com>
Sandra Loosemore <sandra@codesourcery.com>
diff --git a/gdb/NEWS b/gdb/NEWS
index 0c7084a..51e4f4e 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -57,6 +57,9 @@
** gdb.Type objects have a new method "optimized_out",
returning optimized out gdb.Value instance of this type.
** Xmethods can now specify a result type.
+ ** gdb.Value objects have new methods "reference_value" and
+ "const_value" which return a reference to the value and a
+ "const" version of the value respectively.
* New commands
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index f374fea..727d0ad 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,8 @@
+2015-05-09 Siva Chandra Reddy <sivachandra@google.com>
+
+ * python.texi (Values From Inferior): Add descriptions of new
+ methods gdb.Value.reference_value and gdb.Value.const_value.
+
2015-05-06 Joel Brobecker <brobecker@adacore.com>
* gdb.texinfo (Files): Add "info dll" documentation.
diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi
index fc3c745..57ec22e 100644
--- a/gdb/doc/python.texi
+++ b/gdb/doc/python.texi
@@ -781,6 +781,16 @@ The @code{gdb.Value} object @code{py_val} is identical to that
corresponding to @code{val}.
@end defun
+@defun Value.reference_value ()
+Return a @code{gdb.Value} object which is a reference to the value
+encapsulated by this instance.
+@end defun
+
+@defun Value.const_value ()
+Return a @code{gdb.Value} object which is a @code{const} version of the
+value encapsulated by this instance.
+@end defun
+
@defun Value.dynamic_cast (type)
Like @code{Value.cast}, but works as if the C@t{++} @code{dynamic_cast}
operator were used. Consult a C@t{++} reference for details.
diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c
index 6622d11..97eb66a 100644
--- a/gdb/python/py-value.c
+++ b/gdb/python/py-value.c
@@ -236,6 +236,59 @@ valpy_referenced_value (PyObject *self, PyObject *args)
return result;
}
+/* Return a value which is a reference to the value. */
+
+static PyObject *
+valpy_reference_value (PyObject *self, PyObject *args)
+{
+ PyObject *result = NULL;
+
+ TRY
+ {
+ struct value *self_val;
+ struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ());
+
+ self_val = ((value_object *) self)->value;
+ result = value_to_value_object (value_ref (self_val));
+
+ do_cleanups (cleanup);
+ }
+ CATCH (except, RETURN_MASK_ALL)
+ {
+ GDB_PY_HANDLE_EXCEPTION (except);
+ }
+ END_CATCH
+
+ return result;
+}
+
+/* Return a "const" qualified version of the value. */
+
+static PyObject *
+valpy_const_value (PyObject *self, PyObject *args)
+{
+ PyObject *result = NULL;
+
+ TRY
+ {
+ struct value *self_val, *res_val;
+ struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ());
+
+ self_val = ((value_object *) self)->value;
+ res_val = make_cv_value (1, 0, self_val);
+ result = value_to_value_object (res_val);
+
+ do_cleanups (cleanup);
+ }
+ CATCH (except, RETURN_MASK_ALL)
+ {
+ GDB_PY_HANDLE_EXCEPTION (except);
+ }
+ END_CATCH
+
+ return result;
+}
+
/* Return "&value". */
static PyObject *
valpy_get_address (PyObject *self, void *closure)
@@ -1692,6 +1745,10 @@ reinterpret_cast operator."
{ "dereference", valpy_dereference, METH_NOARGS, "Dereferences the value." },
{ "referenced_value", valpy_referenced_value, METH_NOARGS,
"Return the value referenced by a TYPE_CODE_REF or TYPE_CODE_PTR value." },
+ { "reference_value", valpy_reference_value, METH_NOARGS,
+ "Return a value of type TYPE_CODE_REF referencing this value." },
+ { "const_value", valpy_const_value, METH_NOARGS,
+ "Return a 'const' qualied version of the same value." },
{ "lazy_string", (PyCFunction) valpy_lazy_string,
METH_VARARGS | METH_KEYWORDS,
"lazy_string ([encoding] [, length]) -> lazy_string\n\
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index f4ee04a..52140bd 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,12 @@
+2015-05-09 Siva Chandra Reddy <sivachandra@google.com>
+
+ * gdb.python/py-xmethods.cc: Enhance test case.
+ * gdb.python/py-xmethods.exp: New tests.
+ * gdb.python/py-xmethods.py (A_indexoper): New xmethod worker
+ function.
+ (B_indexoper): Likewise.
+ (global_dm_list) : Add new xmethod worker functions.
+
2015-05-08 Sergio Durigan Junior <sergiodj@redhat.com>
* gdb.base/coredump-filter.exp: Correctly unset
diff --git a/gdb/testsuite/gdb.python/py-xmethods.cc b/gdb/testsuite/gdb.python/py-xmethods.cc
index aedd1de..98bdb72 100644
--- a/gdb/testsuite/gdb.python/py-xmethods.cc
+++ b/gdb/testsuite/gdb.python/py-xmethods.cc
@@ -173,7 +173,7 @@ int main(void)
for (int i = 0; i < 10; i++)
{
- a1.array[i] = a2.array[i] = i;
+ a1.array[i] = a2.array[i] = b1.array[i] = i;
}
return 0; /* Break here. */
diff --git a/gdb/testsuite/gdb.python/py-xmethods.exp b/gdb/testsuite/gdb.python/py-xmethods.exp
index 712f271..274b06e 100644
--- a/gdb/testsuite/gdb.python/py-xmethods.exp
+++ b/gdb/testsuite/gdb.python/py-xmethods.exp
@@ -100,6 +100,8 @@ gdb_test "p a1.geta()" "From Python <A_geta>.*5" "After: a1.geta()"
gdb_test "p ++a1" "From Python <plus_plus_A>.*6" "After: ++a1"
gdb_test "p a1.getarrayind(5)" "From Python <A_getarrayind>.*5" \
"After: a1.getarrayind(5)"
+gdb_test "P a1\[6\]" ".*int &.*6" "After a1\[\]"
+gdb_test "P b1\[7\]" ".*const int &.*7" "After b1\[\]"
# Note the following test. Xmethods on dynamc types are not looked up
# currently. Hence, even though a_ptr points to a B object, the xmethod
# defined for A objects is invoked.
diff --git a/gdb/testsuite/gdb.python/py-xmethods.py b/gdb/testsuite/gdb.python/py-xmethods.py
index 3a2f100..a32781a 100644
--- a/gdb/testsuite/gdb.python/py-xmethods.py
+++ b/gdb/testsuite/gdb.python/py-xmethods.py
@@ -43,6 +43,12 @@ def A_getarrayind(obj, index):
print('From Python <A_getarrayind>:')
return obj['array'][index]
+def A_indexoper(obj, index):
+ return obj['array'][index].reference_value()
+
+def B_indexoper(obj, index):
+ return obj['array'][index].const_value().reference_value()
+
type_A = gdb.parse_and_eval('(dop::A *) 0').type.target()
type_B = gdb.parse_and_eval('(dop::B *) 0').type.target()
@@ -213,6 +219,16 @@ global_dm_list = [
'^getarrayind$',
A_getarrayind,
type_int),
+ SimpleXMethodMatcher('A_indexoper',
+ '^dop::A$',
+ 'operator\\[\\]',
+ A_indexoper,
+ type_int),
+ SimpleXMethodMatcher('B_indexoper',
+ '^dop::B$',
+ 'operator\\[\\]',
+ B_indexoper,
+ type_int)
]
for matcher in global_dm_list:
diff --git a/gdb/value.c b/gdb/value.c
index 2b32881..86d7d00 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -1704,6 +1704,27 @@ value_copy (struct value *arg)
return val;
}
+/* Return a "const" and/or "volatile" qualified version of the value V.
+ If CNST is true, then the returned value will be qualified with
+ "const".
+ if VOLTL is true, then the returned value will be qualified with
+ "volatile". */
+
+struct value *
+make_cv_value (int cnst, int voltl, struct value *v)
+{
+ struct type *val_type = value_type (v);
+ struct type *enclosing_type = value_enclosing_type (v);
+ struct value *cv_val = value_copy (v);
+
+ deprecated_set_value_type (cv_val,
+ make_cv_type (cnst, voltl, val_type, NULL));
+ set_value_enclosing_type (cv_val,
+ make_cv_type (cnst, voltl, enclosing_type, NULL));
+
+ return cv_val;
+}
+
/* Return a version of ARG that is non-lvalue. */
struct value *
diff --git a/gdb/value.h b/gdb/value.h
index 25107a4..957bcd4 100644
--- a/gdb/value.h
+++ b/gdb/value.h
@@ -1040,6 +1040,8 @@ extern struct value *value_non_lval (struct value *);
extern void value_force_lval (struct value *, CORE_ADDR);
+extern struct value *make_cv_value (int, int, struct value *);
+
extern void preserve_one_value (struct value *, struct objfile *, htab_t);
/* From valops.c */
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Python] Add methods reference_value and const_value to gdb.Value
@ 2015-05-07 23:30 Doug Evans
2015-05-10 0:36 ` Siva Chandra
0 siblings, 1 reply; 5+ messages in thread
From: Doug Evans @ 2015-05-07 23:30 UTC (permalink / raw)
To: Siva Chandra; +Cc: gdb-patches
Siva Chandra writes:
> This will help address libstdc++/65840:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65840
>
> gdb/ChangeLog:
>
> 2015-04-27 Siva Chandra Reddy <sivachandra@google.com>
>
> * NEWS (Python Scripting): Mention the new gdb.Value methods.
> * python/py-value.c (valpy_reference_value): New function.
> (valpy_const_value): Likewise.
> (value_object_methods): Add new methods.
> * value.c (make_cv_value): New function.
> * value.h (make_cv_value): Declare.
>
> gdb/doc/ChangeLog:
>
> 2015-04-27 Siva Chandra Reddy <sivachandra@google.com>
>
> * python.texi (Values From Inferior): Add descriptions of new
> methods gdb.Value.reference_value and gdb.Value.const_value.
>
> gdb/testsuite/ChangeLog:
>
> 2015-04-27 Siva Chandra Reddy <sivachandra@google.com>
>
> * gdb.python/py-xmethods.cc: Enhance test case.
> * gdb.python/py-xmethods.exp: New tests.
> * gdb.python/py-xmethods.py (A_indexoper): New xmethod worker
> function.
> (B_indexoper): Likewise.
> (global_dm_list) : Add new xmethod worker functions.
Thanks again for the ping.
LGTM with two nits below. grep for ====.
One more nit might be that we already have gdb.Value.referenced_value,
and now we'll also have gdb.Value.reference_value.
I'm ok with it.
> diff --git a/gdb/NEWS b/gdb/NEWS
> index b711553..627afd0 100644
> --- a/gdb/NEWS
> +++ b/gdb/NEWS
> @@ -52,6 +52,9 @@
> which is the name of the objfile as specified by the user,
> without, for example, resolving symlinks.
> ** You can now write frame unwinders in Python.
> + ** gdb.Value objects have new methods "reference_value" and
> + "const_value" which return a reference to the value and a
> + "const" version of the value respectively.
>
> * New commands
>
> diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi
> index 448fa8b2..1b1079d 100644
> --- a/gdb/doc/python.texi
> +++ b/gdb/doc/python.texi
> @@ -781,6 +781,16 @@ The @code{gdb.Value} object @code{py_val} is
identical to that
> corresponding to @code{val}.
> @end defun
>
> +@defun Value.reference_value ()
> +Return a @code{gdb.Value} object which is a reference to the value
> +encapsulated by this instance.
> +@end defun
> +
> +@defun Value.const_value ()
> +Return a @code{gdb.Value} object which is a @code{const} version of the
> +value encapsulated by this instance.
> +@end defun
> +
> @defun Value.dynamic_cast (type)
> Like @code{Value.cast}, but works as if the C@t{++} @code{dynamic_cast}
> operator were used. Consult a C@t{++} reference for details.
> diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c
> index 6622d11..94ff9ba 100644
> --- a/gdb/python/py-value.c
> +++ b/gdb/python/py-value.c
> @@ -236,6 +236,60 @@ valpy_referenced_value (PyObject *self, PyObject
*args)
> return result;
> }
>
> +/* Return a value which is a reference to the value. */
> +
> +static PyObject *
> +valpy_reference_value (PyObject *self, PyObject *args)
> +{
> + PyObject *result = NULL;
> +
> + TRY
> + {
> + struct value *self_val;
> + struct cleanup *cleanup = make_cleanup_value_free_to_mark
(value_mark ());
> +
> + self_val = ((value_object *) self)->value;
> + result = value_to_value_object (value_ref (self_val));
> +
> + do_cleanups (cleanup);
> + }
> + CATCH (except, RETURN_MASK_ALL)
> + {
> + GDB_PY_HANDLE_EXCEPTION (except);
> + }
> + END_CATCH
> +
> + return result;
> +}
> +
> +/* Return a "const" qualified version of the value. */
> +
> +static PyObject *
> +valpy_const_value (PyObject *self, PyObject *args)
> +{
> + PyObject *result = NULL;
> +
> + TRY
> + {
> + struct value *self_val, *res_val;
> + struct type *const_type;
====
const_type can be deleted.
> + struct cleanup *cleanup = make_cleanup_value_free_to_mark
(value_mark ());
> +
> + self_val = ((value_object *) self)->value;
> + res_val = make_cv_value (1, 0, self_val);
> + result = value_to_value_object (res_val);
> +
> + do_cleanups (cleanup);
> + }
> + CATCH (except, RETURN_MASK_ALL)
> + {
> + GDB_PY_HANDLE_EXCEPTION (except);
> + }
> + END_CATCH
> +
> + return result;
> +}
> +
> /* Return "&value". */
> static PyObject *
> valpy_get_address (PyObject *self, void *closure)
> @@ -1692,6 +1746,10 @@ reinterpret_cast operator."
> { "dereference", valpy_dereference, METH_NOARGS, "Dereferences the
value." },
> { "referenced_value", valpy_referenced_value, METH_NOARGS,
> "Return the value referenced by a TYPE_CODE_REF or TYPE_CODE_PTR
value." },
> + { "reference_value", valpy_reference_value, METH_NOARGS,
> + "Return a value of type TYPE_CODE_REF referencing this value." },
> + { "const_value", valpy_const_value, METH_NOARGS,
> + "Return a 'const' qualied version of the same value." },
> { "lazy_string", (PyCFunction) valpy_lazy_string,
> METH_VARARGS | METH_KEYWORDS,
> "lazy_string ([encoding] [, length]) -> lazy_string\n\
> diff --git a/gdb/testsuite/gdb.python/py-xmethods.cc
b/gdb/testsuite/gdb.python/py-xmethods.cc
> index aedd1de..98bdb72 100644
> --- a/gdb/testsuite/gdb.python/py-xmethods.cc
> +++ b/gdb/testsuite/gdb.python/py-xmethods.cc
> @@ -173,7 +173,7 @@ int main(void)
>
> for (int i = 0; i < 10; i++)
> {
> - a1.array[i] = a2.array[i] = i;
> + a1.array[i] = a2.array[i] = b1.array[i] = i;
> }
>
> return 0; /* Break here. */
> diff --git a/gdb/testsuite/gdb.python/py-xmethods.exp
b/gdb/testsuite/gdb.python/py-xmethods.exp
> index a83b14d..eacfa0c 100644
> --- a/gdb/testsuite/gdb.python/py-xmethods.exp
> +++ b/gdb/testsuite/gdb.python/py-xmethods.exp
> @@ -100,6 +100,8 @@ gdb_test "p a1.geta()" "From Python
<A_geta>.*5" "After: a1.geta()"
> gdb_test "p ++a1" "From Python <plus_plus_A>.*6" "After: ++a1"
> gdb_test "p a1.getarrayind(5)" "From Python <A_getarrayind>.*5" \
> "After: a1.getarrayind(5)"
> +gdb_test "P a1\[6\]" ".*int &.*6" "After a1\[\]"
> +gdb_test "P b1\[7\]" ".*const int &.*7" "After b1\[\]"
> # Note the following test. Xmethods on dynamc types are not looked up
> # currently. Hence, even though a_ptr points to a B object, the xmethod
> # defined for A objects is invoked.
> diff --git a/gdb/testsuite/gdb.python/py-xmethods.py
b/gdb/testsuite/gdb.python/py-xmethods.py
> index 78935e1..3194e89 100644
> --- a/gdb/testsuite/gdb.python/py-xmethods.py
> +++ b/gdb/testsuite/gdb.python/py-xmethods.py
> @@ -43,6 +43,12 @@ def A_getarrayind(obj, index):
> print('From Python <A_getarrayind>:')
> return obj['array'][index]
>
> +def A_indexoper(obj, index):
> + return obj['array'][index].reference_value()
> +
> +def B_indexoper(obj, index):
> + return obj['array'][index].const_value().reference_value()
> +
>
> type_A = gdb.parse_and_eval('(dop::A *) 0').type.target()
> type_B = gdb.parse_and_eval('(dop::B *) 0').type.target()
> @@ -208,6 +214,16 @@ global_dm_list = [
> '^getarrayind$',
> A_getarrayind,
> type_int),
> + SimpleXMethodMatcher('A_indexoper',
> + '^dop::A$',
> + 'operator\\[\\]',
> + A_indexoper,
> + type_int),
> + SimpleXMethodMatcher('B_indexoper',
> + '^dop::B$',
> + 'operator\\[\\]',
> + B_indexoper,
> + type_int)
> ]
>
> for matcher in global_dm_list:
> diff --git a/gdb/value.c b/gdb/value.c
> index cb56849..242b46c 100644
> --- a/gdb/value.c
> +++ b/gdb/value.c
> @@ -1704,6 +1704,22 @@ value_copy (struct value *arg)
> return val;
> }
>
> +/* Return a "const" and/or "volatile" qualified version of the value V.
> + If CNST is true, then the returned value will be qualified with
> + "const".
> + if VOLTL is true, then the returned value will be qualified with
> + "volatile". */
> +
> +struct value *
> +make_cv_value (int cnst, int voltl, struct value *v)
> +{
> + struct value *cv_val = value_copy (v);
> +
> + cv_val->type = make_cv_type (cnst, voltl, value_type (v), NULL);
> +
> + return cv_val;
> +}
====
I'm not sure the call to value_copy will always produce the desired result,
but I don't have anything specific to say. So let's go with it.
I'd replace the assignment to cv_val->type with a call to
deprecated_set_value_type though.
Do we need to call set_value_enclosing_type too?
For consistency I'd think so.
> +
> /* Return a version of ARG that is non-lvalue. */
>
> struct value *
> diff --git a/gdb/value.h b/gdb/value.h
> index 21baa32..9aeaa4a 100644
> --- a/gdb/value.h
> +++ b/gdb/value.h
> @@ -1040,6 +1040,8 @@ extern struct value *value_non_lval (struct value
*);
>
> extern void value_force_lval (struct value *, CORE_ADDR);
>
> +extern struct value *make_cv_value (int, int, struct value *);
> +
> extern void preserve_one_value (struct value *, struct objfile *,
htab_t);
>
> /* From valops.c */
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2015-05-10 0:36 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-04-27 13:30 [Python] Add methods reference_value and const_value to gdb.Value Siva Chandra
2015-04-27 14:54 ` Eli Zaretskii
2015-05-04 23:40 ` Siva Chandra
2015-05-07 23:30 Doug Evans
2015-05-10 0:36 ` Siva Chandra
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).