Add a test case for exception pickling. args is never NULL.

This commit is contained in:
Georg Brandl 2006-05-30 07:13:29 +00:00
parent ddba473e26
commit 05f97bffac
2 changed files with 21 additions and 11 deletions

View File

@ -270,6 +270,8 @@ try:
'winerror' : 1 }))
except NameError: pass
import pickle, random
for args in exceptionList:
expected = args[-1]
try:
@ -283,3 +285,14 @@ for args in exceptionList:
( repr(e), checkArgName,
repr(expected[checkArgName]),
repr(getattr(e, checkArgName)) ))
# test for pickling support
new = pickle.loads(pickle.dumps(e, random.randint(0, 2)))
for checkArgName in expected.keys():
if repr(getattr(e, checkArgName)) != repr(expected[checkArgName]):
raise TestFailed('Checking unpickled exception arguments, '
'exception '
'"%s", attribute "%s" expected %s got %s.' %
( repr(e), checkArgName,
repr(expected[checkArgName]),
repr(getattr(e, checkArgName)) ))

View File

@ -143,15 +143,8 @@ BaseException_reduce(PyBaseExceptionObject *self)
{
if (self->args && self->dict)
return PyTuple_Pack(3, self->ob_type, self->args, self->dict);
else if (self->args)
else
return PyTuple_Pack(2, self->ob_type, self->args);
else {
PyObject *res, *tup = PyTuple_New(0);
if (!tup) return NULL;
res = PyTuple_Pack(2, self->ob_type, tup);
Py_DECREF(tup);
return res;
}
}
@ -667,6 +660,7 @@ EnvironmentError_reduce(PyEnvironmentErrorObject *self)
{
PyObject *args = self->args;
PyObject *res = NULL, *tmp;
/* self->args is only the first two real arguments if there was a
* file name given to EnvironmentError. */
if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
@ -683,10 +677,13 @@ EnvironmentError_reduce(PyEnvironmentErrorObject *self)
Py_INCREF(self->filename);
PyTuple_SET_ITEM(args, 2, self->filename);
} else {
} else
Py_INCREF(args);
}
res = PyTuple_Pack(3, self->ob_type, args, self->dict);
if (self->dict)
res = PyTuple_Pack(3, self->ob_type, args, self->dict);
else
res = PyTuple_Pack(2, self->ob_type, args);
Py_DECREF(args);
return res;
}