mirror of
https://github.com/python/cpython.git
synced 2025-08-24 10:45:53 +00:00
gh-126298: Don't deduplicate slice constants based on equality (#126398)
* gh-126298: Don't deduplicated slice constants based on equality * NULL check for PySlice_New * Fix refcounting * Fix refcounting some more * Fix refcounting * Make tests more complete * Fix tests
This commit is contained in:
parent
9357fdcaf0
commit
a38e82bd8c
2 changed files with 93 additions and 20 deletions
|
@ -2388,7 +2388,6 @@ _PyCode_ConstantKey(PyObject *op)
|
|||
if (op == Py_None || op == Py_Ellipsis
|
||||
|| PyLong_CheckExact(op)
|
||||
|| PyUnicode_CheckExact(op)
|
||||
|| PySlice_Check(op)
|
||||
/* code_richcompare() uses _PyCode_ConstantKey() internally */
|
||||
|| PyCode_Check(op))
|
||||
{
|
||||
|
@ -2496,6 +2495,40 @@ _PyCode_ConstantKey(PyObject *op)
|
|||
Py_DECREF(set);
|
||||
return key;
|
||||
}
|
||||
else if (PySlice_Check(op)) {
|
||||
PySliceObject *slice = (PySliceObject *)op;
|
||||
PyObject *start_key = NULL;
|
||||
PyObject *stop_key = NULL;
|
||||
PyObject *step_key = NULL;
|
||||
key = NULL;
|
||||
|
||||
start_key = _PyCode_ConstantKey(slice->start);
|
||||
if (start_key == NULL) {
|
||||
goto slice_exit;
|
||||
}
|
||||
|
||||
stop_key = _PyCode_ConstantKey(slice->stop);
|
||||
if (stop_key == NULL) {
|
||||
goto slice_exit;
|
||||
}
|
||||
|
||||
step_key = _PyCode_ConstantKey(slice->step);
|
||||
if (step_key == NULL) {
|
||||
goto slice_exit;
|
||||
}
|
||||
|
||||
PyObject *slice_key = PySlice_New(start_key, stop_key, step_key);
|
||||
if (slice_key == NULL) {
|
||||
goto slice_exit;
|
||||
}
|
||||
|
||||
key = PyTuple_Pack(2, slice_key, op);
|
||||
Py_DECREF(slice_key);
|
||||
slice_exit:
|
||||
Py_XDECREF(start_key);
|
||||
Py_XDECREF(stop_key);
|
||||
Py_XDECREF(step_key);
|
||||
}
|
||||
else {
|
||||
/* for other types, use the object identifier as a unique identifier
|
||||
* to ensure that they are seen as unequal. */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue