mirror of https://github.com/python/cpython
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.
This commit is contained in:
commit
9b5d4d8cef
|
@ -77,6 +77,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.
|
||||
|
||||
|
|
|
@ -70,6 +70,10 @@ on_completion_display_matches_hook(char **matches,
|
|||
int num_matches, int max_length);
|
||||
#endif
|
||||
|
||||
/* 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 *
|
||||
|
@ -371,10 +375,18 @@ set_completer_delims(PyObject *self, PyObject *args)
|
|||
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);
|
||||
/* 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,
|
||||
"set_completer_delims(string) -> None\n\
|
||||
|
@ -914,6 +926,7 @@ setup_readline(void)
|
|||
/* Set our completion function */
|
||||
rl_attempted_completion_function = (CPPFunction *)flex_complete;
|
||||
/* Set Python word break characters */
|
||||
completer_word_break_characters =
|
||||
rl_completer_word_break_characters =
|
||||
strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?");
|
||||
/* All nonalphanums except '.' */
|
||||
|
@ -1170,8 +1183,6 @@ PyInit_readline(void)
|
|||
if (m == NULL)
|
||||
return NULL;
|
||||
|
||||
|
||||
|
||||
PyOS_ReadlineFunctionPointer = call_readline;
|
||||
setup_readline();
|
||||
return m;
|
||||
|
|
Loading…
Reference in New Issue