(original) (raw)

changeset: 82235:e4c065b2db49 user: Eric Snow ericsnowcurrently@gmail.com date: Sat Feb 16 18:20:32 2013 -0700 files: Lib/test/test_types.py Objects/namespaceobject.c description: Issue #15022: Ensure all pickle protocols are supported. diff -r 05e8d82b19a6 -r e4c065b2db49 Lib/test/test_types.py --- a/Lib/test/test_types.py Sun Feb 17 01:05:46 2013 +0100 +++ b/Lib/test/test_types.py Sat Feb 16 18:20:32 2013 -0700 @@ -1159,10 +1159,15 @@ def test_pickle(self): ns = types.SimpleNamespace(breakfast="spam", lunch="spam") - ns_pickled = pickle.dumps(ns) - ns_roundtrip = pickle.loads(ns_pickled) + for protocol in range(pickle.HIGHEST_PROTOCOL + 1): + pname = "protocol {}".format(protocol) + try: + ns_pickled = pickle.dumps(ns, protocol) + except TypeError as e: + raise TypeError(pname) from e + ns_roundtrip = pickle.loads(ns_pickled) - self.assertEqual(ns, ns_roundtrip) + self.assertEqual(ns, ns_roundtrip, pname) def test_main(): diff -r 05e8d82b19a6 -r e4c065b2db49 Objects/namespaceobject.c --- a/Objects/namespaceobject.c Sun Feb 17 01:05:46 2013 +0100 +++ b/Objects/namespaceobject.c Sat Feb 16 18:20:32 2013 -0700 @@ -173,6 +173,29 @@ } +PyDoc_STRVAR(namespace_reduce__doc__, "Return state information for pickling"); + +static PyObject * +namespace_reduce(register _PyNamespaceObject *ns) +{ + PyObject *result, *args = PyTuple_New(0); + + if (!args) + return NULL; + + result = PyTuple_Pack(3, (PyObject *)Py_TYPE(ns), args, ns->ns_dict); + Py_DECREF(args); + return result; +} + + +static PyMethodDef namespace_methods[] = { + {"__reduce__", (PyCFunction)namespace_reduce, METH_NOARGS, + namespace_reduce__doc__}, + {NULL, NULL} /* sentinel */ +}; + + PyDoc_STRVAR(namespace_doc, "A simple attribute-based namespace.\n\ \n\ @@ -207,7 +230,7 @@ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - 0, /* tp_methods */ + namespace_methods, /* tp_methods */ namespace_members, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ /ericsnowcurrently@gmail.com