mirror of
https://github.com/python/cpython.git
synced 2025-08-27 12:16:04 +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
|
@ -5331,7 +5331,7 @@ unicode_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
static PyObject *
|
||||
unicode_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
PyUnicodeObject *tmp, *new;
|
||||
PyUnicodeObject *tmp, *pnew;
|
||||
int n;
|
||||
|
||||
assert(PyType_IsSubtype(type, &PyUnicode_Type));
|
||||
|
@ -5339,19 +5339,20 @@ unicode_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
if (tmp == NULL)
|
||||
return NULL;
|
||||
assert(PyUnicode_Check(tmp));
|
||||
new = (PyUnicodeObject *) type->tp_alloc(type, n = tmp->length);
|
||||
if (new == NULL)
|
||||
pnew = (PyUnicodeObject *) type->tp_alloc(type, n = tmp->length);
|
||||
if (pnew == NULL)
|
||||
return NULL;
|
||||
new->str = PyMem_NEW(Py_UNICODE, n+1);
|
||||
if (new->str == NULL) {
|
||||
_Py_ForgetReference((PyObject *)new);
|
||||
PyObject_DEL(new);
|
||||
pnew->str = PyMem_NEW(Py_UNICODE, n+1);
|
||||
if (pnew->str == NULL) {
|
||||
_Py_ForgetReference((PyObject *)pnew);
|
||||
PyObject_DEL(pnew);
|
||||
return NULL;
|
||||
}
|
||||
Py_UNICODE_COPY(new->str, tmp->str, n+1);
|
||||
new->length = n;
|
||||
Py_UNICODE_COPY(pnew->str, tmp->str, n+1);
|
||||
pnew->length = n;
|
||||
pnew->hash = tmp->hash;
|
||||
Py_DECREF(tmp);
|
||||
return (PyObject *)new;
|
||||
return (PyObject *)pnew;
|
||||
}
|
||||
|
||||
static char unicode_doc[] =
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue