Commit 5fedd0c3 authored by Paul Sokolovsky's avatar Paul Sokolovsky
Browse files

py: Fix dict.copy() and low-level map/set allocation.

Two things: 1) set flags in copy properly; make mp_map_init() not be too
smart and do something with requested alloc size. Policy of using prime
numbers for alloc size is high-level policy which should be applied at
corresponding high levels. Low-level functions should just do what they're
asked to, because they don't have enough context to be smarter than that.
For example, munging with alloc size of course breaks dict copying (as
changing sizes requires rehashing).
parent ea85a121
...@@ -30,7 +30,7 @@ void mp_map_init(mp_map_t *map, int n) { ...@@ -30,7 +30,7 @@ void mp_map_init(mp_map_t *map, int n) {
map->alloc = 0; map->alloc = 0;
map->table = NULL; map->table = NULL;
} else { } else {
map->alloc = get_doubling_prime_greater_or_equal_to(n + 1); map->alloc = n;
map->table = m_new0(mp_map_elem_t, map->alloc); map->table = m_new0(mp_map_elem_t, map->alloc);
} }
map->used = 0; map->used = 0;
...@@ -197,7 +197,7 @@ mp_map_elem_t* mp_map_lookup(mp_map_t *map, mp_obj_t index, mp_map_lookup_kind_t ...@@ -197,7 +197,7 @@ mp_map_elem_t* mp_map_lookup(mp_map_t *map, mp_obj_t index, mp_map_lookup_kind_t
/* set */ /* set */
void mp_set_init(mp_set_t *set, int n) { void mp_set_init(mp_set_t *set, int n) {
set->alloc = get_doubling_prime_greater_or_equal_to(n + 1); set->alloc = n;
set->used = 0; set->used = 0;
set->table = m_new0(mp_obj_t, set->alloc); set->table = m_new0(mp_obj_t, set->alloc);
} }
......
...@@ -164,6 +164,8 @@ STATIC mp_obj_t dict_copy(mp_obj_t self_in) { ...@@ -164,6 +164,8 @@ STATIC mp_obj_t dict_copy(mp_obj_t self_in) {
mp_obj_dict_t *self = self_in; mp_obj_dict_t *self = self_in;
mp_obj_dict_t *other = mp_obj_new_dict(self->map.alloc); mp_obj_dict_t *other = mp_obj_new_dict(self->map.alloc);
other->map.used = self->map.used; other->map.used = self->map.used;
other->map.all_keys_are_qstrs = self->map.all_keys_are_qstrs;
other->map.table_is_fixed_array = 0;
memcpy(other->map.table, self->map.table, self->map.alloc * sizeof(mp_map_elem_t)); memcpy(other->map.table, self->map.table, self->map.alloc * sizeof(mp_map_elem_t));
return other; return other;
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment