Jonas Devlieghere 9053767330
Remove Python 2 support from the ScriptInterpreter plugin
We dropped downstream support for Python 2 in the previous release. Now
that we have branched for the next release the window where this kind of
change could introduce conflicts is closing too. Start by getting rid of
Python 2 support in the Script Interpreter plugin.

Differential revision: https://reviews.llvm.org/D124429
2022-04-27 08:26:25 -07:00

66 lines
1.9 KiB
C++

#include "PythonReadline.h"
#ifdef LLDB_USE_LIBEDIT_READLINE_COMPAT_MODULE
#include <cstdio>
#include <editline/readline.h>
// Simple implementation of the Python readline module using libedit.
// In the event that libedit is excluded from the build, this turns
// back into a null implementation that blocks the module from pulling
// in the GNU readline shared lib, which causes linkage confusion when
// both readline and libedit's readline compatibility symbols collide.
//
// Currently it only installs a PyOS_ReadlineFunctionPointer, without
// implementing any of the readline module methods. This is meant to
// work around LLVM pr18841 to avoid seg faults in the stock Python
// readline.so linked against GNU readline.
//
// Bug on the cpython side: https://bugs.python.org/issue38634
PyDoc_STRVAR(moduleDocumentation,
"Simple readline module implementation based on libedit.");
static struct PyModuleDef readline_module = {
PyModuleDef_HEAD_INIT, // m_base
"lldb_editline", // m_name
moduleDocumentation, // m_doc
-1, // m_size
nullptr, // m_methods
nullptr, // m_reload
nullptr, // m_traverse
nullptr, // m_clear
nullptr, // m_free
};
static char *simple_readline(FILE *stdin, FILE *stdout, const char *prompt) {
rl_instream = stdin;
rl_outstream = stdout;
char *line = readline(prompt);
if (!line) {
char *ret = (char *)PyMem_RawMalloc(1);
if (ret != NULL)
*ret = '\0';
return ret;
}
if (*line)
add_history(line);
int n = strlen(line);
char *ret = (char *)PyMem_RawMalloc(n + 2);
if (ret) {
memcpy(ret, line, n);
free(line);
ret[n] = '\n';
ret[n + 1] = '\0';
}
return ret;
}
PyMODINIT_FUNC initlldb_readline(void) {
PyOS_ReadlineFunctionPointer = simple_readline;
return PyModule_Create(&readline_module);
}
#endif