@@ -123,8 +123,7 @@ STATIC mp_obj_t stream_unbuffered_readline(uint n_args, const mp_obj_t *args) {
123
123
while (max_size == -1 || max_size -- != 0 ) {
124
124
char * p = vstr_add_len (vstr , 1 );
125
125
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" ));
128
127
}
129
128
130
129
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) {
143
142
break ;
144
143
}
145
144
}
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 ;
149
162
}
163
+ MP_DEFINE_CONST_FUN_OBJ_1 (mp_stream_unbuffered_readlines_obj , stream_unbuffered_readlines );
150
164
151
165
mp_obj_t mp_stream_unbuffered_iter (mp_obj_t self ) {
152
166
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 ) {
156
168
return l_in ;
157
169
}
158
170
return MP_OBJ_STOP_ITERATION ;
0 commit comments