summaryrefslogtreecommitdiffstats
path: root/Objects/stringobject.c
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2001-09-12 05:18:58 (GMT)
committerTim Peters <tim.peters@gmail.com>2001-09-12 05:18:58 (GMT)
commitaf90b3e610212a4994962246875e5bfc5574dff6 (patch)
tree241056a3295c441dc7ef56d2cd690af5f1287281 /Objects/stringobject.c
parent7a29bd58614da9fc478d7167ba918d92c2dcca7e (diff)
downloadcpython-af90b3e610212a4994962246875e5bfc5574dff6.zip
cpython-af90b3e610212a4994962246875e5bfc5574dff6.tar.gz
cpython-af90b3e610212a4994962246875e5bfc5574dff6.tar.bz2
str_subtype_new, unicode_subtype_new:
+ These were leaving the hash fields at 0, which all string and unicode routines believe is a legitimate hash code. As a result, hash() applied to str and unicode subclass instances always returned 0, which in turn confused dict operations, etc. + Changed local names "new"; no point to antagonizing C++ compilers.
Diffstat (limited to 'Objects/stringobject.c')
-rw-r--r--Objects/stringobject.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index b220859..3c03b9e 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -2671,7 +2671,7 @@ string_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
static PyObject *
str_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
- PyObject *tmp, *new;
+ PyObject *tmp, *pnew;
int n;
assert(PyType_IsSubtype(type, &PyString_Type));
@@ -2679,11 +2679,21 @@ str_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (tmp == NULL)
return NULL;
assert(PyString_CheckExact(tmp));
- new = type->tp_alloc(type, n = PyString_GET_SIZE(tmp));
- if (new != NULL)
- memcpy(PyString_AS_STRING(new), PyString_AS_STRING(tmp), n+1);
+ n = PyString_GET_SIZE(tmp);
+ pnew = type->tp_alloc(type, n);
+ if (pnew != NULL) {
+ memcpy(PyString_AS_STRING(pnew), PyString_AS_STRING(tmp), n+1);
+#ifdef CACHE_HASH
+ ((PyStringObject *)pnew)->ob_shash =
+ ((PyStringObject *)tmp)->ob_shash;
+#endif
+#ifdef INTERN_STRINGS
+ ((PyStringObject *)pnew)->ob_sinterned =
+ ((PyStringObject *)tmp)->ob_sinterned;
+#endif
+ }
Py_DECREF(tmp);
- return new;
+ return pnew;
}
static char string_doc[] =