diff options
author | Damien George <damien.p.george@gmail.com> | 2014-04-05 12:09:09 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-04-05 12:09:09 +0100 |
commit | 3c8aecf62cc7a96a4371972b83c22ea54f5e16db (patch) | |
tree | 18ed9b71a2a5de11c4c8bbbb824ffba0ef0912a4 | |
parent | 586bfce10d510244e578650980f44ecf6acf10a6 (diff) | |
parent | 4a088f4b6168dd8ed8edc70e82bc695d3879abec (diff) | |
download | micropython-3c8aecf62cc7a96a4371972b83c22ea54f5e16db.tar.gz micropython-3c8aecf62cc7a96a4371972b83c22ea54f5e16db.zip |
Merge pull request #431 from pfalcon/unbreak-map-remove
map: When removing a key, don't NULL the entry, but mark as deleted.
-rw-r--r-- | py/map.c | 14 |
1 files changed, 9 insertions, 5 deletions
@@ -127,17 +127,20 @@ mp_map_elem_t* mp_map_lookup(mp_map_t *map, mp_obj_t index, mp_map_lookup_kind_t mp_map_rehash(map); // restart the search for the new element pos = hash % map->alloc; + continue; } else { map->used += 1; elem->key = index; + elem->value = NULL; if (!MP_OBJ_IS_QSTR(index)) { map->all_keys_are_qstrs = 0; } return elem; } - } else { + } else if (elem->value == NULL) { return NULL; } + // Otherwise it's just entry marked as deleted, so continue with next one } else if (elem->key == index || (!map->all_keys_are_qstrs && mp_obj_equal(elem->key, index))) { // found it /* it seems CPython does not replace the index; try x={True:'true'};x[1]='one';x @@ -152,14 +155,15 @@ mp_map_elem_t* mp_map_lookup(mp_map_t *map, mp_obj_t index, mp_map_lookup_kind_t retval->key = elem->key; retval->value = elem->value; elem->key = NULL; - elem->value = NULL; + // elem->key = NULL && elem->value != NULL means "marked deleted" + // assume value indeed never NULL return retval; } return elem; - } else { - // not yet found, keep searching in this table - pos = (pos + 1) % map->alloc; } + + // not yet found, keep searching in this table + pos = (pos + 1) % map->alloc; } } |