bpo-46864: Deprecate PyBytesObject.ob_shash. (GH-31598)

This commit is contained in:
Inada Naoki 2022-03-06 11:39:10 +09:00 committed by GitHub
parent 6927632492
commit 2d8b764210
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 23 additions and 1 deletions

View File

@ -985,6 +985,9 @@ Deprecated
<init-config>` instead (:pep:`587`). <init-config>` instead (:pep:`587`).
(Contributed by Victor Stinner in :issue:`44113`.) (Contributed by Victor Stinner in :issue:`44113`.)
* Deprecate the ``ob_shash`` member of the :c:type:`PyBytesObject`. Use :c:func:`PyObject_Hash` instead.
(Contributed by Inada Naoki in :issue:`46864`.)
Removed Removed
------- -------

View File

@ -4,7 +4,7 @@
typedef struct { typedef struct {
PyObject_VAR_HEAD PyObject_VAR_HEAD
Py_hash_t ob_shash; Py_DEPRECATED(3.11) Py_hash_t ob_shash;
char ob_sval[1]; char ob_sval[1];
/* Invariants: /* Invariants:

View File

@ -0,0 +1 @@
Deprecate ``PyBytesObject.ob_shash``. It will be removed in Python 3.13.

View File

@ -105,7 +105,10 @@ _PyBytes_FromSize(Py_ssize_t size, int use_calloc)
return PyErr_NoMemory(); return PyErr_NoMemory();
} }
_PyObject_InitVar((PyVarObject*)op, &PyBytes_Type, size); _PyObject_InitVar((PyVarObject*)op, &PyBytes_Type, size);
_Py_COMP_DIAG_PUSH
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
op->ob_shash = -1; op->ob_shash = -1;
_Py_COMP_DIAG_POP
if (!use_calloc) { if (!use_calloc) {
op->ob_sval[size] = '\0'; op->ob_sval[size] = '\0';
} }
@ -169,7 +172,10 @@ PyBytes_FromString(const char *str)
return PyErr_NoMemory(); return PyErr_NoMemory();
} }
_PyObject_InitVar((PyVarObject*)op, &PyBytes_Type, size); _PyObject_InitVar((PyVarObject*)op, &PyBytes_Type, size);
_Py_COMP_DIAG_PUSH
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
op->ob_shash = -1; op->ob_shash = -1;
_Py_COMP_DIAG_POP
memcpy(op->ob_sval, str, size+1); memcpy(op->ob_sval, str, size+1);
return (PyObject *) op; return (PyObject *) op;
} }
@ -1446,7 +1452,10 @@ bytes_repeat(PyBytesObject *a, Py_ssize_t n)
return PyErr_NoMemory(); return PyErr_NoMemory();
} }
_PyObject_InitVar((PyVarObject*)op, &PyBytes_Type, size); _PyObject_InitVar((PyVarObject*)op, &PyBytes_Type, size);
_Py_COMP_DIAG_PUSH
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
op->ob_shash = -1; op->ob_shash = -1;
_Py_COMP_DIAG_POP
op->ob_sval[size] = '\0'; op->ob_sval[size] = '\0';
if (Py_SIZE(a) == 1 && n > 0) { if (Py_SIZE(a) == 1 && n > 0) {
memset(op->ob_sval, a->ob_sval[0] , n); memset(op->ob_sval, a->ob_sval[0] , n);
@ -1562,11 +1571,14 @@ bytes_richcompare(PyBytesObject *a, PyBytesObject *b, int op)
static Py_hash_t static Py_hash_t
bytes_hash(PyBytesObject *a) bytes_hash(PyBytesObject *a)
{ {
_Py_COMP_DIAG_PUSH
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
if (a->ob_shash == -1) { if (a->ob_shash == -1) {
/* Can't fail */ /* Can't fail */
a->ob_shash = _Py_HashBytes(a->ob_sval, Py_SIZE(a)); a->ob_shash = _Py_HashBytes(a->ob_sval, Py_SIZE(a));
} }
return a->ob_shash; return a->ob_shash;
_Py_COMP_DIAG_POP
} }
static PyObject* static PyObject*
@ -2868,8 +2880,11 @@ bytes_subtype_new(PyTypeObject *type, PyObject *tmp)
if (pnew != NULL) { if (pnew != NULL) {
memcpy(PyBytes_AS_STRING(pnew), memcpy(PyBytes_AS_STRING(pnew),
PyBytes_AS_STRING(tmp), n+1); PyBytes_AS_STRING(tmp), n+1);
_Py_COMP_DIAG_PUSH
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
((PyBytesObject *)pnew)->ob_shash = ((PyBytesObject *)pnew)->ob_shash =
((PyBytesObject *)tmp)->ob_shash; ((PyBytesObject *)tmp)->ob_shash;
_Py_COMP_DIAG_POP
} }
return pnew; return pnew;
} }
@ -3051,7 +3066,10 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
sv = (PyBytesObject *) *pv; sv = (PyBytesObject *) *pv;
Py_SET_SIZE(sv, newsize); Py_SET_SIZE(sv, newsize);
sv->ob_sval[newsize] = '\0'; sv->ob_sval[newsize] = '\0';
_Py_COMP_DIAG_PUSH
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
sv->ob_shash = -1; /* invalidate cached hash value */ sv->ob_shash = -1; /* invalidate cached hash value */
_Py_COMP_DIAG_POP
return 0; return 0;
error: error:
*pv = 0; *pv = 0;