mirror of
https://github.com/python/cpython.git
synced 2025-12-04 16:43:27 +00:00
Blocked revisions 67002 via svnmerge
........ r67002 | hirokazu.yamamoto | 2008-10-23 09:37:33 +0900 | 1 line Issue #4183: Some tests didn't run with pickle.HIGHEST_PROTOCOL. ........
This commit is contained in:
parent
c1de4ccad7
commit
1543a22d86
2 changed files with 21 additions and 8 deletions
|
|
@ -345,6 +345,9 @@ class _Pickler:
|
||||||
else:
|
else:
|
||||||
self.write(PERSID + str(pid).encode("ascii") + b'\n')
|
self.write(PERSID + str(pid).encode("ascii") + b'\n')
|
||||||
|
|
||||||
|
def _isiter(self, obj):
|
||||||
|
return hasattr(obj, '__next__') and hasattr(obj, '__iter__')
|
||||||
|
|
||||||
def save_reduce(self, func, args, state=None,
|
def save_reduce(self, func, args, state=None,
|
||||||
listitems=None, dictitems=None, obj=None):
|
listitems=None, dictitems=None, obj=None):
|
||||||
# This API is called by some subclasses
|
# This API is called by some subclasses
|
||||||
|
|
@ -357,6 +360,16 @@ class _Pickler:
|
||||||
if not hasattr(func, '__call__'):
|
if not hasattr(func, '__call__'):
|
||||||
raise PicklingError("func from save_reduce() should be callable")
|
raise PicklingError("func from save_reduce() should be callable")
|
||||||
|
|
||||||
|
# Assert that listitems is an iterator
|
||||||
|
if listitems is not None and not self._isiter(listitems):
|
||||||
|
raise PicklingError("listitems from save_reduce() should be an "
|
||||||
|
"iterator")
|
||||||
|
|
||||||
|
# Assert that dictitems is an iterator
|
||||||
|
if dictitems is not None and not self._isiter(dictitems):
|
||||||
|
raise PicklingError("dictitems from save_reduce() should be an "
|
||||||
|
"iterator")
|
||||||
|
|
||||||
save = self.save
|
save = self.save
|
||||||
write = self.write
|
write = self.write
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1963,7 +1963,6 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
|
||||||
PyObject *state = NULL;
|
PyObject *state = NULL;
|
||||||
PyObject *listitems = Py_None;
|
PyObject *listitems = Py_None;
|
||||||
PyObject *dictitems = Py_None;
|
PyObject *dictitems = Py_None;
|
||||||
Py_ssize_t size;
|
|
||||||
|
|
||||||
int use_newobj = self->proto >= 2;
|
int use_newobj = self->proto >= 2;
|
||||||
|
|
||||||
|
|
@ -1971,13 +1970,6 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
|
||||||
const char build_op = BUILD;
|
const char build_op = BUILD;
|
||||||
const char newobj_op = NEWOBJ;
|
const char newobj_op = NEWOBJ;
|
||||||
|
|
||||||
size = PyTuple_Size(args);
|
|
||||||
if (size < 2 || size > 5) {
|
|
||||||
PyErr_SetString(PicklingError, "tuple returned by "
|
|
||||||
"__reduce__ must contain 2 through 5 elements");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!PyArg_UnpackTuple(args, "save_reduce", 2, 5,
|
if (!PyArg_UnpackTuple(args, "save_reduce", 2, 5,
|
||||||
&callable, &argtup, &state, &listitems, &dictitems))
|
&callable, &argtup, &state, &listitems, &dictitems))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
@ -2154,6 +2146,7 @@ save(PicklerObject *self, PyObject *obj, int pers_save)
|
||||||
PyObject *reduce_value = NULL;
|
PyObject *reduce_value = NULL;
|
||||||
PyObject *memo_key = NULL;
|
PyObject *memo_key = NULL;
|
||||||
int status = 0;
|
int status = 0;
|
||||||
|
Py_ssize_t size;
|
||||||
|
|
||||||
if (Py_EnterRecursiveCall(" while pickling an object") < 0)
|
if (Py_EnterRecursiveCall(" while pickling an object") < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
@ -2332,6 +2325,13 @@ save(PicklerObject *self, PyObject *obj, int pers_save)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size = PyTuple_Size(reduce_value);
|
||||||
|
if (size < 2 || size > 5) {
|
||||||
|
PyErr_SetString(PicklingError, "tuple returned by "
|
||||||
|
"__reduce__ must contain 2 through 5 elements");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
status = save_reduce(self, reduce_value, obj);
|
status = save_reduce(self, reduce_value, obj);
|
||||||
|
|
||||||
if (0) {
|
if (0) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue