diff options
author | Guido van Rossum <guido@python.org> | 2007-11-16 00:35:22 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2007-11-16 00:35:22 (GMT) |
commit | 3d392eb3273aefeca2741aee9f0e31e3b79b1043 (patch) | |
tree | 7766b1aad797ebe0f8ee5316e561b3f37a45d3ea /Modules | |
parent | 5b8b1555de033c0f1646bce5fd130567297da019 (diff) | |
download | cpython-3d392eb3273aefeca2741aee9f0e31e3b79b1043.zip cpython-3d392eb3273aefeca2741aee9f0e31e3b79b1043.tar.gz cpython-3d392eb3273aefeca2741aee9f0e31e3b79b1043.tar.bz2 |
Merged revisions 58947-59004 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r58952 | christian.heimes | 2007-11-12 10:58:08 -0800 (Mon, 12 Nov 2007) | 6 lines
readline module cleanup
fixed indention to tabs
use Py_RETURN_NONE macro
added more error checks to on_completion_display_matches_hook
open question: Does PyList_SetItem(l, i, o) steal a reference to o in the case of an error?
........
r58956 | guido.van.rossum | 2007-11-12 12:06:40 -0800 (Mon, 12 Nov 2007) | 2 lines
Add the test from issue 1704621 (the issue itself is already fixed here).
........
r58963 | amaury.forgeotdarc | 2007-11-13 13:54:28 -0800 (Tue, 13 Nov 2007) | 23 lines
Merge from py3k branch:
Correction for issue1265 (pdb bug with "with" statement).
When an unfinished generator-iterator is garbage collected, PyEval_EvalFrameEx
is called with a GeneratorExit exception set. This leads to funny results
if the sys.settrace function itself makes use of generators.
A visible effect is that the settrace function is reset to None.
Another is that the eventual "finally" block of the generator is not called.
It is necessary to save/restore the exception around the call to the trace
function.
This happens a lot with py3k: isinstance() of an ABCMeta instance runs
def __instancecheck__(cls, instance):
"""Override for isinstance(instance, cls)."""
return any(cls.__subclasscheck__(c)
for c in {instance.__class__, type(instance)})
which lets an opened generator expression each time it returns True.
Backport candidate, even if the case is less frequent in 2.5.
........
r58968 | georg.brandl | 2007-11-14 05:59:09 -0800 (Wed, 14 Nov 2007) | 2 lines
Remove dead link from random docs.
........
r58971 | raymond.hettinger | 2007-11-14 14:56:16 -0800 (Wed, 14 Nov 2007) | 1 line
Make __fields__ read-only. Suggested by Issac Morland
........
r58972 | raymond.hettinger | 2007-11-14 15:02:30 -0800 (Wed, 14 Nov 2007) | 1 line
Add test for __fields__ being read-only
........
r58975 | raymond.hettinger | 2007-11-14 18:44:53 -0800 (Wed, 14 Nov 2007) | 6 lines
Accept Issac Morland's suggestion for __replace__ to allow multiple replacements
(suprisingly, this simplifies the signature, improves clarity, and is comparably fast).
Update the docs to reflect a previous change to the function name.
Add an example to the docs showing how to override the default __repr__ method.
........
r58976 | raymond.hettinger | 2007-11-14 18:55:42 -0800 (Wed, 14 Nov 2007) | 1 line
Small improvement to the implementation of __replace__().
........
r58977 | raymond.hettinger | 2007-11-14 18:58:20 -0800 (Wed, 14 Nov 2007) | 1 line
Fixup example in docs.
........
r58978 | raymond.hettinger | 2007-11-14 19:16:09 -0800 (Wed, 14 Nov 2007) | 1 line
Example of multiple replacements.
........
r58998 | raymond.hettinger | 2007-11-15 14:39:34 -0800 (Thu, 15 Nov 2007) | 1 line
Add example for use cases requiring default values.
........
r59000 | bill.janssen | 2007-11-15 15:03:03 -0800 (Thu, 15 Nov 2007) | 1 line
add the certificate for the Python SVN repository for testing SSL
........
r59004 | guido.van.rossum | 2007-11-15 16:24:44 -0800 (Thu, 15 Nov 2007) | 8 lines
A patch from issue 1378 by roudkerk:
Currently on Windows set_error() make use of a large array which maps
socket error numbers to error messages.
This patch removes that array and just lets PyErr_SetExcFromWindowsErr()
generate the message by using the Win32 function FormatMessage().
........
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/readline.c | 188 | ||||
-rw-r--r-- | Modules/socketmodule.c | 86 |
2 files changed, 92 insertions, 182 deletions
diff --git a/Modules/readline.c b/Modules/readline.c index 9052937..c915327 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -59,8 +59,7 @@ parse_and_bind(PyObject *self, PyObject *args) strcpy(copy, s); rl_parse_and_bind(copy); free(copy); /* Free the copy */ - Py_INCREF(Py_None); - return Py_None; + Py_RETURN_NONE; } PyDoc_STRVAR(doc_parse_and_bind, @@ -79,8 +78,7 @@ read_init_file(PyObject *self, PyObject *args) errno = rl_read_init_file(s); if (errno) return PyErr_SetFromErrno(PyExc_IOError); - Py_INCREF(Py_None); - return Py_None; + Py_RETURN_NONE; } PyDoc_STRVAR(doc_read_init_file, @@ -100,8 +98,7 @@ read_history_file(PyObject *self, PyObject *args) errno = read_history(s); if (errno) return PyErr_SetFromErrno(PyExc_IOError); - Py_INCREF(Py_None); - return Py_None; + Py_RETURN_NONE; } static int _history_length = -1; /* do not truncate history by default */ @@ -124,8 +121,7 @@ write_history_file(PyObject *self, PyObject *args) history_truncate_file(s, _history_length); if (errno) return PyErr_SetFromErrno(PyExc_IOError); - Py_INCREF(Py_None); - return Py_None; + Py_RETURN_NONE; } PyDoc_STRVAR(doc_write_history_file, @@ -143,8 +139,7 @@ set_history_length(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "i:set_history_length", &length)) return NULL; _history_length = length; - Py_INCREF(Py_None); - return Py_None; + Py_RETURN_NONE; } PyDoc_STRVAR(set_history_length_doc, @@ -195,8 +190,7 @@ set_hook(const char *funcname, PyObject **hook_var, PyObject *args) PyErr_SetString(PyExc_TypeError, buf); return NULL; } - Py_INCREF(Py_None); - return Py_None; + Py_RETURN_NONE; } @@ -218,7 +212,7 @@ set_completion_display_matches_hook(PyObject *self, PyObject *args) /* We cannot set this hook globally, since it replaces the default completion display. */ rl_completion_display_matches_hook = - completion_display_matches_hook ? + completion_display_matches_hook ? (rl_compdisp_func_t *)on_completion_display_matches_hook : 0; #endif return result; @@ -325,8 +319,7 @@ set_completer_delims(PyObject *self, PyObject *args) } free((void*)rl_completer_word_break_characters); rl_completer_word_break_characters = strdup(break_chars); - Py_INCREF(Py_None); - return Py_None; + Py_RETURN_NONE; } PyDoc_STRVAR(doc_set_completer_delims, @@ -336,32 +329,31 @@ set the readline word delimiters for tab-completion"); static PyObject * py_remove_history(PyObject *self, PyObject *args) { - int entry_number; - HIST_ENTRY *entry; - - if (!PyArg_ParseTuple(args, "i:remove_history", &entry_number)) - return NULL; - if (entry_number < 0) { - PyErr_SetString(PyExc_ValueError, - "History index cannot be negative"); - return NULL; - } - entry = remove_history(entry_number); - if (!entry) { - PyErr_Format(PyExc_ValueError, - "No history item at position %d", - entry_number); - return NULL; - } - /* free memory allocated for the history entry */ - if (entry->line) - free(entry->line); - if (entry->data) - free(entry->data); - free(entry); - - Py_INCREF(Py_None); - return Py_None; + int entry_number; + HIST_ENTRY *entry; + + if (!PyArg_ParseTuple(args, "i:remove_history", &entry_number)) + return NULL; + if (entry_number < 0) { + PyErr_SetString(PyExc_ValueError, + "History index cannot be negative"); + return NULL; + } + entry = remove_history(entry_number); + if (!entry) { + PyErr_Format(PyExc_ValueError, + "No history item at position %d", + entry_number); + return NULL; + } + /* free memory allocated for the history entry */ + if (entry->line) + free(entry->line); + if (entry->data) + free(entry->data); + free(entry); + + Py_RETURN_NONE; } PyDoc_STRVAR(doc_remove_history, @@ -371,34 +363,34 @@ remove history item given by its position"); static PyObject * py_replace_history(PyObject *self, PyObject *args) { - int entry_number; - char *line; - HIST_ENTRY *old_entry; - - if (!PyArg_ParseTuple(args, "is:replace_history", &entry_number, &line)) { - return NULL; - } - if (entry_number < 0) { - PyErr_SetString(PyExc_ValueError, - "History index cannot be negative"); - return NULL; - } - old_entry = replace_history_entry(entry_number, line, (void *)NULL); - if (!old_entry) { - PyErr_Format(PyExc_ValueError, - "No history item at position %d", - entry_number); - return NULL; - } - /* free memory allocated for the old history entry */ - if (old_entry->line) - free(old_entry->line); - if (old_entry->data) - free(old_entry->data); - free(old_entry); - - Py_INCREF(Py_None); - return Py_None; + int entry_number; + char *line; + HIST_ENTRY *old_entry; + + if (!PyArg_ParseTuple(args, "is:replace_history", &entry_number, + &line)) { + return NULL; + } + if (entry_number < 0) { + PyErr_SetString(PyExc_ValueError, + "History index cannot be negative"); + return NULL; + } + old_entry = replace_history_entry(entry_number, line, (void *)NULL); + if (!old_entry) { + PyErr_Format(PyExc_ValueError, + "No history item at position %d", + entry_number); + return NULL; + } + /* free memory allocated for the old history entry */ + if (old_entry->line) + free(old_entry->line); + if (old_entry->data) + free(old_entry->data); + free(old_entry); + + Py_RETURN_NONE; } PyDoc_STRVAR(doc_replace_history, @@ -416,8 +408,7 @@ py_add_history(PyObject *self, PyObject *args) return NULL; } add_history(line); - Py_INCREF(Py_None); - return Py_None; + Py_RETURN_NONE; } PyDoc_STRVAR(doc_add_history, @@ -458,8 +449,7 @@ static PyObject * get_completer(PyObject *self, PyObject *noargs) { if (completer == NULL) { - Py_INCREF(Py_None); - return Py_None; + Py_RETURN_NONE; } Py_INCREF(completer); return completer; @@ -483,8 +473,7 @@ get_history_item(PyObject *self, PyObject *args) if ((hist_ent = history_get(idx))) return PyUnicode_FromString(hist_ent->line); else { - Py_INCREF(Py_None); - return Py_None; + Py_RETURN_NONE; } } @@ -530,8 +519,7 @@ static PyObject * py_clear_history(PyObject *self, PyObject *noarg) { clear_history(); - Py_INCREF(Py_None); - return Py_None; + Py_RETURN_NONE; } PyDoc_STRVAR(doc_clear_history, @@ -549,8 +537,7 @@ insert_text(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "s:insert_text", &s)) return NULL; rl_insert_text(s); - Py_INCREF(Py_None); - return Py_None; + Py_RETURN_NONE; } PyDoc_STRVAR(doc_insert_text, @@ -564,8 +551,7 @@ static PyObject * redisplay(PyObject *self, PyObject *noarg) { rl_redisplay(); - Py_INCREF(Py_None); - return Py_None; + Py_RETURN_NONE; } PyDoc_STRVAR(doc_redisplay, @@ -591,9 +577,9 @@ static struct PyMethodDef readline_methods[] = METH_VARARGS, doc_get_history_item}, {"get_current_history_length", (PyCFunction)get_current_history_length, METH_NOARGS, doc_get_current_history_length}, - {"set_history_length", set_history_length, + {"set_history_length", set_history_length, METH_VARARGS, set_history_length_doc}, - {"get_history_length", get_history_length, + {"get_history_length", get_history_length, METH_NOARGS, get_history_length_doc}, {"set_completer", set_completer, METH_VARARGS, doc_set_completer}, {"get_completer", get_completer, METH_NOARGS, doc_get_completer}, @@ -605,8 +591,8 @@ static struct PyMethodDef readline_methods[] = {"set_completer_delims", set_completer_delims, METH_VARARGS, doc_set_completer_delims}, {"add_history", py_add_history, METH_VARARGS, doc_add_history}, - {"remove_history_item", py_remove_history, METH_VARARGS, doc_remove_history}, - {"replace_history_item", py_replace_history, METH_VARARGS, doc_replace_history}, + {"remove_history_item", py_remove_history, METH_VARARGS, doc_remove_history}, + {"replace_history_item", py_replace_history, METH_VARARGS, doc_replace_history}, {"get_completer_delims", get_completer_delims, METH_NOARGS, doc_get_completer_delims}, @@ -633,7 +619,7 @@ on_hook(PyObject *func) int result = 0; if (func != NULL) { PyObject *r; -#ifdef WITH_THREAD +#ifdef WITH_THREAD PyGILState_STATE gilstate = PyGILState_Ensure(); #endif r = PyObject_CallFunction(func, NULL); @@ -652,7 +638,7 @@ on_hook(PyObject *func) PyErr_Clear(); Py_XDECREF(r); done: -#ifdef WITH_THREAD +#ifdef WITH_THREAD PyGILState_Release(gilstate); #endif return result; @@ -682,37 +668,37 @@ on_completion_display_matches_hook(char **matches, int num_matches, int max_length) { int i; - PyObject *m, *s; - PyObject *r; + PyObject *m=NULL, *s=NULL, *r=NULL; #ifdef WITH_THREAD PyGILState_STATE gilstate = PyGILState_Ensure(); #endif m = PyList_New(num_matches); + if (m == NULL) + goto error; for (i = 0; i < num_matches; i++) { s = PyUnicode_FromString(matches[i+1]); - if (s) { - PyList_SetItem(m, i, s); - } - else { + if (s == NULL) + goto error; + if (PyList_SetItem(m, i, s) == -1) goto error; - } } r = PyObject_CallFunction(completion_display_matches_hook, "sOi", matches[0], m, max_length); Py_DECREF(m), m=NULL; - + if (r == NULL || (r != Py_None && PyInt_AsLong(r) == -1 && PyErr_Occurred())) { goto error; } + Py_XDECREF(r), r=NULL; - Py_DECREF(r); - goto done; - error: - PyErr_Clear(); - Py_XDECREF(r); - done: + if (0) { + error: + PyErr_Clear(); + Py_XDECREF(m); + Py_XDECREF(r); + } #ifdef WITH_THREAD PyGILState_Release(gilstate); #endif diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 2621a9e..30e8d22 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -450,87 +450,11 @@ set_error(void) { #ifdef MS_WINDOWS int err_no = WSAGetLastError(); - static struct { - int no; - const char *msg; - } *msgp, msgs[] = { - {WSAEINTR, "Interrupted system call"}, - {WSAEBADF, "Bad file descriptor"}, - {WSAEACCES, "Permission denied"}, - {WSAEFAULT, "Bad address"}, - {WSAEINVAL, "Invalid argument"}, - {WSAEMFILE, "Too many open files"}, - {WSAEWOULDBLOCK, - "The socket operation could not complete " - "without blocking"}, - {WSAEINPROGRESS, "Operation now in progress"}, - {WSAEALREADY, "Operation already in progress"}, - {WSAENOTSOCK, "Socket operation on non-socket"}, - {WSAEDESTADDRREQ, "Destination address required"}, - {WSAEMSGSIZE, "Message too long"}, - {WSAEPROTOTYPE, "Protocol wrong type for socket"}, - {WSAENOPROTOOPT, "Protocol not available"}, - {WSAEPROTONOSUPPORT, "Protocol not supported"}, - {WSAESOCKTNOSUPPORT, "Socket type not supported"}, - {WSAEOPNOTSUPP, "Operation not supported"}, - {WSAEPFNOSUPPORT, "Protocol family not supported"}, - {WSAEAFNOSUPPORT, "Address family not supported"}, - {WSAEADDRINUSE, "Address already in use"}, - {WSAEADDRNOTAVAIL, "Can't assign requested address"}, - {WSAENETDOWN, "Network is down"}, - {WSAENETUNREACH, "Network is unreachable"}, - {WSAENETRESET, "Network dropped connection on reset"}, - {WSAECONNABORTED, "Software caused connection abort"}, - {WSAECONNRESET, "Connection reset by peer"}, - {WSAENOBUFS, "No buffer space available"}, - {WSAEISCONN, "Socket is already connected"}, - {WSAENOTCONN, "Socket is not connected"}, - {WSAESHUTDOWN, "Can't send after socket shutdown"}, - {WSAETOOMANYREFS, "Too many references: can't splice"}, - {WSAETIMEDOUT, "Operation timed out"}, - {WSAECONNREFUSED, "Connection refused"}, - {WSAELOOP, "Too many levels of symbolic links"}, - {WSAENAMETOOLONG, "File name too long"}, - {WSAEHOSTDOWN, "Host is down"}, - {WSAEHOSTUNREACH, "No route to host"}, - {WSAENOTEMPTY, "Directory not empty"}, - {WSAEPROCLIM, "Too many processes"}, - {WSAEUSERS, "Too many users"}, - {WSAEDQUOT, "Disc quota exceeded"}, - {WSAESTALE, "Stale NFS file handle"}, - {WSAEREMOTE, "Too many levels of remote in path"}, - {WSASYSNOTREADY, "Network subsystem is unvailable"}, - {WSAVERNOTSUPPORTED, "WinSock version is not supported"}, - {WSANOTINITIALISED, - "Successful WSAStartup() not yet performed"}, - {WSAEDISCON, "Graceful shutdown in progress"}, - /* Resolver errors */ - {WSAHOST_NOT_FOUND, "No such host is known"}, - {WSATRY_AGAIN, "Host not found, or server failed"}, - {WSANO_RECOVERY, "Unexpected server error encountered"}, - {WSANO_DATA, "Valid name without requested data"}, - {WSANO_ADDRESS, "No address, look for MX record"}, - {0, NULL} - }; - if (err_no) { - PyObject *v; - const char *msg = "winsock error"; - - for (msgp = msgs; msgp->msg; msgp++) { - if (err_no == msgp->no) { - msg = msgp->msg; - break; - } - } - - v = Py_BuildValue("(is)", err_no, msg); - if (v != NULL) { - PyErr_SetObject(socket_error, v); - Py_DECREF(v); - } - return NULL; - } - else + /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which + recognizes the error codes used by both GetLastError() and + WSAGetLastError */ + if (err_no) + return PyErr_SetExcFromWindowsErr(socket_error, err_no); #endif #if defined(PYOS_OS2) && !defined(PYCC_GCC) |