zturner created this revision. zturner added reviewers: clayborg, granata.enrico. zturner added a subscriber: lldb-commits.
Python 3's native API has a number of incompatibilities with Python 2's. Most of these incompatibilities are hidden inside of the various `PythonObject` classes, but our swig typemaps and interfaces use Python native APIs directly. This patch addresses the first of these incompatibilities, the use of `PyString_FromStringAndSize`. It is fixed by changing these to use `PythonString. It's possible more work may need to be done here in the future because there are still numerous calls to native Python APIs from the swig typemaps, but for now this is the minimum amount of work necessary to get a successful compilation under Python 3. The second of these incompatibilities, the use of various `PyFile_xxx` functions, will be addressed in a followup patch. http://reviews.llvm.org/D13706 Files: scripts/Python/python-extensions.swig scripts/Python/python-typemaps.swig scripts/lldb.swig source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
Index: source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp =================================================================== --- source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp +++ source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp @@ -478,7 +478,7 @@ int fd = fileno(fp); #endif - return PyRef(PyRefType::Owned, + return PythonObject(PyRefType::Owned, PyFile_FromFd(fd, nullptr, cmode, -1, nullptr, "ignore", nullptr, 0)); #else // Read through the Python source, doesn't seem to modify these strings Index: source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h =================================================================== --- source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h +++ source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h @@ -122,7 +122,7 @@ { // Avoid calling the virtual method if it's not necessary // to actually validate the type of the PyObject. - if (!rhs.get()) + if (!rhs.IsValid()) Reset(); else Reset(PyRefType::Borrowed, rhs.m_py_obj); @@ -167,12 +167,21 @@ Dump (Stream &strm) const; PyObject* - get () const + get() const { return m_py_obj; } - PyObjectType GetObjectType() const; + PyObject* + release() + { + PyObject *result = m_py_obj; + m_py_obj = nullptr; + return result; + } + + PyObjectType + GetObjectType() const; PythonString Repr (); Index: scripts/lldb.swig =================================================================== --- scripts/lldb.swig +++ scripts/lldb.swig @@ -111,8 +111,9 @@ #include "lldb/API/SBWatchpoint.h" #include "lldb/API/SBUnixSignals.h" -#include "../scripts/Python/python-swigsafecast.swig" +#include "../source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h" +#include "../scripts/Python/python-swigsafecast.swig" %} /* Various liblldb typedefs that SWIG needs to know about. */ @@ -121,6 +122,7 @@ as INT32_MAX should only be defined if __STDC_LIMIT_MACROS is. */ #define __STDC_LIMIT_MACROS %include "stdint.i" + %include "lldb/lldb-defines.h" %include "lldb/lldb-enumerations.h" %include "lldb/lldb-forward.h" Index: scripts/Python/python-typemaps.swig =================================================================== --- scripts/Python/python-typemaps.swig +++ scripts/Python/python-typemaps.swig @@ -63,10 +63,10 @@ int i; len = 0; while ($1[len]) len++; - $result = PyList_New(len); - for (i = 0; i < len; i++) { - PyList_SetItem($result, i, PyString_FromString($1[i])); - } + lldb_private::PythonList list(len); + for (i = 0; i < len; i++) + list.SetItemAtIndex(i, lldb_private::PythonString($1[i])); + $result = list.release(); } %typemap(in) char const ** { @@ -147,7 +147,8 @@ // See also SBThread::GetStopDescription. %typemap(argout) (char *dst, size_t dst_len) { Py_XDECREF($result); /* Blow away any previous result */ - $result = PyString_FromStringAndSize(($1),result); + lldb_private::PythonString str($1); + $result = str.release(); free($1); } @@ -237,7 +238,9 @@ // See also SBProcess::ReadMemory. %typemap(argout) (void *buf, size_t size) { Py_XDECREF($result); /* Blow away any previous result */ - $result = PyString_FromStringAndSize(static_cast<const char*>($1),result); + llvm::StringRef ref(static_cast<const char*>($1), result); + lldb_private::PythonString string(ref); + $result = string.release(); free($1); } Index: scripts/Python/python-extensions.swig =================================================================== --- scripts/Python/python-extensions.swig +++ scripts/Python/python-extensions.swig @@ -8,9 +8,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } %extend lldb::SBBlock { @@ -22,9 +22,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } %extend lldb::SBBreakpoint { @@ -36,9 +36,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } %pythoncode %{ @@ -65,9 +65,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } @@ -96,9 +96,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } /* the write() and flush() calls are not part of the SB API proper, and are solely for Python usage @@ -123,9 +123,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } %pythoncode %{ def __eq__(self, rhs): @@ -150,9 +150,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } %extend lldb::SBDebugger { @@ -164,9 +164,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } %extend lldb::SBDeclaration { @@ -178,9 +178,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } %pythoncode %{ @@ -207,9 +207,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } %extend lldb::SBFileSpec { @@ -221,9 +221,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } %extend lldb::SBFrame { @@ -235,9 +235,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } %extend lldb::SBFunction { @@ -249,9 +249,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } %pythoncode %{ @@ -278,9 +278,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } %extend lldb::SBInstructionList { @@ -292,9 +292,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } %extend lldb::SBLineEntry { @@ -306,9 +306,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } %pythoncode %{ @@ -334,9 +334,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } %pythoncode %{ @@ -363,9 +363,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } @@ -378,9 +378,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } @@ -393,9 +393,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } %extend lldb::SBSection { @@ -407,9 +407,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } %pythoncode %{ @@ -449,9 +449,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } %pythoncode %{ def __eq__(self, rhs): @@ -476,9 +476,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } %extend lldb::SBSymbolContextList { @@ -490,9 +490,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } @@ -505,9 +505,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } %pythoncode %{ @@ -534,9 +534,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } %extend lldb::SBTypeCategory { @@ -548,9 +548,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } %extend lldb::SBTypeFilter { @@ -562,9 +562,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } %pythoncode %{ def __eq__(self, rhs): @@ -589,9 +589,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } %extend lldb::SBTypeMember { @@ -603,9 +603,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } %extend lldb::SBTypeEnumMember { @@ -617,9 +617,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } %extend lldb::SBTypeNameSpecifier { @@ -631,9 +631,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } %pythoncode %{ def __eq__(self, rhs): @@ -658,9 +658,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } %pythoncode %{ def __eq__(self, rhs): @@ -685,9 +685,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } %pythoncode %{ def __eq__(self, rhs): @@ -712,9 +712,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } %pythoncode %{ def __eq__(self, rhs): @@ -739,9 +739,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } %extend lldb::SBValueList { @@ -762,9 +762,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } } %extend lldb::SBWatchpoint { @@ -776,9 +776,9 @@ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) --desc_len; if (desc_len > 0) - return PyString_FromStringAndSize (desc, desc_len); + return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); else - return PyString_FromString(""); + return lldb_private::PythonString("").release(); } }
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits