aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Plugins/ScriptInterpreter/Python
diff options
context:
space:
mode:
authorDavid Spickett <david.spickett@linaro.org>2025-01-29 09:56:41 +0000
committerGitHub <noreply@github.com>2025-01-29 09:56:41 +0000
commit9ea64dd8781328d831d7c69a586f0c84dece1c11 (patch)
treec2fbaec5a5874a01e06695db85cf12071e1b9891 /lldb/source/Plugins/ScriptInterpreter/Python
parent776ef9d1bec66875c554e8a5bd0e3ae8c9543d9a (diff)
downloadllvm-9ea64dd8781328d831d7c69a586f0c84dece1c11.zip
llvm-9ea64dd8781328d831d7c69a586f0c84dece1c11.tar.gz
llvm-9ea64dd8781328d831d7c69a586f0c84dece1c11.tar.bz2
[lldb] Make Python >= 3.8 required for LLDB 21 (#124735)
As decided on https://discourse.llvm.org/t/rfc-lets-document-and-enforce-a-minimum-python-version-for-lldb/82731. LLDB 20 recommended `>= 3.8` but did not remove support for anything earlier. Now we are in what will become LLDB 21, so I'm removing that support and making `>= 3.8` required. See https://docs.python.org/3/c-api/apiabiversion.html#c.PY_VERSION_HEX for the format of PY_VERSION_HEX.
Diffstat (limited to 'lldb/source/Plugins/ScriptInterpreter/Python')
-rw-r--r--lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp59
-rw-r--r--lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp27
-rw-r--r--lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h4
3 files changed, 4 insertions, 86 deletions
diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp
index a0f8cf9..1340425 100644
--- a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp
+++ b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp
@@ -73,10 +73,8 @@ Expected<std::string> python::As<std::string>(Expected<PythonObject> &&obj) {
static bool python_is_finalizing() {
#if PY_VERSION_HEX >= 0x030d0000
return Py_IsFinalizing();
-#elif PY_VERSION_HEX >= 0x03070000
- return _Py_IsFinalizing();
#else
- return _Py_Finalizing != nullptr;
+ return _Py_IsFinalizing();
#endif
}
@@ -810,7 +808,6 @@ bool PythonCallable::Check(PyObject *py_obj) {
return PyCallable_Check(py_obj);
}
-#if PY_VERSION_HEX >= 0x03030000
static const char get_arg_info_script[] = R"(
from inspect import signature, Parameter, ismethod
from collections import namedtuple
@@ -832,15 +829,12 @@ def main(f):
raise Exception(f'unknown parameter kind: {kind}')
return ArgInfo(count, varargs)
)";
-#endif
Expected<PythonCallable::ArgInfo> PythonCallable::GetArgInfo() const {
ArgInfo result = {};
if (!IsValid())
return nullDeref();
-#if PY_VERSION_HEX >= 0x03030000
-
// no need to synchronize access to this global, we already have the GIL
static PythonScript get_arg_info(get_arg_info_script);
Expected<PythonObject> pyarginfo = get_arg_info(*this);
@@ -852,57 +846,6 @@ Expected<PythonCallable::ArgInfo> PythonCallable::GetArgInfo() const {
cantFail(As<bool>(pyarginfo.get().GetAttribute("has_varargs")));
result.max_positional_args = has_varargs ? ArgInfo::UNBOUNDED : count;
-#else
- PyObject *py_func_obj;
- bool is_bound_method = false;
- bool is_class = false;
-
- if (PyType_Check(m_py_obj) || PyClass_Check(m_py_obj)) {
- auto init = GetAttribute("__init__");
- if (!init)
- return init.takeError();
- py_func_obj = init.get().get();
- is_class = true;
- } else {
- py_func_obj = m_py_obj;
- }
-
- if (PyMethod_Check(py_func_obj)) {
- py_func_obj = PyMethod_GET_FUNCTION(py_func_obj);
- PythonObject im_self = GetAttributeValue("im_self");
- if (im_self.IsValid() && !im_self.IsNone())
- is_bound_method = true;
- } else {
- // see if this is a callable object with an __call__ method
- if (!PyFunction_Check(py_func_obj)) {
- PythonObject __call__ = GetAttributeValue("__call__");
- if (__call__.IsValid()) {
- auto __callable__ = __call__.AsType<PythonCallable>();
- if (__callable__.IsValid()) {
- py_func_obj = PyMethod_GET_FUNCTION(__callable__.get());
- PythonObject im_self = __callable__.GetAttributeValue("im_self");
- if (im_self.IsValid() && !im_self.IsNone())
- is_bound_method = true;
- }
- }
- }
- }
-
- if (!py_func_obj)
- return result;
-
- PyCodeObject *code = (PyCodeObject *)PyFunction_GET_CODE(py_func_obj);
- if (!code)
- return result;
-
- auto count = code->co_argcount;
- bool has_varargs = !!(code->co_flags & CO_VARARGS);
- result.max_positional_args =
- has_varargs ? ArgInfo::UNBOUNDED
- : (count - (int)is_bound_method) - (int)is_class;
-
-#endif
-
return result;
}
diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
index ef3c53c..e78e606 100644
--- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
+++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
@@ -70,8 +70,7 @@ extern "C" PyObject *PyInit__lldb(void);
// Don't mess with the signal handlers on Windows.
#define LLDB_USE_PYTHON_SET_INTERRUPT 0
#else
-// PyErr_SetInterrupt was introduced in 3.2.
-#define LLDB_USE_PYTHON_SET_INTERRUPT PY_VERSION_HEX >= 0x03020000
+#define LLDB_USE_PYTHON_SET_INTERRUPT 1
#endif
static ScriptInterpreterPythonImpl *GetPythonInterpreter(Debugger &debugger) {
@@ -91,10 +90,8 @@ namespace {
struct InitializePythonRAII {
public:
InitializePythonRAII() {
-#if PY_VERSION_HEX >= 0x03080000
PyConfig config;
PyConfig_InitPythonConfig(&config);
-#endif
#if LLDB_EMBED_PYTHON_HOME
static std::string g_python_home = []() -> std::string {
@@ -108,14 +105,7 @@ public:
return spec.GetPath();
}();
if (!g_python_home.empty()) {
-#if PY_VERSION_HEX >= 0x03080000
PyConfig_SetBytesString(&config, &config.home, g_python_home.c_str());
-#else
- size_t size = 0;
- wchar_t *python_home_w = Py_DecodeLocale(g_python_home.c_str(), &size);
- Py_SetPythonHome(python_home_w);
- PyMem_RawFree(python_home_w);
-#endif
}
#endif
@@ -142,23 +132,10 @@ public:
PyImport_AppendInittab("_lldb", LLDBSwigPyInit);
}
-#if PY_VERSION_HEX >= 0x03080000
config.install_signal_handlers = 0;
Py_InitializeFromConfig(&config);
PyConfig_Clear(&config);
InitializeThreadsPrivate();
-#else
-// Python < 3.2 and Python >= 3.2 reversed the ordering requirements for
-// calling `Py_Initialize` and `PyEval_InitThreads`. < 3.2 requires that you
-// call `PyEval_InitThreads` first, and >= 3.2 requires that you call it last.
-#if PY_VERSION_HEX >= 0x03020000
- Py_InitializeEx(0);
- InitializeThreadsPrivate();
-#else
- InitializeThreadsPrivate();
- Py_InitializeEx(0);
-#endif
-#endif
}
~InitializePythonRAII() {
@@ -181,11 +158,9 @@ private:
// would always return `true` and `PyGILState_Ensure/Release` flow would be
// executed instead of unlocking GIL with `PyEval_SaveThread`. When
// an another thread calls `PyGILState_Ensure` it would get stuck in deadlock.
-#if PY_VERSION_HEX >= 0x03070000
// The only case we should go further and acquire the GIL: it is unlocked.
if (PyGILState_Check())
return;
-#endif
// `PyEval_ThreadsInitialized` was deprecated in Python 3.9 and removed in
// Python 3.13. It has been returning `true` always since Python 3.7.
diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h b/lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h
index b68598b..4a6c11d 100644
--- a/lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h
+++ b/lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h
@@ -50,8 +50,8 @@ static llvm::Expected<bool> *g_fcxx_modules_workaround [[maybe_unused]];
// Provide a meaningful diagnostic error if someone tries to compile this file
// with a version of Python we don't support.
-static_assert(PY_VERSION_HEX >= 0x03000000,
- "LLDB requires at least Python 3.0");
+static_assert(PY_VERSION_HEX >= 0x03080000,
+ "LLDB requires at least Python 3.8");
#endif
#endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_LLDB_PYTHON_H