summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2007-08-21 06:01:18 (GMT)
committerGeorg Brandl <georg@python.org>2007-08-21 06:01:18 (GMT)
commitfdca6d8599e46ee7fc7844a798666fc60923fbe5 (patch)
tree238caa41f0e2edce919e55b1d658330415036caa
parent1bb124ad0d9a81664170d9a41c6c8128ceafbc33 (diff)
downloadcpython-fdca6d8599e46ee7fc7844a798666fc60923fbe5.zip
cpython-fdca6d8599e46ee7fc7844a798666fc60923fbe5.tar.gz
cpython-fdca6d8599e46ee7fc7844a798666fc60923fbe5.tar.bz2
Demand version 2.5.1 since 2.5 has a bug with codecs.open context managers.
-rw-r--r--Doc/tools/sphinx-build.py4
-rw-r--r--Lib/test/test_exceptions.py17
-rw-r--r--Objects/exceptions.c38
-rw-r--r--Python/import.c10
4 files changed, 60 insertions, 9 deletions
diff --git a/Doc/tools/sphinx-build.py b/Doc/tools/sphinx-build.py
index e19b10a..8f952be 100644
--- a/Doc/tools/sphinx-build.py
+++ b/Doc/tools/sphinx-build.py
@@ -11,9 +11,9 @@ import sys
if __name__ == '__main__':
- if sys.version_info[:3] < (2, 5, 0):
+ if sys.version_info[:3] < (2, 5, 1):
print >>sys.stderr, """\
-Error: Sphinx needs to be executed with Python 2.5 or newer
+Error: Sphinx needs to be executed with Python 2.5.1 or newer
(If you run this from the Makefile, you can set the PYTHON variable
to the path of an alternative interpreter executable, e.g.,
``make html PYTHON=python2.5``).
diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py
index 657cbc5..2f57f3d 100644
--- a/Lib/test/test_exceptions.py
+++ b/Lib/test/test_exceptions.py
@@ -9,6 +9,16 @@ from test.test_support import (TESTFN, unlink, run_unittest,
catch_warning)
from test.test_pep352 import ignore_message_warning
+class NaiveException(Exception):
+ def __init__(self, x):
+ self.x = x
+
+class SomewhatNaiveException(Exception):
+ def __init__(self, x):
+ self.x = x
+ Exception.__init__(self)
+
+
# XXX This is not really enough, each *operation* should be tested!
class ExceptionTests(unittest.TestCase):
@@ -263,6 +273,10 @@ class ExceptionTests(unittest.TestCase):
{'message' : '', 'args' : (u'\u3042', 0, 1, 'ouch'),
'object' : u'\u3042', 'reason' : 'ouch',
'start' : 0, 'end' : 1}),
+ (NaiveException, ('foo',),
+ {'message': '', 'args': ('foo',), 'x': 'foo'}),
+ (SomewhatNaiveException, ('foo',),
+ {'message': '', 'args': (), 'x': 'foo'}),
]
try:
exceptionList.append(
@@ -283,7 +297,8 @@ class ExceptionTests(unittest.TestCase):
if type(e) is not exc:
raise
# Verify module name
- self.assertEquals(type(e).__module__, 'exceptions')
+ if not type(e).__name__.endswith('NaiveException'):
+ self.assertEquals(type(e).__module__, 'exceptions')
# Verify no ref leaks in Exc_str()
s = str(e)
for checkArgName in expected:
diff --git a/Objects/exceptions.c b/Objects/exceptions.c
index 3d79383..103a662 100644
--- a/Objects/exceptions.c
+++ b/Objects/exceptions.c
@@ -38,18 +38,31 @@ BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
/* the dict is created on the fly in PyObject_GenericSetAttr */
self->message = self->dict = NULL;
- self->args = PyTuple_New(0);
- if (!self->args) {
+ if (!args) {
+ /* MemoryError instantiation */
+ args = PyTuple_New(0);
+ if (!args) {
+ Py_DECREF(self);
+ return NULL;
+ }
+ } else {
+ Py_INCREF(args);
+ }
+
+ self->args = args;
+
+ /* Since the args can be overwritten in __init__, we have to store
+ the original args somewhere for pickling. */
+ if (PyObject_SetAttrString((PyObject *)self, "__newargs__", args) < 0) {
Py_DECREF(self);
return NULL;
}
-
+
self->message = PyString_FromString("");
if (!self->message) {
Py_DECREF(self);
return NULL;
}
-
return (PyObject *)self;
}
@@ -147,10 +160,23 @@ BaseException_repr(PyBaseExceptionObject *self)
static PyObject *
BaseException_reduce(PyBaseExceptionObject *self)
{
+ PyObject *result;
+ PyObject *newargs = PyObject_GetAttrString((PyObject *)self, "__newargs__");
+ if (!newargs) {
+ if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
+ PyErr_SetString(PyExc_AttributeError,
+ "To pickle exceptions via BaseException.__reduce__, "
+ "you need to set the __newargs__ attribute in your "
+ "custom __new__ method.");
+ }
+ return NULL;
+ }
if (self->args && self->dict)
- return PyTuple_Pack(3, Py_Type(self), self->args, self->dict);
+ result = PyTuple_Pack(3, Py_Type(self), newargs, self->dict);
else
- return PyTuple_Pack(2, Py_Type(self), self->args);
+ result = PyTuple_Pack(2, Py_Type(self), newargs);
+ Py_DECREF(newargs);
+ return result;
}
/*
diff --git a/Python/import.c b/Python/import.c
index 678a30b..dc97940 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -1395,6 +1395,7 @@ find_module(char *fullname, char *subname, PyObject *path, char *buf,
filemode = fdp->mode;
if (filemode[0] == 'U')
filemode = "r" PY_STDIOTEXTMODE;
+ errno = 0;
fp = fopen(buf, filemode);
if (fp != NULL) {
if (case_ok(buf, len, namelen, name))
@@ -1404,6 +1405,15 @@ find_module(char *fullname, char *subname, PyObject *path, char *buf,
fp = NULL;
}
}
+ /* issue a warning if the file is there */
+ /*if (errno != ENOENT) {
+ char warnstr[MAXPATHLEN+80];
+ sprintf(warnstr, "Not importing '%.*s': ");
+
+ if (PyErr_Warn(PyExc_ImportWarning,
+ warnstr)) {
+
+ }*/
#if defined(PYOS_OS2)
/* restore the saved snapshot */
strcpy(buf, saved_buf);