Skip to content

Commit

Permalink
py: Fix dict.copy() and low-level map/set allocation.
Browse files Browse the repository at this point in the history
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).
  • Loading branch information
pfalcon committed Apr 6, 2014
1 parent ea85a12 commit 5fedd0c
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 2 deletions.
4 changes: 2 additions & 2 deletions py/map.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ void mp_map_init(mp_map_t *map, int n) {
map->alloc = 0;
map->table = NULL;
} 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->used = 0;
Expand Down Expand Up @@ -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 */

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->table = m_new0(mp_obj_t, set->alloc);
}
Expand Down
2 changes: 2 additions & 0 deletions py/objdict.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 *other = mp_obj_new_dict(self->map.alloc);
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));
return other;
}
Expand Down

0 comments on commit 5fedd0c

Please sign in to comment.