forked from OSchip/llvm-project
Simple readline functionality for interactive python on linux.
Differential Revision: http://reviews.llvm.org/D13268 llvm-svn: 249478
This commit is contained in:
parent
02c08d04e2
commit
702c4b865e
|
@ -4,7 +4,14 @@ include(cmake/modules/LLDBStandalone.cmake)
|
|||
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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
"Stub module meant to effectively disable readline support.");
|
||||
"Simple readline module implementation based on libedit.");
|
||||
#else
|
||||
PyDoc_STRVAR(
|
||||
moduleDocumentation,
|
||||
"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,
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue