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 lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits