[Python] Add methods reference_value and const_value to gdb.Value.

gdb/ChangeLog:

	* 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:

	* python.texi (Values From Inferior): Add descriptions of new
	methods gdb.Value.reference_value and gdb.Value.const_value.

gdb/testsuite/ChangeLog:

	* 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.
This commit is contained in:
Siva Chandra 2015-04-25 07:04:40 -07:00
parent 10a52f094e
commit 4c082a81df
11 changed files with 135 additions and 1 deletions

View File

@ -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>

View File

@ -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

View File

@ -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.

View File

@ -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.

View File

@ -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\

View File

@ -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

View File

@ -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. */

View File

@ -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.

View File

@ -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:

View File

@ -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 *

View File

@ -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 */