Commit 31bc8bef authored by Antoine Pitrou's avatar Antoine Pitrou

Issue #17289: The readline module now plays nicer with external modules or...

Issue #17289: The readline module now plays nicer with external modules or applications changing the rl_completer_word_break_characters global variable.
Initial patch by Bradley Froehle.
parent 880359c2
......@@ -34,6 +34,10 @@ Core and Builtins
Library
-------
- Issue #17289: The readline module now plays nicer with external modules
or applications changing the rl_completer_word_break_characters global
variable. Initial patch by Bradley Froehle.
- Issue #12181: select module: Fix struct kevent definition on OpenBSD 64-bit
platforms. Patch by Federico Schwindt.
......
......@@ -69,6 +69,10 @@ on_completion_display_matches_hook(char **matches,
int num_matches, int max_length);
/* Memory allocated for rl_completer_word_break_characters
(see issue #17289 for the motivation). */
static char *completer_word_break_characters;
/* Exported function to send one line to readline's init file parser */
static PyObject *
......@@ -344,12 +348,20 @@ set_completer_delims(PyObject *self, PyObject *args)
{
char *break_chars;
if(!PyArg_ParseTuple(args, "s:set_completer_delims", &break_chars)) {
if (!PyArg_ParseTuple(args, "s:set_completer_delims", &break_chars)) {
return NULL;
}
free((void*)rl_completer_word_break_characters);
rl_completer_word_break_characters = strdup(break_chars);
Py_RETURN_NONE;
/* Keep a reference to the allocated memory in the module state in case
some other module modifies rl_completer_word_break_characters
(see issue #17289). */
free(completer_word_break_characters);
completer_word_break_characters = strdup(break_chars);
if (completer_word_break_characters) {
rl_completer_word_break_characters = completer_word_break_characters;
Py_RETURN_NONE;
}
else
return PyErr_NoMemory();
}
PyDoc_STRVAR(doc_set_completer_delims,
......@@ -893,7 +905,8 @@ setup_readline(void)
/* Set our completion function */
rl_attempted_completion_function = (CPPFunction *)flex_complete;
/* Set Python word break characters */
rl_completer_word_break_characters =
completer_word_break_characters =
rl_completer_word_break_characters =
strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?");
/* All nonalphanums except '.' */
......@@ -906,7 +919,7 @@ setup_readline(void)
*/
#ifdef __APPLE__
if (using_libedit_emulation)
rl_read_init_file(NULL);
rl_read_init_file(NULL);
else
#endif /* __APPLE__ */
rl_initialize();
......@@ -1137,8 +1150,6 @@ initreadline(void)
if (m == NULL)
return;
PyOS_ReadlineFunctionPointer = call_readline;
setup_readline();
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment