mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Issue #25406: Fixed a bug in C implementation of OrderedDict.move_to_end()
that caused segmentation fault or hang in iterating after moving several items to the start of ordered dict.
This commit is contained in:
parent
c1e98de7be
commit
992ec46acc
3 changed files with 28 additions and 21 deletions
|
@ -618,37 +618,26 @@ _odict_find_node(PyODictObject *od, PyObject *key)
|
|||
static void
|
||||
_odict_add_head(PyODictObject *od, _ODictNode *node)
|
||||
{
|
||||
if (_odict_FIRST(od) == NULL) {
|
||||
_odictnode_PREV(node) = NULL;
|
||||
_odictnode_NEXT(node) = NULL;
|
||||
_odict_FIRST(od) = node;
|
||||
_odictnode_PREV(node) = NULL;
|
||||
_odictnode_NEXT(node) = _odict_FIRST(od);
|
||||
if (_odict_FIRST(od) == NULL)
|
||||
_odict_LAST(od) = node;
|
||||
}
|
||||
else {
|
||||
_odictnode_PREV(node) = NULL;
|
||||
_odictnode_NEXT(node) = _odict_FIRST(od);
|
||||
_odict_FIRST(od) = node;
|
||||
else
|
||||
_odictnode_PREV(_odict_FIRST(od)) = node;
|
||||
}
|
||||
_odict_FIRST(od) = node;
|
||||
od->od_state++;
|
||||
}
|
||||
|
||||
static void
|
||||
_odict_add_tail(PyODictObject *od, _ODictNode *node)
|
||||
{
|
||||
if (_odict_LAST(od) == NULL) {
|
||||
_odictnode_PREV(node) = NULL;
|
||||
_odictnode_NEXT(node) = NULL;
|
||||
_odictnode_PREV(node) = _odict_LAST(od);
|
||||
_odictnode_NEXT(node) = NULL;
|
||||
if (_odict_LAST(od) == NULL)
|
||||
_odict_FIRST(od) = node;
|
||||
_odict_LAST(od) = node;
|
||||
}
|
||||
else {
|
||||
_odictnode_PREV(node) = _odict_LAST(od);
|
||||
_odictnode_NEXT(node) = NULL;
|
||||
else
|
||||
_odictnode_NEXT(_odict_LAST(od)) = node;
|
||||
_odict_LAST(od) = node;
|
||||
}
|
||||
|
||||
_odict_LAST(od) = node;
|
||||
od->od_state++;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue