]> granicus.if.org Git - python/commitdiff
Add a test case for exception pickling. args is never NULL.
authorGeorg Brandl <georg@python.org>
Tue, 30 May 2006 07:13:29 +0000 (07:13 +0000)
committerGeorg Brandl <georg@python.org>
Tue, 30 May 2006 07:13:29 +0000 (07:13 +0000)
Lib/test/test_exceptions.py
Objects/exceptions.c

index 076d84d80e85a3573a48bebbda31835c2567bc69..b4a766e89b62736940bc04fc23248e2db2b53cbb 100644 (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)) ))
index 986d2110c67171fd4e9aa3934ea730449d8f2313..16ba5e56c269111802e2f27a33fd63d24d7c097f 100644 (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;
 }