[Lldb-commits] [lldb] [lldb][windows] fix command source hitting EOF (PR #194950)
Charles Zablit via lldb-commits
lldb-commits at lists.llvm.org
Wed May 6 10:38:12 PDT 2026
https://github.com/charles-zablit updated https://github.com/llvm/llvm-project/pull/194950
>From 30f9d0f33c94dd5038a926ce05eb83eef778c19b Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zablit at apple.com>
Date: Wed, 29 Apr 2026 21:18:38 +0100
Subject: [PATCH 1/2] [lldb][windows] fix command source hitting EOF
---
lldb/source/Host/common/File.cpp | 9 +++++++++
.../ScriptInterpreter/Python/io-command-source.test | 11 +++++++++++
2 files changed, 20 insertions(+)
create mode 100644 lldb/test/Shell/ScriptInterpreter/Python/io-command-source.test
diff --git a/lldb/source/Host/common/File.cpp b/lldb/source/Host/common/File.cpp
index 8346cc67ca445..546e09615b14c 100644
--- a/lldb/source/Host/common/File.cpp
+++ b/lldb/source/Host/common/File.cpp
@@ -356,6 +356,15 @@ FILE *NativeFile::GetStream() {
if (m_stream) {
m_own_stream = true;
m_own_descriptor = false;
+#ifdef _WIN32
+ // On Windows, the first fgets() fills the C-runtime's internal
+ // buffer with one large OS read, leaving the underlying fd at EOF.
+ // Code that later opens the same fd then immediately hits EOF.
+ // Disabling buffering here, before any I/O touches the stream, keeps
+ // the fd in sync with what has been logically consumed.
+ if ((m_options & OpenOptionsModeMask) == eOpenOptionReadOnly)
+ setvbuf(m_stream, nullptr, _IONBF, 0);
+#endif
}
}
}
diff --git a/lldb/test/Shell/ScriptInterpreter/Python/io-command-source.test b/lldb/test/Shell/ScriptInterpreter/Python/io-command-source.test
new file mode 100644
index 0000000000000..3ba97988d53fb
--- /dev/null
+++ b/lldb/test/Shell/ScriptInterpreter/Python/io-command-source.test
@@ -0,0 +1,11 @@
+# RUN: %lldb -o 'command source %s' 2>/dev/null | FileCheck %s
+
+# Verify that "script --language python --" inside "command source" correctly
+# reads subsequent lines as Python input rather than immediately seeing EOF.
+
+# CHECK: 255
+
+script --language python --
+variable = 250 + 5
+print(variable)
+quit()
>From a74ae6dfa7f2070379fc2624afb8e200ca32c600 Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zablit at apple.com>
Date: Wed, 6 May 2026 18:37:58 +0100
Subject: [PATCH 2/2] remove test and enable existing test
---
.../test/API/python_api/file_handle/TestFileHandle.py | 1 -
.../ScriptInterpreter/Python/io-command-source.test | 11 -----------
2 files changed, 12 deletions(-)
delete mode 100644 lldb/test/Shell/ScriptInterpreter/Python/io-command-source.test
diff --git a/lldb/test/API/python_api/file_handle/TestFileHandle.py b/lldb/test/API/python_api/file_handle/TestFileHandle.py
index eba758f5a5d28..1fa2d379ad95c 100644
--- a/lldb/test/API/python_api/file_handle/TestFileHandle.py
+++ b/lldb/test/API/python_api/file_handle/TestFileHandle.py
@@ -679,7 +679,6 @@ def test_stdout_file(self):
lines = [x for x in f.read().strip().split() if x != "7"]
self.assertEqual(lines, ["foobar"])
- @skipIf(hostoslist=["windows"])
def test_stdout_file_interactive(self):
"""Ensure when we read stdin from a file, outputs from python goes to the right I/O stream."""
with open(self.in_filename, "w") as f:
diff --git a/lldb/test/Shell/ScriptInterpreter/Python/io-command-source.test b/lldb/test/Shell/ScriptInterpreter/Python/io-command-source.test
deleted file mode 100644
index 3ba97988d53fb..0000000000000
--- a/lldb/test/Shell/ScriptInterpreter/Python/io-command-source.test
+++ /dev/null
@@ -1,11 +0,0 @@
-# RUN: %lldb -o 'command source %s' 2>/dev/null | FileCheck %s
-
-# Verify that "script --language python --" inside "command source" correctly
-# reads subsequent lines as Python input rather than immediately seeing EOF.
-
-# CHECK: 255
-
-script --language python --
-variable = 250 + 5
-print(variable)
-quit()
More information about the lldb-commits
mailing list