mirror of
https://github.com/python/cpython.git
synced 2025-11-02 11:08:57 +00:00
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.
This commit is contained in:
parent
7a29bd5861
commit
af90b3e610
3 changed files with 36 additions and 15 deletions
|
|
@ -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[] =
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue