[Python-checkins] cpython (merge 3.5 -> default): Issue #25410: Made testing that od_fast_nodes and dk_entries are in sync more

serhiy.storchaka python-checkins at python.org
Fri Nov 6 05:01:04 EST 2015


https://hg.python.org/cpython/rev/c16af48153a4
changeset:   98988:c16af48153a4
parent:      98986:d29c576dc7a0
parent:      98987:45ce4c6b4f36
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Fri Nov 06 12:00:43 2015 +0200
summary:
  Issue #25410: Made testing that od_fast_nodes and dk_entries are in sync more
reliable.

files:
  Objects/odictobject.c |  12 ++++++++----
  1 files changed, 8 insertions(+), 4 deletions(-)


diff --git a/Objects/odictobject.c b/Objects/odictobject.c
--- a/Objects/odictobject.c
+++ b/Objects/odictobject.c
@@ -481,10 +481,12 @@
     PyDictObject od_dict;        /* the underlying dict */
     _ODictNode *od_first;        /* first node in the linked list, if any */
     _ODictNode *od_last;         /* last node in the linked list, if any */
-    /* od_fast_nodes and od_resize_sentinel are managed by _odict_resize()
+    /* od_fast_nodes, od_fast_nodes_size and od_resize_sentinel are managed
+     * by _odict_resize().
      * Note that we rely on implementation details of dict for both. */
     _ODictNode **od_fast_nodes;  /* hash table that mirrors the dict table */
-    Py_uintptr_t od_resize_sentinel;  /* changes if odict should be resized */
+    Py_ssize_t od_fast_nodes_size;
+    void *od_resize_sentinel;    /* changes if odict should be resized */
 
     size_t od_state;             /* incremented whenever the LL changes */
     PyObject *od_inst_dict;      /* OrderedDict().__dict__ */
@@ -573,7 +575,8 @@
     /* Replace the old fast nodes table. */
     _odict_free_fast_nodes(od);
     od->od_fast_nodes = fast_nodes;
-    od->od_resize_sentinel = (Py_uintptr_t)(((PyDictObject *)od)->ma_keys);
+    od->od_fast_nodes_size = size;
+    od->od_resize_sentinel = ((PyDictObject *)od)->ma_keys;
     return 0;
 }
 
@@ -591,7 +594,8 @@
     keys = ((PyDictObject *)od)->ma_keys;
 
     /* Ensure od_fast_nodes and dk_entries are in sync. */
-    if (od->od_resize_sentinel != (Py_uintptr_t)keys) {
+    if (od->od_resize_sentinel != keys ||
+        od->od_fast_nodes_size != keys->dk_size) {
         int resize_res = _odict_resize(od);
         if (resize_res < 0)
             return -1;

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list