mirror of https://github.com/python/cpython
Change sys.intern() so that unicode strings can be
interned too. Add a test for this.
This commit is contained in:
parent
360b01a663
commit
2a0c081470
|
@ -356,7 +356,7 @@ class SysModuleTest(unittest.TestCase):
|
||||||
# We don't want them in the interned dict and if they aren't
|
# We don't want them in the interned dict and if they aren't
|
||||||
# actually interned, we don't want to create the appearance
|
# actually interned, we don't want to create the appearance
|
||||||
# that they are by allowing intern() to succeeed.
|
# that they are by allowing intern() to succeeed.
|
||||||
class S(str):
|
class S(str8):
|
||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
return 123
|
return 123
|
||||||
|
|
||||||
|
@ -368,6 +368,17 @@ class SysModuleTest(unittest.TestCase):
|
||||||
setattr(s, s, s)
|
setattr(s, s, s)
|
||||||
self.assertEqual(getattr(s, s), s)
|
self.assertEqual(getattr(s, s), s)
|
||||||
|
|
||||||
|
s = "never interned as unicode before"
|
||||||
|
self.assert_(sys.intern(s) is s)
|
||||||
|
s2 = s.swapcase().swapcase()
|
||||||
|
self.assert_(sys.intern(s2) is s)
|
||||||
|
|
||||||
|
class U(str):
|
||||||
|
def __hash__(self):
|
||||||
|
return 123
|
||||||
|
|
||||||
|
self.assertRaises(TypeError, sys.intern, U("abc"))
|
||||||
|
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
test.test_support.run_unittest(SysModuleTest)
|
test.test_support.run_unittest(SysModuleTest)
|
||||||
|
|
|
@ -266,14 +266,21 @@ sys_intern(PyObject *self, PyObject *args)
|
||||||
PyObject *s;
|
PyObject *s;
|
||||||
if (!PyArg_ParseTuple(args, "S:intern", &s))
|
if (!PyArg_ParseTuple(args, "S:intern", &s))
|
||||||
return NULL;
|
return NULL;
|
||||||
if (!PyString_CheckExact(s)) {
|
if (PyString_CheckExact(s)) {
|
||||||
PyErr_SetString(PyExc_TypeError,
|
Py_INCREF(s);
|
||||||
"can't intern subclass of string");
|
PyString_InternInPlace(&s);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
else if (PyUnicode_CheckExact(s)) {
|
||||||
|
Py_INCREF(s);
|
||||||
|
PyUnicode_InternInPlace(&s);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
PyErr_Format(PyExc_TypeError,
|
||||||
|
"can't intern %.400s", s->ob_type->tp_name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
Py_INCREF(s);
|
|
||||||
PyString_InternInPlace(&s);
|
|
||||||
return s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PyDoc_STRVAR(intern_doc,
|
PyDoc_STRVAR(intern_doc,
|
||||||
|
|
Loading…
Reference in New Issue