From: Phil Muldoon Date: Fri, 18 Mar 2011 08:44:47 +0000 (+0000) Subject: 2011-03-18 Phil Muldoon X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=99c3dc11e424a5f6cc9749fabd34f8c0d80cac9f;p=binutils-gdb.git 2011-03-18 Phil Muldoon 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 PR python/12149 * gdb.texinfo (Basic Python): Update gdb.write and flush text. 2011-03-18 Phil Muldoon PR python/12149 * gdb.python/python.exp: Add gdb.write tests. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5fbbf2dda41..84d2e572091 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2011-03-18 Phil Muldoon + + 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 * MAINTAINERS: Add myself as a write-after-approval maintainer. diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 658325ef08c..d3527de354d 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,9 @@ +2011-03-18 Phil Muldoon + + PR python/12149 + + * gdb.texinfo (Basic Python): Update gdb.write and flush text. + 2011-03-17 Phil Muldoon * gdb.texinfo (Blocks In Python): Add is_valid method description. diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index ea1e2f5a5f4..fcbbd6c2680 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 2d7213a8c2e..90d5dc88942 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 ded9d9481a3..a1f1382d85f 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-03-18 Phil Muldoon + + PR python/12149 + + * gdb.python/python.exp: Add gdb.write tests. + 2010-03-17 Phil Muldoon * gdb.python/Makefile.in: Add py-objfile. diff --git a/gdb/testsuite/gdb.python/python.exp b/gdb/testsuite/gdb.python/python.exp index ece77ca695b..a68dd241296 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"