Skip to content

Commit 686afc5

Browse files
committed
py: Check that sequence has 2 elements for dict iterable constructor.
1 parent be019ce commit 686afc5

3 files changed

Lines changed: 15 additions & 3 deletions

File tree

py/obj.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ void mp_obj_get_array_fixed_n(mp_obj_t o, uint len, mp_obj_t **items) {
280280
mp_obj_list_get(o, &seq_len, items);
281281
}
282282
if (seq_len != len) {
283-
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_IndexError, "requested length %d but object has length %d", len, seq_len));
283+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "requested length %d but object has length %d", len, seq_len));
284284
}
285285
} else {
286286
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "object '%s' is not a tuple or list", mp_obj_get_type_str(o)));

py/objdict.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,11 @@ STATIC mp_obj_t dict_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp
5050
mp_obj_t iterable = mp_getiter(args[0]);
5151
mp_obj_t dict = mp_obj_new_dict(0);
5252
// TODO: support arbitrary seq as a pair
53-
mp_obj_tuple_t *item;
53+
mp_obj_t item;
5454
while ((item = mp_iternext(iterable)) != MP_OBJ_NULL) {
55-
mp_obj_dict_store(dict, item->items[0], item->items[1]);
55+
mp_obj_t *sub_items;
56+
mp_obj_get_array_fixed_n(item, 2, &sub_items);
57+
mp_obj_dict_store(dict, sub_items[0], sub_items[1]);
5658
}
5759
return dict;
5860
}

tests/basics/dict-from-iter.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,13 @@
22
d = dict([("foo", "foo2"), ("bar", "baz")])
33
print(sorted(d.keys()))
44
print(sorted(d.values()))
5+
6+
try:
7+
dict(((1,),))
8+
except ValueError:
9+
print("ValueError")
10+
11+
try:
12+
dict(((1, 2, 3),))
13+
except ValueError:
14+
print("ValueError")

0 commit comments

Comments
 (0)