gdb
authorTom Tromey <tromey@redhat.com>
Thu, 3 Dec 2009 18:30:02 +0000 (18:30 +0000)
committerTom Tromey <tromey@redhat.com>
Thu, 3 Dec 2009 18:30:02 +0000 (18:30 +0000)
* python/python.c (gdbpy_parse_and_eval): New function.
(GdbMethods): Add "parse_and_eval".
gdb/testsuite
* gdb.python/py-value.exp (test_parse_and_eval): New
function.
gdb/doc
* gdb.texinfo (Basic Python): Document gdb.parse_and_eval.

gdb/ChangeLog
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/python/python.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-value.exp

index a36834ec1ec09ad43a6ad6ac47a58b0d563f8fb1..70da3135832e9808db9b433afcb49065e1bf3fb9 100644 (file)
@@ -1,3 +1,8 @@
+2009-12-03  Tom Tromey  <tromey@redhat.com>
+
+       * python/python.c (gdbpy_parse_and_eval): New function.
+       (GdbMethods): Add "parse_and_eval".
+
 2009-12-03  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * linux-thread-db.c (find_new_threads_once): Change errp and err types
index 73a640d104ef75b7bfa1ae4abb6f3af51ad98fc0..553abaede71bc22b495bc5d09f6ba2d156c35f13 100644 (file)
@@ -1,3 +1,7 @@
+2009-12-03  Tom Tromey  <tromey@redhat.com>
+
+       * gdb.texinfo (Basic Python): Document gdb.parse_and_eval.
+
 2009-12-02  Paul Pluzhnikov  <ppluzhnikov@google.com>
 
        * observer.texi: New memory_changed observer.
index 39107ec90224abb4dbe6af2d3bc3f6c7018dd4d8..8cdab8f3ee7328b0e496cfc0e21c3f906ca13abd 100644 (file)
@@ -19328,6 +19328,19 @@ If no exception is raised, the return value is always an instance of
 @code{gdb.Value} (@pxref{Values From Inferior}).
 @end defun
 
+@findex gdb.parse_and_eval
+@defun parse_and_eval expression
+Parse @var{expression} as an expression in the current language,
+evaluate it, and return the result as a @code{gdb.Value}.
+@var{expression} must be a string.
+
+This function can be useful when implementing a new command
+(@pxref{Commands In Python}), as it provides a way to parse the
+command's argument as an expression.  It is also useful simply to
+compute values, for example, it is the only way to get the value of a
+convenience variable (@pxref{Convenience Vars}) as a @code{gdb.Value}.
+@end defun
+
 @findex gdb.write
 @defun write string
 Print a string to @value{GDBN}'s paginated standard output stream.
index 77a00693ea38eda4fa0a4a89c369d13747fb781d..23e94a50394555a6ff698d1f7121f52372ce5d00 100644 (file)
@@ -323,6 +323,26 @@ execute_gdb_command (PyObject *self, PyObject *args)
   Py_RETURN_NONE;
 }
 
+/* Parse a string and evaluate it as an expression.  */
+static PyObject *
+gdbpy_parse_and_eval (PyObject *self, PyObject *args)
+{
+  char *expr_str;
+  struct value *result = NULL;
+  volatile struct gdb_exception except;
+
+  if (!PyArg_ParseTuple (args, "s", &expr_str))
+    return NULL;
+
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    {
+      result = parse_and_eval (expr_str);
+    }
+  GDB_PY_HANDLE_EXCEPTION (except);
+
+  return value_to_value_object (result);
+}
+
 \f
 
 /* Printing.  */
@@ -680,6 +700,11 @@ Return a string explaining unwind stop reason." },
     "lookup_type (name [, block]) -> type\n\
 Return a Type corresponding to the given name." },
 
+  { "parse_and_eval", gdbpy_parse_and_eval, METH_VARARGS,
+    "parse_and_eval (String) -> Value.\n\
+Parse String as an expression, evaluate it, and return the result as a Value."
+  },
+
   { "write", gdbpy_write, METH_VARARGS,
     "Write a string using gdb's filtered stream." },
   { "flush", gdbpy_flush, METH_NOARGS,
index 9c95f3ff022eb26ce73bd23e81d27beb7a59dddd..4ad760e0ea438eda0c38c61fcb6177e0adf24c0b 100644 (file)
@@ -1,3 +1,8 @@
+2009-12-03  Tom Tromey  <tromey@redhat.com>
+
+       * gdb.python/py-value.exp (test_parse_and_eval): New
+       function.
+
 2009-12-03  Paul Pluzhnikov  <ppluzhnikov@google.com>
 
        PR gdb/11022
index 29582339961ced3b87038d6f3981dc51856c435c..01f6023f2eff8638d21d777eb75a2fc48733129b 100644 (file)
@@ -361,6 +361,17 @@ proc test_subscript_regression {lang} {
  gdb_test "python print marray\[1\]\[2\]" "o." "Test multiple subscript"
 }
 
+# A few tests of gdb.parse_and_eval.
+proc test_parse_and_eval {} {
+  gdb_test "python print gdb.parse_and_eval ('23')" "23" \
+    "parse_and_eval constant test"
+  gdb_test "python print gdb.parse_and_eval ('5 + 7')" "12" \
+    "parse_and_eval simple expression test"
+  gdb_test "python print type(gdb.parse_and_eval ('5 + 7'))" \
+    ".type 'gdb.Value'."\
+    "parse_and_eval type test"
+}
+
 # Start with a fresh gdb.
 
 gdb_exit
@@ -381,6 +392,7 @@ test_value_numeric_ops
 test_value_boolean
 test_value_compare
 test_objfiles
+test_parse_and_eval
 
 # The following tests require execution.