mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
Subclasses of string can no longer be interned. The semantics of
interning were not clear here -- a subclass could be mutable, for example -- and had bugs. Explicitly interning a subclass of string via intern() will raise a TypeError. Internal operations that attempt to intern a string subclass will have no effect. Added a few tests to test_builtin that includes the old buggy code and verifies that calls like PyObject_SetAttr() don't fail. Perhaps these tests should have gone in test_string.
This commit is contained in:
parent
cbd81556bb
commit
4c989ddc9c
4 changed files with 40 additions and 22 deletions
|
@ -608,6 +608,23 @@ class BuiltinTest(unittest.TestCase):
|
|||
s2 = s.swapcase().swapcase()
|
||||
self.assert_(intern(s2) is s)
|
||||
|
||||
# Subclasses of string can't be interned, because they
|
||||
# provide too much opportunity for insane things to happen.
|
||||
# We don't want them in the interned dict and if they aren't
|
||||
# actually interned, we don't want to create the appearance
|
||||
# that they are by allowing intern() to succeeed.
|
||||
class S(str):
|
||||
def __hash__(self):
|
||||
return 123
|
||||
|
||||
self.assertRaises(TypeError, intern, S("abc"))
|
||||
|
||||
# It's still safe to pass these strings to routines that
|
||||
# call intern internally, e.g. PyObject_SetAttr().
|
||||
s = S("abc")
|
||||
setattr(s, s, s)
|
||||
self.assertEqual(getattr(s, s), s)
|
||||
|
||||
def test_iter(self):
|
||||
self.assertRaises(TypeError, iter)
|
||||
self.assertRaises(TypeError, iter, 42, 42)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue