[Lldb-commits] [lldb] r249478 - Simple readline functionality for interactive python on linux.

Ryan Brown via lldb-commits lldb-commits at lists.llvm.org
Tue Oct 6 15:21:08 PDT 2015


Author: ribrdb
Date: Tue Oct  6 17:21:08 2015
New Revision: 249478

URL: http://llvm.org/viewvc/llvm-project?rev=249478&view=rev
Log:
Simple readline functionality for interactive python on linux.

Differential Revision: http://reviews.llvm.org/D13268

Modified:
    lldb/trunk/CMakeLists.txt
    lldb/trunk/scripts/Python/modules/readline/CMakeLists.txt
    lldb/trunk/scripts/Python/modules/readline/readline.cpp
    lldb/trunk/source/CMakeLists.txt

Modified: lldb/trunk/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/CMakeLists.txt?rev=249478&r1=249477&r2=249478&view=diff
==============================================================================
--- lldb/trunk/CMakeLists.txt (original)
+++ lldb/trunk/CMakeLists.txt Tue Oct  6 17:21:08 2015
@@ -4,7 +4,14 @@ include(cmake/modules/LLDBStandalone.cma
 include(cmake/modules/LLDBConfig.cmake)
 include(cmake/modules/AddLLDB.cmake)
 
-#add_subdirectory(include)
+# We need libedit support to go down both the source and
+# the scripts directories.
+set(LLDB_DISABLE_LIBEDIT ${LLDB_DEFAULT_DISABLE_LIBEDIT} CACHE BOOL "Disables the use of editline.")
+if (LLDB_DISABLE_LIBEDIT)
+  add_definitions( -DLLDB_DISABLE_LIBEDIT )
+endif()
+
+# add_subdirectory(include)
 add_subdirectory(docs)
 if (NOT LLDB_DISABLE_PYTHON)
   add_subdirectory(scripts)

Modified: lldb/trunk/scripts/Python/modules/readline/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/modules/readline/CMakeLists.txt?rev=249478&r1=249477&r2=249478&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/modules/readline/CMakeLists.txt (original)
+++ lldb/trunk/scripts/Python/modules/readline/CMakeLists.txt Tue Oct  6 17:21:08 2015
@@ -7,7 +7,11 @@ SET(PYTHON_DIRECTORY python${PYTHON_VERS
 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

Modified: lldb/trunk/scripts/Python/modules/readline/readline.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/modules/readline/readline.cpp?rev=249478&r1=249477&r2=249478&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/modules/readline/readline.cpp (original)
+++ lldb/trunk/scripts/Python/modules/readline/readline.cpp Tue Oct  6 17:21:08 2015
@@ -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,

Modified: lldb/trunk/source/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/CMakeLists.txt?rev=249478&r1=249477&r2=249478&view=diff
==============================================================================
--- lldb/trunk/source/CMakeLists.txt (original)
+++ lldb/trunk/source/CMakeLists.txt Tue Oct  6 17:21:08 2015
@@ -6,11 +6,6 @@ else()
   set(LLDB_DEFAULT_DISABLE_LIBEDIT 0)
 endif ()
 
-set(LLDB_DISABLE_LIBEDIT ${LLDB_DEFAULT_DISABLE_LIBEDIT} CACHE BOOL "Disables the use of editline.")
-if (LLDB_DISABLE_LIBEDIT)
-  add_definitions( -DLLDB_DISABLE_LIBEDIT )
-endif()
-
 if ( CMAKE_SYSTEM_NAME MATCHES "Linux" )
 include_directories(
   Plugins/Process/Linux




More information about the lldb-commits mailing list