]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-31107: Fix copyreg mangled slot names calculation. (#2989)
authorShane Harvey <shane.harvey@mongodb.com>
Fri, 4 Aug 2017 08:45:00 +0000 (01:45 -0700)
committerSerhiy Storchaka <storchaka@gmail.com>
Fri, 4 Aug 2017 08:45:00 +0000 (11:45 +0300)
Lib/copyreg.py
Lib/test/test_copyreg.py
Misc/ACKS
Misc/NEWS.d/next/Library/2017-08-02-12-48-15.bpo-31107.1t2hn5.rst [new file with mode: 0644]

index ed29d719def30e9e81a1d207bbf4f19787cad0d7..bbe1af4e2e7e7178b68faf234a428b5bd8eaf2d8 100644 (file)
@@ -128,7 +128,11 @@ def _slotnames(cls):
                         continue
                     # mangled names
                     elif name.startswith('__') and not name.endswith('__'):
-                        names.append('_%s%s' % (c.__name__, name))
+                        stripped = c.__name__.lstrip('_')
+                        if stripped:
+                            names.append('_%s%s' % (stripped, name))
+                        else:
+                            names.append(name)
                     else:
                         names.append(name)
 
index 52e887cb36c41e73d863d396258e0cbb16c3ebcd..e3f1cd81aab205259f8d5a0afa73c5e263858229 100644 (file)
@@ -16,6 +16,12 @@ class WithWeakref(object):
 class WithPrivate(object):
     __slots__ = ('__spam',)
 
+class _WithLeadingUnderscoreAndPrivate(object):
+    __slots__ = ('__spam',)
+
+class ___(object):
+    __slots__ = ('__spam',)
+
 class WithSingleString(object):
     __slots__ = 'spam'
 
@@ -104,6 +110,10 @@ class CopyRegTestCase(unittest.TestCase):
         self.assertEqual(copyreg._slotnames(WithWeakref), [])
         expected = ['_WithPrivate__spam']
         self.assertEqual(copyreg._slotnames(WithPrivate), expected)
+        expected = ['_WithLeadingUnderscoreAndPrivate__spam']
+        self.assertEqual(copyreg._slotnames(_WithLeadingUnderscoreAndPrivate),
+                         expected)
+        self.assertEqual(copyreg._slotnames(___), ['__spam'])
         self.assertEqual(copyreg._slotnames(WithSingleString), ['spam'])
         expected = ['eggs', 'spam']
         expected.sort()
index f1f6c147f4976dda647e4c925bc581fd66eea90c..ec7d481a5878b581d51085a215670231be55afc7 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -598,6 +598,7 @@ David Harrigan
 Brian Harring
 Jonathan Hartley
 Travis B. Hartwell
+Shane Harvey
 Larry Hastings
 Tim Hatch
 Shane Hathaway
diff --git a/Misc/NEWS.d/next/Library/2017-08-02-12-48-15.bpo-31107.1t2hn5.rst b/Misc/NEWS.d/next/Library/2017-08-02-12-48-15.bpo-31107.1t2hn5.rst
new file mode 100644 (file)
index 0000000..3c2a155
--- /dev/null
@@ -0,0 +1,2 @@
+Fix `copyreg._slotnames()` mangled attribute calculation for classes whose
+name begins with an underscore. Patch by Shane Harvey.