lawrence_danna created this revision.
lawrence_danna added reviewers: JDevlieghere, jasonmolenda, labath.
Herald added a project: LLDB.
This patch removes FILE* and replaces it with SBFile and FileSP the
SWIG interface for `SBStream.i`. And this is the last one. With
this change, nothing in the python API will can access a FILE* method
on the C++ side.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D68960
Files:
lldb/include/lldb/API/SBStream.h
lldb/packages/Python/lldbsuite/test/python_api/file_handle/TestFileHandle.py
lldb/scripts/interface/SBStream.i
lldb/source/API/SBStream.cpp
Index: lldb/source/API/SBStream.cpp
===================================================================
--- lldb/source/API/SBStream.cpp
+++ lldb/source/API/SBStream.cpp
@@ -9,6 +9,7 @@
#include "lldb/API/SBStream.h"
#include "SBReproducerPrivate.h"
+#include "lldb/API/SBFile.h"
#include "lldb/Core/StreamFile.h"
#include "lldb/Host/FileSystem.h"
#include "lldb/Utility/Status.h"
@@ -108,8 +109,19 @@
void SBStream::RedirectToFileHandle(FILE *fh, bool transfer_fh_ownership) {
LLDB_RECORD_METHOD(void, SBStream, RedirectToFileHandle, (FILE *, bool), fh,
transfer_fh_ownership);
+ FileSP file = std::make_unique<NativeFile>(fh, transfer_fh_ownership);
+ return RedirectToFile(file);
+}
+
+void SBStream::RedirectToFile(SBFile file) {
+ LLDB_RECORD_METHOD(void, SBStream, RedirectToFile, (SBFile), file)
+ RedirectToFile(file.GetFile());
+}
+
+void SBStream::RedirectToFile(FileSP file_sp) {
+ LLDB_RECORD_METHOD(void, SBStream, RedirectToFile, (FileSP), file_sp);
- if (fh == nullptr)
+ if (!file_sp || !file_sp->IsValid())
return;
std::string local_data;
@@ -120,7 +132,7 @@
local_data = static_cast<StreamString *>(m_opaque_up.get())->GetString();
}
- m_opaque_up = std::make_unique<StreamFile>(fh, transfer_fh_ownership);
+ m_opaque_up = std::make_unique<StreamFile>(file_sp);
m_is_file = true;
// If we had any data locally in our StreamString, then pass that along to
@@ -184,6 +196,8 @@
LLDB_REGISTER_METHOD(const char *, SBStream, GetData, ());
LLDB_REGISTER_METHOD(size_t, SBStream, GetSize, ());
LLDB_REGISTER_METHOD(void, SBStream, RedirectToFile, (const char *, bool));
+ LLDB_REGISTER_METHOD(void, SBStream, RedirectToFile, (FileSP));
+ LLDB_REGISTER_METHOD(void, SBStream, RedirectToFile, (SBFile));
LLDB_REGISTER_METHOD(void, SBStream, RedirectToFileHandle, (FILE *, bool));
LLDB_REGISTER_METHOD(void, SBStream, RedirectToFileDescriptor, (int, bool));
LLDB_REGISTER_METHOD(void, SBStream, Clear, ());
Index: lldb/scripts/interface/SBStream.i
===================================================================
--- lldb/scripts/interface/SBStream.i
+++ lldb/scripts/interface/SBStream.i
@@ -75,7 +75,18 @@
RedirectToFile (const char *path, bool append);
void
- RedirectToFileHandle (FILE *fh, bool transfer_fh_ownership);
+ RedirectToFile (lldb::SBFile file);
+
+ void
+ RedirectToFile (lldb::FileSP file);
+
+ %extend {
+ %feature("autodoc", "DEPRECATED, use RedirectToFile");
+ void
+ RedirectToFileHandle (lldb::FileSP file, bool transfer_fh_ownership) {
+ self->RedirectToFile(file);
+ }
+ }
void
RedirectToFileDescriptor (int fd, bool transfer_fh_ownership);
Index: lldb/packages/Python/lldbsuite/test/python_api/file_handle/TestFileHandle.py
===================================================================
--- lldb/packages/Python/lldbsuite/test/python_api/file_handle/TestFileHandle.py
+++ lldb/packages/Python/lldbsuite/test/python_api/file_handle/TestFileHandle.py
@@ -889,3 +889,30 @@
sbf = self.debugger.GetInputFile()
if sys.version_info.major >= 3:
self.assertEqual(sbf.GetFile().fileno(), 0)
+
+
+ @add_test_categories(['pyapi'])
+ def test_sbstream(self):
+
+ with open(self.out_filename, 'w') as f:
+ stream = lldb.SBStream()
+ stream.RedirectToFile(f)
+ stream.Print("zork")
+ with open(self.out_filename, 'r') as f:
+ self.assertEqual(f.read().strip(), "zork")
+
+ with open(self.out_filename, 'w') as f:
+ stream = lldb.SBStream()
+ stream.RedirectToFileHandle(f, True)
+ stream.Print("Yendor")
+ with open(self.out_filename, 'r') as f:
+ self.assertEqual(f.read().strip(), "Yendor")
+
+ stream = lldb.SBStream()
+ f = open(self.out_filename, 'w')
+ stream.RedirectToFile(lldb.SBFile.Create(f, borrow=False))
+ stream.Print("Frobozz")
+ stream = None
+ self.assertTrue(f.closed)
+ with open(self.out_filename, 'r') as f:
+ self.assertEqual(f.read().strip(), "Frobozz")
Index: lldb/include/lldb/API/SBStream.h
===================================================================
--- lldb/include/lldb/API/SBStream.h
+++ lldb/include/lldb/API/SBStream.h
@@ -39,6 +39,10 @@
void RedirectToFile(const char *path, bool append);
+ void RedirectToFile(lldb::SBFile file);
+
+ void RedirectToFile(lldb::FileSP file);
+
void RedirectToFileHandle(FILE *fh, bool transfer_fh_ownership);
void RedirectToFileDescriptor(int fd, bool transfer_fh_ownership);
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits