diff options
author | Jeremy Hylton <jeremy@alum.mit.edu> | 2004-08-07 19:20:05 (GMT) |
---|---|---|
committer | Jeremy Hylton <jeremy@alum.mit.edu> | 2004-08-07 19:20:05 (GMT) |
commit | 4c989ddc9c8bd38ab14c9f42511eb567ed219604 (patch) | |
tree | 9e91f6cf6dd52b386920c4123132f846b94e4817 /Python | |
parent | cbd81556bb975b72697d2989eccfbc9f3e39b3de (diff) | |
download | cpython-4c989ddc9c8bd38ab14c9f42511eb567ed219604.zip cpython-4c989ddc9c8bd38ab14c9f42511eb567ed219604.tar.gz cpython-4c989ddc9c8bd38ab14c9f42511eb567ed219604.tar.bz2 |
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.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/bltinmodule.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 8ff733c..04fcf59 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -1035,6 +1035,11 @@ builtin_intern(PyObject *self, PyObject *args) PyObject *s; if (!PyArg_ParseTuple(args, "S:intern", &s)) return NULL; + if (!PyString_CheckExact(s)) { + PyErr_SetString(PyExc_TypeError, + "can't intern subclass of string"); + return NULL; + } Py_INCREF(s); PyString_InternInPlace(&s); return s; |