@@ -123,8 +123,7 @@ STATIC mp_obj_t stream_unbuffered_readline(uint n_args, const mp_obj_t *args) {
123123 while (max_size == -1 || max_size -- != 0 ) {
124124 char * p = vstr_add_len (vstr , 1 );
125125 if (p == NULL ) {
126- // TODO
127- nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_OSError /*&mp_type_RuntimeError*/ , "Out of memory" ));
126+ nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_MemoryError , "out of memory" ));
128127 }
129128
130129 machine_int_t out_sz = o -> type -> stream_p -> read (o , p , 1 , & error );
@@ -143,16 +142,29 @@ STATIC mp_obj_t stream_unbuffered_readline(uint n_args, const mp_obj_t *args) {
143142 break ;
144143 }
145144 }
146- // TODO don't intern this string
147- vstr_shrink (vstr );
148- return MP_OBJ_NEW_QSTR (qstr_from_strn_take (vstr_str (vstr ), vstr -> alloc , vstr_len (vstr )));
145+ // TODO need a string creation API that doesn't copy the given data
146+ mp_obj_t ret = mp_obj_new_str ((byte * )vstr -> buf , vstr -> len , false);
147+ vstr_free (vstr );
148+ return ret ;
149+ }
150+
151+ // TODO take an optional extra argument (what does it do exactly?)
152+ STATIC mp_obj_t stream_unbuffered_readlines (mp_obj_t self ) {
153+ mp_obj_t lines = mp_obj_new_list (0 , NULL );
154+ for (;;) {
155+ mp_obj_t line = stream_unbuffered_readline (1 , & self );
156+ if (mp_obj_str_get_len (line ) == 0 ) {
157+ break ;
158+ }
159+ mp_obj_list_append (lines , line );
160+ }
161+ return lines ;
149162}
163+ MP_DEFINE_CONST_FUN_OBJ_1 (mp_stream_unbuffered_readlines_obj , stream_unbuffered_readlines );
150164
151165mp_obj_t mp_stream_unbuffered_iter (mp_obj_t self ) {
152166 mp_obj_t l_in = stream_unbuffered_readline (1 , & self );
153- uint sz ;
154- mp_obj_str_get_data (l_in , & sz );
155- if (sz != 0 ) {
167+ if (mp_obj_str_get_len (l_in ) != 0 ) {
156168 return l_in ;
157169 }
158170 return MP_OBJ_STOP_ITERATION ;
0 commit comments