[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:
parent
10a52f094e
commit
4c082a81df
|
@ -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>
|
||||
|
||||
|
|
3
gdb/NEWS
3
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
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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\
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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:
|
||||
|
|
21
gdb/value.c
21
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 *
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue