py: Support single argument to optimised MP_OBJ_STOP_ITERATION.
The MP_OBJ_STOP_ITERATION optimisation is a shortcut for creating a StopIteration() exception object, and means that heap memory does not need to be allocated for the exception (in cases where it can be used). This commit allows this optimised object to take an optional argument (before, it could only have no argument). The commit also adds some new tests to cover corner cases with StopIteration and generators that previously did not work. Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
@@ -322,7 +322,7 @@ STATIC mp_obj_t mp_builtin_next(size_t n_args, const mp_obj_t *args) {
|
||||
if (n_args == 1) {
|
||||
mp_obj_t ret = mp_iternext_allow_raise(args[0]);
|
||||
if (ret == MP_OBJ_STOP_ITERATION) {
|
||||
mp_raise_type(&mp_type_StopIteration);
|
||||
mp_raise_StopIteration(MP_STATE_THREAD(stop_iteration_arg));
|
||||
} else {
|
||||
return ret;
|
||||
}
|
||||
@@ -336,7 +336,7 @@ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_builtin_next_obj, 1, 2, mp_builtin_next);
|
||||
STATIC mp_obj_t mp_builtin_next(mp_obj_t o) {
|
||||
mp_obj_t ret = mp_iternext_allow_raise(o);
|
||||
if (ret == MP_OBJ_STOP_ITERATION) {
|
||||
mp_raise_type(&mp_type_StopIteration);
|
||||
mp_raise_StopIteration(MP_STATE_THREAD(stop_iteration_arg));
|
||||
} else {
|
||||
return ret;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user