Fix flush for sys.stderr

GDB overwrites Python's sys.stdout and sys.stderr, but does not
properly implement the 'flush' method -- it only ever will flush
stdout.  This patch fixes the bug.  I couldn't find a straightforward
way to write a test for this.
This commit is contained in:
Tom Tromey
2022-08-15 12:45:43 -06:00
parent dd083c6524
commit 2d83dd6939
2 changed files with 9 additions and 14 deletions

View File

@ -39,6 +39,9 @@ class _GdbFile(object):
encoding = "UTF-8"
errors = "strict"
def __init__(self, stream):
self.stream = stream
def close(self):
# Do nothing.
return None
@ -51,23 +54,15 @@ class _GdbFile(object):
self.write(line)
def flush(self):
flush()
flush(stream=self.stream)
class _GdbOutputFile(_GdbFile):
def write(self, s):
write(s, stream=STDOUT)
write(s, stream=self.stream)
sys.stdout = _GdbOutputFile()
sys.stdout = _GdbFile(STDOUT)
class _GdbOutputErrorFile(_GdbFile):
def write(self, s):
write(s, stream=STDERR)
sys.stderr = _GdbOutputErrorFile()
sys.stderr = _GdbFile(STDERR)
# Default prompt hook does nothing.
prompt_hook = None

View File

@ -297,8 +297,8 @@ with_test_prefix "test decode_line" {
}
# gdb.write
gdb_test "python print (sys.stderr)" ".*gdb._GdbOutputErrorFile (instance|object) at.*" "test stderr location"
gdb_test "python print (sys.stdout)" ".*gdb._GdbOutputFile (instance|object) at.*" "test stdout location"
gdb_test "python print (sys.stderr)" ".*gdb._GdbFile (instance|object) at.*" "test stderr location"
gdb_test "python print (sys.stdout)" ".*gdb._GdbFile (instance|object) 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"