@@ -215,6 +215,27 @@ STATIC mp_obj_t stream_write_method(mp_obj_t self_in, mp_obj_t arg) {
215215 return mp_stream_write (self_in , bufinfo .buf , bufinfo .len );
216216}
217217
218+ STATIC mp_obj_t stream_readinto (mp_obj_t self_in , mp_obj_t arg ) {
219+ struct _mp_obj_base_t * o = (struct _mp_obj_base_t * )self_in ;
220+ if (o -> type -> stream_p == NULL || o -> type -> stream_p -> read == NULL ) {
221+ // CPython: io.UnsupportedOperation, OSError subclass
222+ nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , "Operation not supported" ));
223+ }
224+ mp_buffer_info_t bufinfo ;
225+ mp_get_buffer_raise (arg , & bufinfo , MP_BUFFER_WRITE );
226+
227+ int error ;
228+ mp_uint_t out_sz = o -> type -> stream_p -> read (o , bufinfo .buf , bufinfo .len , & error );
229+ if (out_sz == MP_STREAM_ERROR ) {
230+ if (is_nonblocking_error (error )) {
231+ return mp_const_none ;
232+ }
233+ nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (error )));
234+ } else {
235+ return MP_OBJ_NEW_SMALL_INT (out_sz );
236+ }
237+ }
238+
218239STATIC mp_obj_t stream_readall (mp_obj_t self_in ) {
219240 struct _mp_obj_base_t * o = (struct _mp_obj_base_t * )self_in ;
220241 if (o -> type -> stream_p == NULL || o -> type -> stream_p -> read == NULL ) {
@@ -349,6 +370,7 @@ mp_obj_t mp_stream_unbuffered_iter(mp_obj_t self) {
349370}
350371
351372MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (mp_stream_read_obj , 1 , 2 , stream_read );
373+ MP_DEFINE_CONST_FUN_OBJ_2 (mp_stream_readinto_obj , stream_readinto );
352374MP_DEFINE_CONST_FUN_OBJ_1 (mp_stream_readall_obj , stream_readall );
353375MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (mp_stream_unbuffered_readline_obj , 1 , 2 , stream_unbuffered_readline );
354376MP_DEFINE_CONST_FUN_OBJ_2 (mp_stream_write_obj , stream_write_method );
0 commit comments