+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>
** 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
+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.
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.
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)
{ "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\
+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
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. */
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.
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()
'^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:
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 *
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 */