diff options
author | Ryan Brown <ribrdb@google.com> | 2015-10-06 22:21:08 +0000 |
---|---|---|
committer | Ryan Brown <ribrdb@google.com> | 2015-10-06 22:21:08 +0000 |
commit | 702c4b865e0f4767c3c39b022b8b37dafe5197ef (patch) | |
tree | 1fa91ea3249bc2d66c5e860de753713ebb97e9cf /lldb/scripts/Python | |
parent | 02c08d04e2e801e14fc76fde4e1ec11cc4c538aa (diff) | |
download | bcm5719-llvm-702c4b865e0f4767c3c39b022b8b37dafe5197ef.tar.gz bcm5719-llvm-702c4b865e0f4767c3c39b022b8b37dafe5197ef.zip |
Simple readline functionality for interactive python on linux.
Differential Revision: http://reviews.llvm.org/D13268
llvm-svn: 249478
Diffstat (limited to 'lldb/scripts/Python')
-rw-r--r-- | lldb/scripts/Python/modules/readline/CMakeLists.txt | 6 | ||||
-rw-r--r-- | lldb/scripts/Python/modules/readline/readline.cpp | 55 |
2 files changed, 55 insertions, 6 deletions
diff --git a/lldb/scripts/Python/modules/readline/CMakeLists.txt b/lldb/scripts/Python/modules/readline/CMakeLists.txt index 11089c6230f..0a4376c1c32 100644 --- a/lldb/scripts/Python/modules/readline/CMakeLists.txt +++ b/lldb/scripts/Python/modules/readline/CMakeLists.txt @@ -7,7 +7,11 @@ SET(PYTHON_DIRECTORY python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site- include_directories(${PYTHON_INCLUDE_DIR}) add_library(readline SHARED readline.cpp) -target_link_libraries(readline ${PYTHON_LIBRARY}) +if (NOT LLDB_DISABLE_LIBEDIT) + target_link_libraries(readline ${PYTHON_LIBRARY} edit) +else() + target_link_libraries(readline ${PYTHON_LIBRARY}) +endif() # FIXME: the LIBRARY_OUTPUT_PATH seems to be ignored - this is not a # functional issue for the build dir, though, since the shared lib dir diff --git a/lldb/scripts/Python/modules/readline/readline.cpp b/lldb/scripts/Python/modules/readline/readline.cpp index b0d6b748605..38268f8a4b6 100644 --- a/lldb/scripts/Python/modules/readline/readline.cpp +++ b/lldb/scripts/Python/modules/readline/readline.cpp @@ -1,23 +1,68 @@ #include <stdio.h> #include "Python.h" -// Python readline module intentionally built to not implement the -// readline module interface. This is meant to work around llvm -// pr18841 to avoid seg faults in the stock Python readline.so linked -// against GNU readline. +#ifndef LLDB_DISABLE_LIBEDIT +#include <editline/readline.h> +#endif + +// 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. static struct PyMethodDef moduleMethods[] = { {nullptr, nullptr, 0, nullptr} }; +#ifndef LLDB_DISABLE_LIBEDIT +PyDoc_STRVAR( + moduleDocumentation, + "Simple readline module implementation based on libedit."); +#else PyDoc_STRVAR( moduleDocumentation, - "Stub module meant to effectively disable readline support."); + "Stub module meant to avoid linking GNU readline."); +#endif + +#ifndef LLDB_DISABLE_LIBEDIT +static char* +simple_readline(FILE *stdin, FILE *stdout, char *prompt) +{ + rl_instream = stdin; + rl_outstream = stdout; + char* line = readline(prompt); + if (!line) + { + char* ret = (char*)PyMem_Malloc(1); + if (ret != NULL) + *ret = '\0'; + return ret; + } + if (*line) + add_history(line); + int n = strlen(line); + char* ret = (char*)PyMem_Malloc(n + 2); + strncpy(ret, line, n); + free(line); + ret[n] = '\n'; + ret[n+1] = '\0'; + return ret; +} +#endif PyMODINIT_FUNC initreadline(void) { +#ifndef LLDB_DISABLE_LIBEDIT + PyOS_ReadlineFunctionPointer = simple_readline; +#endif Py_InitModule4( "readline", moduleMethods, |