summaryrefslogtreecommitdiffstats
path: root/lldb/scripts/Python
diff options
context:
space:
mode:
authorRyan Brown <ribrdb@google.com>2015-10-06 22:21:08 +0000
committerRyan Brown <ribrdb@google.com>2015-10-06 22:21:08 +0000
commit702c4b865e0f4767c3c39b022b8b37dafe5197ef (patch)
tree1fa91ea3249bc2d66c5e860de753713ebb97e9cf /lldb/scripts/Python
parent02c08d04e2e801e14fc76fde4e1ec11cc4c538aa (diff)
downloadbcm5719-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.txt6
-rw-r--r--lldb/scripts/Python/modules/readline/readline.cpp55
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,
OpenPOWER on IntegriCloud