Commit ff150f29 authored by Antoine Pitrou's avatar Antoine Pitrou

Revert r85797 (and r85798): it broke the Windows buildbots because of

test_multiprocessing's misbehaviour.
parent 45f9cf96
...@@ -563,8 +563,7 @@ A number of small performance enhancements have been added: ...@@ -563,8 +563,7 @@ A number of small performance enhancements have been added:
* Serializing and unserializing data using the :mod:`pickle` module is now * Serializing and unserializing data using the :mod:`pickle` module is now
several times faster. (Contributed by Alexandre Vassalotti, Antoine Pitrou several times faster. (Contributed by Alexandre Vassalotti, Antoine Pitrou
and the Unladen Swallow team in :issue:`9410`, :issue:`3873` and and the Unladen Swallow team in :issue:`9410` and :issue:`3873`.)
:issue:`9935`.)
Filenames and Unicode Filenames and Unicode
......
...@@ -3,7 +3,6 @@ import unittest ...@@ -3,7 +3,6 @@ import unittest
import pickle import pickle
import pickletools import pickletools
import copyreg import copyreg
import weakref
from http.cookies import SimpleCookie from http.cookies import SimpleCookie
from test.support import TestFailed, TESTFN, run_with_locale from test.support import TestFailed, TESTFN, run_with_locale
...@@ -843,25 +842,6 @@ class AbstractPickleTests(unittest.TestCase): ...@@ -843,25 +842,6 @@ class AbstractPickleTests(unittest.TestCase):
self.assertEqual(B(x), B(y), detail) self.assertEqual(B(x), B(y), detail)
self.assertEqual(x.__dict__, y.__dict__, detail) self.assertEqual(x.__dict__, y.__dict__, detail)
def test_newobj_proxies(self):
# NEWOBJ should use the __class__ rather than the raw type
classes = myclasses[:]
# Cannot create weakproxies to these classes
for c in (MyInt, MyTuple):
classes.remove(c)
for proto in protocols:
for C in classes:
B = C.__base__
x = C(C.sample)
x.foo = 42
p = weakref.proxy(x)
s = self.dumps(p, proto)
y = self.loads(s)
self.assertEqual(type(y), type(x)) # rather than type(p)
detail = (proto, C, B, x, y, type(y))
self.assertEqual(B(x), B(y), detail)
self.assertEqual(x.__dict__, y.__dict__, detail)
# Register a type with copyreg, with extension code extcode. Pickle # Register a type with copyreg, with extension code extcode. Pickle
# an object of that type. Check that the resulting pickle uses opcode # an object of that type. Check that the resulting pickle uses opcode
# (EXT[124]) under proto 2, and not in proto 1. # (EXT[124]) under proto 2, and not in proto 1.
...@@ -1028,6 +1008,7 @@ class AbstractPickleTests(unittest.TestCase): ...@@ -1028,6 +1008,7 @@ class AbstractPickleTests(unittest.TestCase):
self.assertRaises(RuntimeError, self.dumps, x, proto) self.assertRaises(RuntimeError, self.dumps, x, proto)
# protocol 2 don't raise a RuntimeError. # protocol 2 don't raise a RuntimeError.
d = self.dumps(x, 2) d = self.dumps(x, 2)
self.assertRaises(RuntimeError, self.loads, d)
def test_reduce_bad_iterator(self): def test_reduce_bad_iterator(self):
# Issue4176: crash when 4th and 5th items of __reduce__() # Issue4176: crash when 4th and 5th items of __reduce__()
......
...@@ -43,8 +43,6 @@ Core and Builtins ...@@ -43,8 +43,6 @@ Core and Builtins
Library Library
------- -------
- Issue #9935: Speed up pickling of instances of user-defined classes.
- Issue #5639: Add a *server_hostname* argument to ``SSLContext.wrap_socket`` - Issue #5639: Add a *server_hostname* argument to ``SSLContext.wrap_socket``
in order to support the TLS SNI extension. ``HTTPSConnection`` and in order to support the TLS SNI extension. ``HTTPSConnection`` and
``urlopen()`` also use this argument, so that HTTPS virtual hosts are now ``urlopen()`` also use this argument, so that HTTPS virtual hosts are now
......
...@@ -2840,28 +2840,6 @@ save_pers(PicklerObject *self, PyObject *obj, PyObject *func) ...@@ -2840,28 +2840,6 @@ save_pers(PicklerObject *self, PyObject *obj, PyObject *func)
return status; return status;
} }
static PyObject *
get_class(PyObject *obj)
{
PyObject *cls;
static PyObject *str_class;
if (str_class == NULL) {
str_class = PyUnicode_InternFromString("__class__");
if (str_class == NULL)
return NULL;
}
cls = PyObject_GetAttr(obj, str_class);
if (cls == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
PyErr_Clear();
cls = (PyObject *) Py_TYPE(obj);
Py_INCREF(cls);
}
}
return cls;
}
/* We're saving obj, and args is the 2-thru-5 tuple returned by the /* We're saving obj, and args is the 2-thru-5 tuple returned by the
* appropriate __reduce__ method for obj. * appropriate __reduce__ method for obj.
*/ */
...@@ -2927,18 +2905,17 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj) ...@@ -2927,18 +2905,17 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
/* Protocol 2 special case: if callable's name is __newobj__, use /* Protocol 2 special case: if callable's name is __newobj__, use
NEWOBJ. */ NEWOBJ. */
if (use_newobj) { if (use_newobj) {
static PyObject *newobj_str = NULL, *name_str = NULL; static PyObject *newobj_str = NULL;
PyObject *name; PyObject *name_str;
if (newobj_str == NULL) { if (newobj_str == NULL) {
newobj_str = PyUnicode_InternFromString("__newobj__"); newobj_str = PyUnicode_InternFromString("__newobj__");
name_str = PyUnicode_InternFromString("__name__"); if (newobj_str == NULL)
if (newobj_str == NULL || name_str == NULL)
return -1; return -1;
} }
name = PyObject_GetAttr(callable, name_str); name_str = PyObject_GetAttrString(callable, "__name__");
if (name == NULL) { if (name_str == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError)) if (PyErr_ExceptionMatches(PyExc_AttributeError))
PyErr_Clear(); PyErr_Clear();
else else
...@@ -2946,9 +2923,9 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj) ...@@ -2946,9 +2923,9 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
use_newobj = 0; use_newobj = 0;
} }
else { else {
use_newobj = PyUnicode_Check(name) && use_newobj = PyUnicode_Check(name_str) &&
PyUnicode_Compare(name, newobj_str) == 0; PyUnicode_Compare(name_str, newobj_str) == 0;
Py_DECREF(name); Py_DECREF(name_str);
} }
} }
if (use_newobj) { if (use_newobj) {
...@@ -2964,14 +2941,20 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj) ...@@ -2964,14 +2941,20 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
} }
cls = PyTuple_GET_ITEM(argtup, 0); cls = PyTuple_GET_ITEM(argtup, 0);
if (!PyType_Check(cls)) { if (!PyObject_HasAttrString(cls, "__new__")) {
PyErr_SetString(PicklingError, "args[0] from " PyErr_SetString(PicklingError, "args[0] from "
"__newobj__ args is not a type"); "__newobj__ args has no __new__");
return -1; return -1;
} }
if (obj != NULL) { if (obj != NULL) {
obj_class = get_class(obj); obj_class = PyObject_GetAttrString(obj, "__class__");
if (obj_class == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
PyErr_Clear();
else
return -1;
}
p = obj_class != cls; /* true iff a problem */ p = obj_class != cls; /* true iff a problem */
Py_DECREF(obj_class); Py_DECREF(obj_class);
if (p) { if (p) {
......
...@@ -3010,19 +3010,14 @@ static PyObject * ...@@ -3010,19 +3010,14 @@ static PyObject *
import_copyreg(void) import_copyreg(void)
{ {
static PyObject *copyreg_str; static PyObject *copyreg_str;
static PyObject *mod_copyreg = NULL;
if (!copyreg_str) { if (!copyreg_str) {
copyreg_str = PyUnicode_InternFromString("copyreg"); copyreg_str = PyUnicode_InternFromString("copyreg");
if (copyreg_str == NULL) if (copyreg_str == NULL)
return NULL; return NULL;
} }
if (!mod_copyreg) {
mod_copyreg = PyImport_Import(copyreg_str);
}
Py_XINCREF(mod_copyreg); return PyImport_Import(copyreg_str);
return mod_copyreg;
} }
static PyObject * static PyObject *
...@@ -3031,16 +3026,14 @@ slotnames(PyObject *cls) ...@@ -3031,16 +3026,14 @@ slotnames(PyObject *cls)
PyObject *clsdict; PyObject *clsdict;
PyObject *copyreg; PyObject *copyreg;
PyObject *slotnames; PyObject *slotnames;
static PyObject *str_slotnames;
if (str_slotnames == NULL) { if (!PyType_Check(cls)) {
str_slotnames = PyUnicode_InternFromString("__slotnames__"); Py_INCREF(Py_None);
if (str_slotnames == NULL) return Py_None;
return NULL;
} }
clsdict = ((PyTypeObject *)cls)->tp_dict; clsdict = ((PyTypeObject *)cls)->tp_dict;
slotnames = PyDict_GetItem(clsdict, str_slotnames); slotnames = PyDict_GetItemString(clsdict, "__slotnames__");
if (slotnames != NULL && PyList_Check(slotnames)) { if (slotnames != NULL && PyList_Check(slotnames)) {
Py_INCREF(slotnames); Py_INCREF(slotnames);
return slotnames; return slotnames;
...@@ -3074,20 +3067,12 @@ reduce_2(PyObject *obj) ...@@ -3074,20 +3067,12 @@ reduce_2(PyObject *obj)
PyObject *slots = NULL, *listitems = NULL, *dictitems = NULL; PyObject *slots = NULL, *listitems = NULL, *dictitems = NULL;
PyObject *copyreg = NULL, *newobj = NULL, *res = NULL; PyObject *copyreg = NULL, *newobj = NULL, *res = NULL;
Py_ssize_t i, n; Py_ssize_t i, n;
static PyObject *str_getnewargs = NULL, *str_getstate = NULL,
*str_newobj = NULL;
if (str_getnewargs == NULL) {
str_getnewargs = PyUnicode_InternFromString("__getnewargs__");
str_getstate = PyUnicode_InternFromString("__getstate__");
str_newobj = PyUnicode_InternFromString("__newobj__");
if (!str_getnewargs || !str_getstate || !str_newobj)
return NULL;
}
cls = (PyObject *) Py_TYPE(obj); cls = PyObject_GetAttrString(obj, "__class__");
if (cls == NULL)
return NULL;
getnewargs = PyObject_GetAttr(obj, str_getnewargs); getnewargs = PyObject_GetAttrString(obj, "__getnewargs__");
if (getnewargs != NULL) { if (getnewargs != NULL) {
args = PyObject_CallObject(getnewargs, NULL); args = PyObject_CallObject(getnewargs, NULL);
Py_DECREF(getnewargs); Py_DECREF(getnewargs);
...@@ -3105,7 +3090,7 @@ reduce_2(PyObject *obj) ...@@ -3105,7 +3090,7 @@ reduce_2(PyObject *obj)
if (args == NULL) if (args == NULL)
goto end; goto end;
getstate = PyObject_GetAttr(obj, str_getstate); getstate = PyObject_GetAttrString(obj, "__getstate__");
if (getstate != NULL) { if (getstate != NULL) {
state = PyObject_CallObject(getstate, NULL); state = PyObject_CallObject(getstate, NULL);
Py_DECREF(getstate); Py_DECREF(getstate);
...@@ -3113,18 +3098,17 @@ reduce_2(PyObject *obj) ...@@ -3113,18 +3098,17 @@ reduce_2(PyObject *obj)
goto end; goto end;
} }
else { else {
PyObject **dict;
PyErr_Clear(); PyErr_Clear();
dict = _PyObject_GetDictPtr(obj); state = PyObject_GetAttrString(obj, "__dict__");
if (dict && *dict) if (state == NULL) {
state = *dict; PyErr_Clear();
else
state = Py_None; state = Py_None;
Py_INCREF(state); Py_INCREF(state);
}
names = slotnames(cls); names = slotnames(cls);
if (names == NULL) if (names == NULL)
goto end; goto end;
if (names != Py_None && PyList_GET_SIZE(names) > 0) { if (names != Py_None) {
assert(PyList_Check(names)); assert(PyList_Check(names));
slots = PyDict_New(); slots = PyDict_New();
if (slots == NULL) if (slots == NULL)
...@@ -3183,7 +3167,7 @@ reduce_2(PyObject *obj) ...@@ -3183,7 +3167,7 @@ reduce_2(PyObject *obj)
copyreg = import_copyreg(); copyreg = import_copyreg();
if (copyreg == NULL) if (copyreg == NULL)
goto end; goto end;
newobj = PyObject_GetAttr(copyreg, str_newobj); newobj = PyObject_GetAttrString(copyreg, "__newobj__");
if (newobj == NULL) if (newobj == NULL)
goto end; goto end;
...@@ -3191,8 +3175,8 @@ reduce_2(PyObject *obj) ...@@ -3191,8 +3175,8 @@ reduce_2(PyObject *obj)
args2 = PyTuple_New(n+1); args2 = PyTuple_New(n+1);
if (args2 == NULL) if (args2 == NULL)
goto end; goto end;
Py_INCREF(cls);
PyTuple_SET_ITEM(args2, 0, cls); PyTuple_SET_ITEM(args2, 0, cls);
cls = NULL;
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
PyObject *v = PyTuple_GET_ITEM(args, i); PyObject *v = PyTuple_GET_ITEM(args, i);
Py_INCREF(v); Py_INCREF(v);
...@@ -3202,6 +3186,7 @@ reduce_2(PyObject *obj) ...@@ -3202,6 +3186,7 @@ reduce_2(PyObject *obj)
res = PyTuple_Pack(5, newobj, args2, state, listitems, dictitems); res = PyTuple_Pack(5, newobj, args2, state, listitems, dictitems);
end: end:
Py_XDECREF(cls);
Py_XDECREF(args); Py_XDECREF(args);
Py_XDECREF(args2); Py_XDECREF(args2);
Py_XDECREF(slots); Py_XDECREF(slots);
...@@ -3261,34 +3246,31 @@ object_reduce(PyObject *self, PyObject *args) ...@@ -3261,34 +3246,31 @@ object_reduce(PyObject *self, PyObject *args)
static PyObject * static PyObject *
object_reduce_ex(PyObject *self, PyObject *args) object_reduce_ex(PyObject *self, PyObject *args)
{ {
static PyObject *str_reduce = NULL, *objreduce;
PyObject *reduce, *res; PyObject *reduce, *res;
int proto = 0; int proto = 0;
if (!PyArg_ParseTuple(args, "|i:__reduce_ex__", &proto)) if (!PyArg_ParseTuple(args, "|i:__reduce_ex__", &proto))
return NULL; return NULL;
if (str_reduce == NULL) { reduce = PyObject_GetAttrString(self, "__reduce__");
str_reduce = PyUnicode_InternFromString("__reduce__");
objreduce = PyDict_GetItemString(PyBaseObject_Type.tp_dict,
"__reduce__");
if (str_reduce == NULL || objreduce == NULL)
return NULL;
}
reduce = PyObject_GetAttr(self, str_reduce);
if (reduce == NULL) if (reduce == NULL)
PyErr_Clear(); PyErr_Clear();
else { else {
PyObject *cls, *clsreduce; PyObject *cls, *clsreduce, *objreduce;
int override; int override;
cls = PyObject_GetAttrString(self, "__class__");
cls = (PyObject *) Py_TYPE(self); if (cls == NULL) {
clsreduce = PyObject_GetAttr(cls, str_reduce); Py_DECREF(reduce);
return NULL;
}
clsreduce = PyObject_GetAttrString(cls, "__reduce__");
Py_DECREF(cls);
if (clsreduce == NULL) { if (clsreduce == NULL) {
Py_DECREF(reduce); Py_DECREF(reduce);
return NULL; return NULL;
} }
objreduce = PyDict_GetItemString(PyBaseObject_Type.tp_dict,
"__reduce__");
override = (clsreduce != objreduce); override = (clsreduce != objreduce);
Py_DECREF(clsreduce); Py_DECREF(clsreduce);
if (override) { if (override) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment