Add mp_type_native_coro_wrap
This commit is contained in:
parent
562520e158
commit
7e38b79e21
@ -188,10 +188,11 @@ mp_obj_t mp_make_function_from_raw_code(const mp_raw_code_t *rc, const mp_module
|
||||
case MP_CODE_NATIVE_VIPER:
|
||||
fun = mp_obj_new_fun_native(def_args, rc->fun_data, context, rc->children);
|
||||
// Check for a generator function, and if so change the type of the object
|
||||
if ((rc->scope_flags & MP_SCOPE_FLAG_GENERATOR) != 0) {
|
||||
if ((rc->scope_flags & MP_SCOPE_FLAG_ASYNC) != 0) {
|
||||
((mp_obj_base_t *)MP_OBJ_TO_PTR(fun))->type = &mp_type_native_coro_wrap;
|
||||
} else if ((rc->scope_flags & MP_SCOPE_FLAG_GENERATOR) != 0) {
|
||||
((mp_obj_base_t *)MP_OBJ_TO_PTR(fun))->type = &mp_type_native_gen_wrap;
|
||||
}
|
||||
// CIRCUITPY: no support for mp_type_native_coro_wrap, native coroutine objects (yet).
|
||||
break;
|
||||
#endif
|
||||
#if MICROPY_EMIT_INLINE_ASM
|
||||
@ -206,9 +207,12 @@ mp_obj_t mp_make_function_from_raw_code(const mp_raw_code_t *rc, const mp_module
|
||||
// check for generator functions and if so change the type of the object
|
||||
// A generator is MP_SCOPE_FLAG_ASYNC | MP_SCOPE_FLAG_GENERATOR,
|
||||
// so check for ASYNC first.
|
||||
#if MICROPY_PY_ASYNC_AWAIT
|
||||
if ((rc->scope_flags & MP_SCOPE_FLAG_ASYNC) != 0) {
|
||||
((mp_obj_base_t *)MP_OBJ_TO_PTR(fun))->type = &mp_type_coro_wrap;
|
||||
} else if ((rc->scope_flags & MP_SCOPE_FLAG_GENERATOR) != 0) {
|
||||
} else
|
||||
#endif
|
||||
if ((rc->scope_flags & MP_SCOPE_FLAG_GENERATOR) != 0) {
|
||||
((mp_obj_base_t *)MP_OBJ_TO_PTR(fun))->type = &mp_type_gen_wrap;
|
||||
}
|
||||
|
||||
|
6
py/obj.h
6
py/obj.h
@ -739,9 +739,11 @@ extern const mp_obj_type_t mp_type_gen_wrap;
|
||||
extern const mp_obj_type_t mp_type_native_gen_wrap;
|
||||
extern const mp_obj_type_t mp_type_gen_instance;
|
||||
// CIRCUITPY
|
||||
extern const mp_obj_type_t mp_type_coro_wrap;
|
||||
// CIRCUITPY
|
||||
#if MICROPY_PY_ASYNC_AWAIT
|
||||
extern const mp_obj_type_t mp_type_coro_wrap;
|
||||
#if MICROPY_EMIT_NATIVE
|
||||
extern const mp_obj_type_t mp_type_native_coro_wrap;
|
||||
#endif
|
||||
extern const mp_obj_type_t mp_type_coro_instance;
|
||||
#endif
|
||||
extern const mp_obj_type_t mp_type_fun_builtin_0;
|
||||
|
@ -98,6 +98,7 @@ const mp_obj_type_t mp_type_gen_wrap = {
|
||||
),
|
||||
};
|
||||
|
||||
#if MICROPY_PY_ASYNC_AWAIT
|
||||
const mp_obj_type_t mp_type_coro_wrap = {
|
||||
{ &mp_type_type },
|
||||
.flags = MP_TYPE_FLAG_BINDS_SELF | MP_TYPE_FLAG_EXTENDED,
|
||||
@ -110,6 +111,7 @@ const mp_obj_type_t mp_type_coro_wrap = {
|
||||
.unary_op = mp_generic_unary_op,
|
||||
),
|
||||
};
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
// native generator wrapper
|
||||
@ -141,7 +143,13 @@ STATIC mp_obj_t native_gen_wrap_call(mp_obj_t self_in, size_t n_args, size_t n_k
|
||||
MP_BC_PRELUDE_SIG_DECODE(ip);
|
||||
|
||||
// Allocate the generator object, with room for local stack (exception stack not needed).
|
||||
mp_obj_gen_instance_native_t *o = mp_obj_malloc_var(mp_obj_gen_instance_native_t, byte, n_state * sizeof(mp_obj_t), &mp_type_gen_instance);
|
||||
mp_obj_gen_instance_native_t *o = mp_obj_malloc_var(mp_obj_gen_instance_native_t, byte, n_state * sizeof(mp_obj_t),
|
||||
#if MICROPY_PY_ASYNC_AWAIT
|
||||
(self_fun->base.type == &mp_type_native_gen_wrap) ? &mp_type_gen_instance : &mp_type_coro_instance
|
||||
#else
|
||||
&mp_type_gen_instance
|
||||
#endif
|
||||
);
|
||||
|
||||
// Parse the input arguments and set up the code state
|
||||
o->pend_exc = mp_const_none;
|
||||
@ -177,6 +185,21 @@ const mp_obj_type_t mp_type_native_gen_wrap = {
|
||||
),
|
||||
};
|
||||
|
||||
#if MICROPY_PY_ASYNC_AWAIT
|
||||
const mp_obj_type_t mp_type_native_coro_wrap = {
|
||||
{ &mp_type_type },
|
||||
.flags = MP_TYPE_FLAG_BINDS_SELF | MP_TYPE_FLAG_EXTENDED,
|
||||
.name = MP_QSTR_coroutine,
|
||||
#if MICROPY_PY_FUNCTION_ATTRS
|
||||
.attr = mp_obj_fun_bc_attr,
|
||||
#endif
|
||||
MP_TYPE_EXTENDED_FIELDS(
|
||||
.call = native_gen_wrap_call,
|
||||
.unary_op = mp_generic_unary_op,
|
||||
),
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif // MICROPY_EMIT_NATIVE
|
||||
|
||||
/******************************************************************************/
|
||||
|
Loading…
Reference in New Issue
Block a user