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 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits