new api class: SBFile

Summary:
SBFile is a scripting API wrapper for lldb_private::File

This is the first step in a project to enable arbitrary python
io.IOBase file objects -- including those that override the read()
and write() methods -- to be used as the main debugger IOStreams.

Currently this is impossible because python file objects must first
be converted into FILE* streams by SWIG in order to be passed into
the debugger.

full prototype: https://github.com/smoofra/llvm-project/tree/files

Reviewers: JDevlieghere, jasonmolenda, zturner, jingham, labath

Reviewed By: labath

Subscribers: labath, mgorny, lldb-commits

Tags: #lldb

Differential Revision: https://reviews.llvm.org/D67793

llvm-svn: 373562
This commit is contained in:
Lawrence D'Anna
2019-10-03 04:01:07 +00:00
parent f13b8d4fe9
commit 5750453020
16 changed files with 428 additions and 25 deletions

View File

@@ -949,7 +949,6 @@ PythonFile::PythonFile() : PythonObject() {}
PythonFile::PythonFile(File &file, const char *mode) { Reset(file, mode); }
PythonFile::PythonFile(PyRefType type, PyObject *o) { Reset(type, o); }
PythonFile::~PythonFile() {}
@@ -1014,22 +1013,6 @@ void PythonFile::Reset(File &file, const char *mode) {
#endif
}
uint32_t PythonFile::GetOptionsFromMode(llvm::StringRef mode) {
if (mode.empty())
return 0;
return llvm::StringSwitch<uint32_t>(mode.str())
.Case("r", File::eOpenOptionRead)
.Case("w", File::eOpenOptionWrite)
.Case("a", File::eOpenOptionWrite | File::eOpenOptionAppend |
File::eOpenOptionCanCreate)
.Case("r+", File::eOpenOptionRead | File::eOpenOptionWrite)
.Case("w+", File::eOpenOptionRead | File::eOpenOptionWrite |
File::eOpenOptionCanCreate | File::eOpenOptionTruncate)
.Case("a+", File::eOpenOptionRead | File::eOpenOptionWrite |
File::eOpenOptionAppend | File::eOpenOptionCanCreate)
.Default(0);
}
FileUP PythonFile::GetUnderlyingFile() const {
if (!IsValid())
@@ -1038,7 +1021,7 @@ FileUP PythonFile::GetUnderlyingFile() const {
// We don't own the file descriptor returned by this function, make sure the
// File object knows about that.
PythonString py_mode = GetAttributeValue("mode").AsType<PythonString>();
auto options = PythonFile::GetOptionsFromMode(py_mode.GetString());
auto options = File::GetOptionsFromMode(py_mode.GetString());
auto file = std::make_unique<File>(PyObject_AsFileDescriptor(m_py_obj),
options, false);
if (!file->IsValid())