diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2007-11-12 04:53:02 (GMT) |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2007-11-12 04:53:02 (GMT) |
commit | f354894e7b35b09dabacdbcb1b812b290b0457a2 (patch) | |
tree | 2d745b982dae33e97741c8dcbe91d206cbee5f72 | |
parent | abfe45368c76bb9f705ee9b84b31a08856b38e97 (diff) | |
download | cpython-f354894e7b35b09dabacdbcb1b812b290b0457a2.zip cpython-f354894e7b35b09dabacdbcb1b812b290b0457a2.tar.gz cpython-f354894e7b35b09dabacdbcb1b812b290b0457a2.tar.bz2 |
Only set rl_completion_display_matches_hook if there
is a Python hook function. Fixes #1425.
-rw-r--r-- | Modules/readline.c | 69 |
1 files changed, 38 insertions, 31 deletions
diff --git a/Modules/readline.c b/Modules/readline.c index f620f62..85bbafd 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -38,6 +38,10 @@ extern char **completion_matches(char *, rl_compentry_func_t *); #endif +static void +on_completion_display_matches_hook(char **matches, + int num_matches, int max_length); + /* Exported function to send one line to readline's init file parser */ @@ -208,8 +212,17 @@ static PyObject *pre_input_hook = NULL; static PyObject * set_completion_display_matches_hook(PyObject *self, PyObject *args) { - return set_hook("completion_display_matches_hook", + PyObject *result = set_hook("completion_display_matches_hook", &completion_display_matches_hook, args); +#ifdef HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK + /* We cannot set this hook globally, since it replaces the + default completion display. */ + rl_completion_display_matches_hook = + completion_display_matches_hook ? + (rl_compdisp_func_t *)on_completion_display_matches_hook : 0; +#endif + return result; + } PyDoc_STRVAR(doc_set_completion_display_matches_hook, @@ -668,39 +681,37 @@ static void on_completion_display_matches_hook(char **matches, int num_matches, int max_length) { - if (completion_display_matches_hook != NULL) { - int i; - PyObject *m, *s; - PyObject *r; + int i; + PyObject *m, *s; + PyObject *r; #ifdef WITH_THREAD - PyGILState_STATE gilstate = PyGILState_Ensure(); + PyGILState_STATE gilstate = PyGILState_Ensure(); #endif - m = PyList_New(num_matches); - for (i = 0; i < num_matches; i++) { - s = PyString_FromString(matches[i+1]); - PyList_SetItem(m, i, s); - } - - r = PyObject_CallFunction(completion_display_matches_hook, - "sOi", matches[0], m, max_length); + m = PyList_New(num_matches); + for (i = 0; i < num_matches; i++) { + s = PyString_FromString(matches[i+1]); + PyList_SetItem(m, i, s); + } - Py_DECREF(m); + r = PyObject_CallFunction(completion_display_matches_hook, + "sOi", matches[0], m, max_length); - if (r == NULL || - (r != Py_None && PyInt_AsLong(r) == -1 && PyErr_Occurred())) { - goto error; - } + Py_DECREF(m); + + if (r == NULL || + (r != Py_None && PyInt_AsLong(r) == -1 && PyErr_Occurred())) { + goto error; + } - Py_DECREF(r); - goto done; - error: - PyErr_Clear(); - Py_XDECREF(r); - done: + Py_DECREF(r); + goto done; + error: + PyErr_Clear(); + Py_XDECREF(r); + done: #ifdef WITH_THREAD - PyGILState_Release(gilstate); + PyGILState_Release(gilstate); #endif - } } @@ -781,10 +792,6 @@ setup_readline(void) rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); /* Set our hook functions */ -#ifdef HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK - rl_completion_display_matches_hook = - (rl_compdisp_func_t *)on_completion_display_matches_hook; -#endif rl_startup_hook = (Function *)on_startup_hook; #ifdef HAVE_RL_PRE_INPUT_HOOK rl_pre_input_hook = (Function *)on_pre_input_hook; |