Introduce a PythonFile object, and use it everywhere.
Python file handling got an overhaul in Python 3, and it affects the way we have to interact with files. Notably: 1) `PyFile_FromFile` no longer exists, and instead we have to use `PyFile_FromFd`. This means having a way to get an fd from a FILE*. For this we reuse the lldb_private::File class to convert between FILE*s and fds, since there are some subtleties regarding ownership rules when FILE*s and fds refer to the same file. 2) PyFile is no longer a builtin type, so there is no such thing as `PyFile_Check`. Instead, files in Python 3 are just instances of `io.IOBase`. So the logic for checking if something is a file in Python 3 is to check if it is a subclass of that module. Additionally, some unit tests are added to verify that `PythonFile` works as expected on Python 2 and Python 3, and `ScriptInterpreterPython` is updated to use `PythonFile` instead of manual calls to the various `PyFile_XXX` methods. llvm-svn: 250444
This commit is contained in:
@@ -9,6 +9,8 @@
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
#include "lldb/Host/File.h"
|
||||
#include "lldb/Host/FileSystem.h"
|
||||
#include "lldb/Host/HostInfo.h"
|
||||
#include "Plugins/ScriptInterpreter/Python/lldb-python.h"
|
||||
#include "Plugins/ScriptInterpreter/Python/PythonDataObjects.h"
|
||||
@@ -373,3 +375,10 @@ TEST_F(PythonDataObjectsTest, TestPythonDictionaryToStructuredDictionary)
|
||||
EXPECT_STREQ(string_value0, string_sp->GetValue().c_str());
|
||||
EXPECT_EQ(int_value1, int_sp->GetValue());
|
||||
}
|
||||
|
||||
TEST_F(PythonDataObjectsTest, TestPythonFile)
|
||||
{
|
||||
File file(FileSystem::DEV_NULL, File::eOpenOptionRead);
|
||||
PythonFile py_file(file, "r");
|
||||
EXPECT_TRUE(PythonFile::Check(py_file.get()));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user