Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
uPython-mirror
Commits
edbdf71f
Commit
edbdf71f
authored
Feb 02, 2014
by
Paul Sokolovsky
Browse files
rt_unpack_sequence(): Support generic iterables.
parent
48697f1d
Changes
1
Hide whitespace changes
Inline
Side-by-side
py/runtime.c
View file @
edbdf71f
...
...
@@ -769,8 +769,8 @@ mp_obj_t rt_store_set(mp_obj_t set, mp_obj_t item) {
// unpacked items are stored in reverse order into the array pointed to by items
void
rt_unpack_sequence
(
mp_obj_t
seq_in
,
uint
num
,
mp_obj_t
*
items
)
{
uint
seq_len
;
if
(
MP_OBJ_IS_TYPE
(
seq_in
,
&
tuple_type
)
||
MP_OBJ_IS_TYPE
(
seq_in
,
&
list_type
))
{
uint
seq_len
;
mp_obj_t
*
seq_items
;
if
(
MP_OBJ_IS_TYPE
(
seq_in
,
&
tuple_type
))
{
mp_obj_tuple_get
(
seq_in
,
&
seq_len
,
&
seq_items
);
...
...
@@ -778,17 +778,33 @@ void rt_unpack_sequence(mp_obj_t seq_in, uint num, mp_obj_t *items) {
mp_obj_list_get
(
seq_in
,
&
seq_len
,
&
seq_items
);
}
if
(
seq_len
<
num
)
{
nlr_jump
(
mp_obj_new_exception_msg_varg
(
MP_QSTR_ValueError
,
"need more than %d values to unpack"
,
(
void
*
)(
machine_uint_t
)
seq_len
))
;
goto
too_short
;
}
else
if
(
seq_len
>
num
)
{
nlr_jump
(
mp_obj_new_exception_msg_varg
(
MP_QSTR_ValueError
,
"too many values to unpack (expected %d)"
,
(
void
*
)(
machine_uint_t
)
num
))
;
goto
too_long
;
}
for
(
uint
i
=
0
;
i
<
num
;
i
++
)
{
items
[
i
]
=
seq_items
[
num
-
1
-
i
];
}
}
else
{
// TODO call rt_getiter and extract via rt_iternext
nlr_jump
(
mp_obj_new_exception_msg_varg
(
MP_QSTR_TypeError
,
"'%s' object is not iterable"
,
mp_obj_get_type_str
(
seq_in
)));
mp_obj_t
iterable
=
rt_getiter
(
seq_in
);
for
(
seq_len
=
0
;
seq_len
<
num
;
seq_len
++
)
{
mp_obj_t
el
=
rt_iternext
(
iterable
);
if
(
el
==
mp_const_stop_iteration
)
{
goto
too_short
;
}
items
[
num
-
1
-
seq_len
]
=
el
;
}
if
(
rt_iternext
(
iterable
)
!=
mp_const_stop_iteration
)
{
goto
too_long
;
}
}
return
;
too_short:
nlr_jump
(
mp_obj_new_exception_msg_varg
(
MP_QSTR_ValueError
,
"need more than %d values to unpack"
,
seq_len
));
too_long:
nlr_jump
(
mp_obj_new_exception_msg_varg
(
MP_QSTR_ValueError
,
"too many values to unpack (expected %d)"
,
num
));
}
mp_obj_t
rt_build_map
(
int
n_args
)
{
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment