@@ -65,6 +65,12 @@ void proxy_c_init(void) {
65
65
66
66
MP_REGISTER_ROOT_POINTER (mp_obj_t proxy_c_ref );
67
67
68
+ static inline size_t proxy_c_add_obj (mp_obj_t obj ) {
69
+ size_t id = ((mp_obj_list_t * )MP_OBJ_TO_PTR (MP_STATE_PORT (proxy_c_ref )))-> len ;
70
+ mp_obj_list_append (MP_STATE_PORT (proxy_c_ref ), obj );
71
+ return id ;
72
+ }
73
+
68
74
static inline mp_obj_t proxy_c_get_obj (uint32_t c_ref ) {
69
75
return ((mp_obj_list_t * )MP_OBJ_TO_PTR (MP_STATE_PORT (proxy_c_ref )))-> items [c_ref ];
70
76
}
@@ -122,9 +128,7 @@ void proxy_convert_mp_to_js_obj_cside(mp_obj_t obj, uint32_t *out) {
122
128
} else {
123
129
kind = PROXY_KIND_MP_OBJECT ;
124
130
}
125
- size_t id = ((mp_obj_list_t * )MP_OBJ_TO_PTR (MP_STATE_PORT (proxy_c_ref )))-> len ;
126
- mp_obj_list_append (MP_STATE_PORT (proxy_c_ref ), obj );
127
- out [1 ] = id ;
131
+ out [1 ] = proxy_c_add_obj (obj );
128
132
}
129
133
out [0 ] = kind ;
130
134
}
@@ -284,6 +288,38 @@ void proxy_c_to_js_get_dict(uint32_t c_ref, uint32_t *out) {
284
288
out [1 ] = (uintptr_t )map -> table ;
285
289
}
286
290
291
+ /******************************************************************************/
292
+ // Bridge Python iterator to JavaScript iterator protocol.
293
+
294
+ uint32_t proxy_c_to_js_get_iter (uint32_t c_ref ) {
295
+ mp_obj_t obj = proxy_c_get_obj (c_ref );
296
+ mp_obj_t iter = mp_getiter (obj , NULL );
297
+ return proxy_c_add_obj (iter );
298
+ }
299
+
300
+ bool proxy_c_to_js_iternext (uint32_t c_ref , uint32_t * out ) {
301
+ mp_obj_t obj = proxy_c_get_obj (c_ref );
302
+ nlr_buf_t nlr ;
303
+ if (nlr_push (& nlr ) == 0 ) {
304
+ mp_obj_t iter = mp_iternext_allow_raise (obj );
305
+ if (iter == MP_OBJ_STOP_ITERATION ) {
306
+ nlr_pop ();
307
+ return false;
308
+ }
309
+ nlr_pop ();
310
+ proxy_convert_mp_to_js_obj_cside (iter , out );
311
+ return true;
312
+ } else {
313
+ if (mp_obj_is_subclass_fast (MP_OBJ_FROM_PTR (((mp_obj_base_t * )nlr .ret_val )-> type ), MP_OBJ_FROM_PTR (& mp_type_StopIteration ))) {
314
+ return false;
315
+ } else {
316
+ // uncaught exception
317
+ proxy_convert_mp_to_js_exc_cside (nlr .ret_val , out );
318
+ return true;
319
+ }
320
+ }
321
+ }
322
+
287
323
/******************************************************************************/
288
324
// Bridge Python generator to JavaScript thenable.
289
325
0 commit comments