gh-95196: Disable incorrect pickling of the C implemented classmethod descriptors (GH-96383)

(cherry picked from commit 77f0249308)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
Miss Islington (bot) 2022-10-05 04:53:38 -07:00 committed by GitHub
parent 3c09debaa7
commit d108eeb678
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 1 deletions

View file

@ -2773,6 +2773,15 @@ class AbstractPickleTests:
unpickled = self.loads(self.dumps(method, proto))
self.assertEqual(method(obj), unpickled(obj))
descriptors = (
PyMethodsTest.__dict__['cheese'], # static method descriptor
PyMethodsTest.__dict__['wine'], # class method descriptor
)
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
for descr in descriptors:
with self.subTest(proto=proto, descr=descr):
self.assertRaises(TypeError, self.dumps, descr, proto)
def test_c_methods(self):
global Subclass
class Subclass(tuple):
@ -2808,6 +2817,15 @@ class AbstractPickleTests:
unpickled = self.loads(self.dumps(method, proto))
self.assertEqual(method(*args), unpickled(*args))
descriptors = (
bytearray.__dict__['maketrans'], # built-in static method descriptor
dict.__dict__['fromkeys'], # built-in class method descriptor
)
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
for descr in descriptors:
with self.subTest(proto=proto, descr=descr):
self.assertRaises(TypeError, self.dumps, descr, proto)
def test_compat_pickle(self):
tests = [
(range(1, 7), '__builtin__', 'xrange'),

View file

@ -0,0 +1 @@
Disable incorrect pickling of the C implemented classmethod descriptors.

View file

@ -755,7 +755,7 @@ PyTypeObject PyClassMethodDescr_Type = {
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
descr_methods, /* tp_methods */
0, /* tp_methods */
descr_members, /* tp_members */
method_getset, /* tp_getset */
0, /* tp_base */