From 05f97bffac5ae9ded29c5f845dff5edc99ff1620 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Tue, 30 May 2006 07:13:29 +0000 Subject: Add a test case for exception pickling. args is never NULL. --- Lib/test/test_exceptions.py | 13 +++++++++++++ Objects/exceptions.c | 19 ++++++++----------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 076d84d..b4a766e 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -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)) )) diff --git a/Objects/exceptions.c b/Objects/exceptions.c index 986d211..16ba5e5 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -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; } -- cgit v0.12