aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhil Muldoon <pmuldoon@redhat.com>2011-03-18 08:44:47 +0000
committerPhil Muldoon <pmuldoon@redhat.com>2011-03-18 08:44:47 +0000
commit99c3dc11e424a5f6cc9749fabd34f8c0d80cac9f (patch)
tree19df7ea1eadefc9afc0a06fe63720c751a35b4dd
parentc20800befe98654599697c9bae2a69359ef5d0d0 (diff)
downloadgdb-99c3dc11e424a5f6cc9749fabd34f8c0d80cac9f.zip
gdb-99c3dc11e424a5f6cc9749fabd34f8c0d80cac9f.tar.gz
gdb-99c3dc11e424a5f6cc9749fabd34f8c0d80cac9f.tar.bz2
2011-03-18 Phil Muldoon <pmuldoon@redhat.com>
PR python/12149 * python/python.c (gdbpy_write): Accept a stream argument and operate to the appropriate stream. (gdbpy_flush): Likewise. (_initialize_python): Add stream constants. (finish_python_initialization): Add GdbOutputErrorFile class. 2011-03-18 Phil Muldoon <pmuldoon@redhat.com> PR python/12149 * gdb.texinfo (Basic Python): Update gdb.write and flush text. 2011-03-18 Phil Muldoon <pmuldoon@redhat.com> PR python/12149 * gdb.python/python.exp: Add gdb.write tests.
-rw-r--r--gdb/ChangeLog10
-rw-r--r--gdb/doc/ChangeLog6
-rw-r--r--gdb/doc/gdb.texinfo60
-rw-r--r--gdb/python/python.c95
-rw-r--r--gdb/testsuite/ChangeLog6
-rw-r--r--gdb/testsuite/gdb.python/python.exp8
6 files changed, 165 insertions, 20 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 5fbbf2d..84d2e57 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,13 @@
+2011-03-18 Phil Muldoon <pmuldoon@redhat.com>
+
+ PR python/12149
+
+ * python/python.c (gdbpy_write): Accept a stream argument and
+ operate to the appropriate stream.
+ (gdbpy_flush): Likewise.
+ (_initialize_python): Add stream constants.
+ (finish_python_initialization): Add GdbOutputErrorFile class.
+
2011-03-18 Kwok Cheung Yeung <kcy@codesourcery.com>
* MAINTAINERS: Add myself as a write-after-approval maintainer.
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index 658325e..d3527de 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,9 @@
+2011-03-18 Phil Muldoon <pmuldoon@redhat.com>
+
+ PR python/12149
+
+ * gdb.texinfo (Basic Python): Update gdb.write and flush text.
+
2011-03-17 Phil Muldoon <pmuldoon@redhat.com>
* gdb.texinfo (Blocks In Python): Add is_valid method description.
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index ea1e2f5..fcbbd6c 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -20877,18 +20877,64 @@ this. For example:
@end smallexample
@end defun
-@findex gdb.write
-@defun write string
-Print a string to @value{GDBN}'s paginated standard output stream.
+@findex gdb.write
+@defun write string @r{[}stream{]}
+Print a string to @value{GDBN}'s paginated output stream. The
+optional @var{stream} determines the stream to print to. The default
+stream is @value{GDBN}'s standard output stream. Possible stream
+values are:
+
+@table @code
+@findex STDOUT
+@findex gdb.STDOUT
+@item STDOUT
+@value{GDBN}'s standard output stream.
+
+@findex STDERR
+@findex gdb.STDERR
+@item STDERR
+@value{GDBN}'s standard error stream.
+
+@findex STDLOG
+@findex gdb.STDLOG
+@item STDLOG
+@value{GDBN}'s log stream (@pxref{Logging Output}).
+@end table
+
Writing to @code{sys.stdout} or @code{sys.stderr} will automatically
-call this function.
+call this function and will automatically direct the output to the
+relevant stream.
@end defun
@findex gdb.flush
@defun flush
-Flush @value{GDBN}'s paginated standard output stream. Flushing
-@code{sys.stdout} or @code{sys.stderr} will automatically call this
-function.
+Flush the buffer of a @value{GDBN} paginated stream so that the
+contents are displayed immediately. @value{GDBN} will flush the
+contents of a stream automatically when it encounters a newline in the
+buffer. The optional @var{stream} determines the stream to flush. The
+default stream is @value{GDBN}'s standard output stream. Possible
+stream values are:
+
+@table @code
+@findex STDOUT
+@findex gdb.STDOUT
+@item STDOUT
+@value{GDBN}'s standard output stream.
+
+@findex STDERR
+@findex gdb.STDERR
+@item STDERR
+@value{GDBN}'s standard error stream.
+
+@findex STDLOG
+@findex gdb.STDLOG
+@item STDLOG
+@value{GDBN}'s log stream (@pxref{Logging Output}).
+
+@end table
+
+Flushing @code{sys.stdout} or @code{sys.stderr} will automatically
+call this function for the relevant stream.
@end defun
@findex gdb.target_charset
diff --git a/gdb/python/python.c b/gdb/python/python.c
index 2d7213a..90d5dc8 100644
--- a/gdb/python/python.c
+++ b/gdb/python/python.c
@@ -681,23 +681,69 @@ gdbpy_initialize_events (void)
/* Printing. */
/* A python function to write a single string using gdb's filtered
- output stream. */
+ output stream . The optional keyword STREAM can be used to write
+ to a particular stream. The default stream is to gdb_stdout. */
+
static PyObject *
-gdbpy_write (PyObject *self, PyObject *args)
+gdbpy_write (PyObject *self, PyObject *args, PyObject *kw)
{
char *arg;
-
- if (! PyArg_ParseTuple (args, "s", &arg))
+ static char *keywords[] = {"text", "stream", NULL };
+ int stream_type = 0;
+
+ if (! PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &arg,
+ &stream_type))
return NULL;
- printf_filtered ("%s", arg);
+
+ switch (stream_type)
+ {
+ case 1:
+ {
+ fprintf_filtered (gdb_stderr, "%s", arg);
+ break;
+ }
+ case 2:
+ {
+ fprintf_filtered (gdb_stdlog, "%s", arg);
+ break;
+ }
+ default:
+ fprintf_filtered (gdb_stdout, "%s", arg);
+ }
+
Py_RETURN_NONE;
}
-/* A python function to flush gdb's filtered output stream. */
+/* A python function to flush a gdb stream. The optional keyword
+ STREAM can be used to flush a particular stream. The default stream
+ is gdb_stdout. */
+
static PyObject *
-gdbpy_flush (PyObject *self, PyObject *args)
+gdbpy_flush (PyObject *self, PyObject *args, PyObject *kw)
{
- gdb_flush (gdb_stdout);
+ static char *keywords[] = {"stream", NULL };
+ int stream_type = 0;
+
+ if (! PyArg_ParseTupleAndKeywords (args, kw, "|i", keywords,
+ &stream_type))
+ return NULL;
+
+ switch (stream_type)
+ {
+ case 1:
+ {
+ gdb_flush (gdb_stderr);
+ break;
+ }
+ case 2:
+ {
+ gdb_flush (gdb_stdlog);
+ break;
+ }
+ default:
+ gdb_flush (gdb_stdout);
+ }
+
Py_RETURN_NONE;
}
@@ -975,6 +1021,11 @@ Enables or disables printing of Python stack traces."),
PyModule_AddStringConstant (gdb_module, "TARGET_CONFIG",
(char*) target_name);
+ /* Add stream constants. */
+ PyModule_AddIntConstant (gdb_module, "STDOUT", 0);
+ PyModule_AddIntConstant (gdb_module, "STDERR", 1);
+ PyModule_AddIntConstant (gdb_module, "STDLOG", 2);
+
/* gdb.parameter ("data-directory") doesn't necessarily exist when the python
script below is run (depending on order of _initialize_* functions).
Define the initial value of gdb.PYTHONDIR here. */
@@ -1068,7 +1119,7 @@ class GdbOutputFile:\n\
return False\n\
\n\
def write(self, s):\n\
- gdb.write(s)\n\
+ gdb.write(s, stream=gdb.STDOUT)\n \
\n\
def writelines(self, iterable):\n\
for line in iterable:\n\
@@ -1077,9 +1128,28 @@ class GdbOutputFile:\n\
def flush(self):\n\
gdb.flush()\n\
\n\
-sys.stderr = GdbOutputFile()\n\
sys.stdout = GdbOutputFile()\n\
\n\
+class GdbOutputErrorFile:\n\
+ def close(self):\n\
+ # Do nothing.\n\
+ return None\n\
+\n\
+ def isatty(self):\n\
+ return False\n\
+\n\
+ def write(self, s):\n\
+ gdb.write(s, stream=gdb.STDERR)\n \
+\n\
+ def writelines(self, iterable):\n\
+ for line in iterable:\n\
+ self.write(line)\n \
+\n\
+ def flush(self):\n\
+ gdb.flush()\n\
+\n\
+sys.stderr = GdbOutputErrorFile()\n\
+\n\
# Ideally this would live in the gdb module, but it's intentionally written\n\
# in python, and we need this to bootstrap the gdb module.\n\
\n\
@@ -1199,10 +1269,9 @@ Return the name of the current target wide charset." },
Parse String and return an argv-like array.\n\
Arguments are separate by spaces and may be quoted."
},
-
- { "write", gdbpy_write, METH_VARARGS,
+ { "write", (PyCFunction)gdbpy_write, METH_VARARGS | METH_KEYWORDS,
"Write a string using gdb's filtered stream." },
- { "flush", gdbpy_flush, METH_NOARGS,
+ { "flush", (PyCFunction)gdbpy_flush, METH_VARARGS | METH_KEYWORDS,
"Flush gdb's filtered stdout stream." },
{ "selected_thread", gdbpy_selected_thread, METH_NOARGS,
"selected_thread () -> gdb.InferiorThread.\n\
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index ded9d94..a1f1382 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2011-03-18 Phil Muldoon <pmuldoon@redhat.com>
+
+ PR python/12149
+
+ * gdb.python/python.exp: Add gdb.write tests.
+
2010-03-17 Phil Muldoon <pmuldoon@redhat.com>
* gdb.python/Makefile.in: Add py-objfile.
diff --git a/gdb/testsuite/gdb.python/python.exp b/gdb/testsuite/gdb.python/python.exp
index ece77ca..a68dd24 100644
--- a/gdb/testsuite/gdb.python/python.exp
+++ b/gdb/testsuite/gdb.python/python.exp
@@ -170,3 +170,11 @@ gdb_test "python print len(symtab)" "2" "Test decode_line func1 length"
gdb_test "python print len(symtab\[1\])" "1" "Test decode_line func1 length"
gdb_test "python print symtab\[1\]\[0\].symtab" "gdb/testsuite/gdb.python/python-1.c.*" "Test decode_line func1 filename"
gdb_test "python print symtab\[1\]\[0\].line" "19" "Test decode_line func1 line number"
+
+# gdb.write
+gdb_test "python print sys.stderr" ".*__main__.GdbOutputErrorFile instance at.*" "Test stderr location"
+gdb_test "python print sys.stdout" ".*__main__.GdbOutputFile instance at.*" "Test stdout location"
+gdb_test "python gdb.write(\"Foo\\n\")" "Foo" "Test default write"
+gdb_test "python gdb.write(\"Error stream\\n\", stream=gdb.STDERR)" "Error stream" "Test stderr write"
+gdb_test "python gdb.write(\"Normal stream\\n\", stream=gdb.STDOUT)" "Normal stream" "Test stdout write"
+gdb_test "python gdb.write(\"Log stream\\n\", stream=gdb.STDLOG)" "Log stream" "Test stdlog write"