@@ -200,11 +200,10 @@ STATIC mp_obj_t bytes_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_k
200200
201201 if (MP_OBJ_IS_SMALL_INT (args [0 ])) {
202202 uint len = MP_OBJ_SMALL_INT_VALUE (args [0 ]);
203- byte * data ;
204-
205- mp_obj_t o = mp_obj_str_builder_start (& mp_type_bytes , len , & data );
206- memset (data , 0 , len );
207- return mp_obj_str_builder_end (o );
203+ vstr_t vstr ;
204+ vstr_init_len (& vstr , len );
205+ memset (vstr .buf , 0 , len );
206+ return mp_obj_new_str_from_vstr (& mp_type_bytes , & vstr );
208207 }
209208
210209 // check if argument has the buffer protocol
@@ -302,10 +301,10 @@ mp_obj_t mp_obj_str_binary_op(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
302301 return mp_const_empty_bytes ;
303302 }
304303 }
305- byte * data ;
306- mp_obj_t s = mp_obj_str_builder_start ( lhs_type , lhs_len * n , & data );
307- mp_seq_multiply (lhs_data , sizeof (* lhs_data ), lhs_len , n , data );
308- return mp_obj_str_builder_end ( s );
304+ vstr_t vstr ;
305+ vstr_init_len ( & vstr , lhs_len * n );
306+ mp_seq_multiply (lhs_data , sizeof (* lhs_data ), lhs_len , n , vstr . buf );
307+ return mp_obj_new_str_from_vstr ( lhs_type , & vstr );
309308 }
310309
311310 // From now on all operations allow:
@@ -344,12 +343,11 @@ mp_obj_t mp_obj_str_binary_op(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
344343 switch (op ) {
345344 case MP_BINARY_OP_ADD :
346345 case MP_BINARY_OP_INPLACE_ADD : {
347- mp_uint_t alloc_len = lhs_len + rhs_len ;
348- byte * data ;
349- mp_obj_t s = mp_obj_str_builder_start (lhs_type , alloc_len , & data );
350- memcpy (data , lhs_data , lhs_len );
351- memcpy (data + lhs_len , rhs_data , rhs_len );
352- return mp_obj_str_builder_end (s );
346+ vstr_t vstr ;
347+ vstr_init_len (& vstr , lhs_len + rhs_len );
348+ memcpy (vstr .buf , lhs_data , lhs_len );
349+ memcpy (vstr .buf + lhs_len , rhs_data , rhs_len );
350+ return mp_obj_new_str_from_vstr (lhs_type , & vstr );
353351 }
354352
355353 case MP_BINARY_OP_IN :
@@ -441,8 +439,9 @@ STATIC mp_obj_t str_join(mp_obj_t self_in, mp_obj_t arg) {
441439 }
442440
443441 // make joined string
444- byte * data ;
445- mp_obj_t joined_str = mp_obj_str_builder_start (self_type , required_len , & data );
442+ vstr_t vstr ;
443+ vstr_init_len (& vstr , required_len );
444+ byte * data = (byte * )vstr .buf ;
446445 for (mp_uint_t i = 0 ; i < seq_len ; i ++ ) {
447446 if (i > 0 ) {
448447 memcpy (data , sep_str , sep_len );
@@ -454,7 +453,7 @@ STATIC mp_obj_t str_join(mp_obj_t self_in, mp_obj_t arg) {
454453 }
455454
456455 // return joined string
457- return mp_obj_str_builder_end ( joined_str );
456+ return mp_obj_new_str_from_vstr ( self_type , & vstr );
458457}
459458
460459#define is_ws (c ) ((c) == ' ' || (c) == '\t')
@@ -1485,7 +1484,7 @@ STATIC mp_obj_t str_replace(mp_uint_t n_args, const mp_obj_t *args) {
14851484
14861485 // data for the replaced string
14871486 byte * data = NULL ;
1488- mp_obj_t replaced_str = MP_OBJ_NULL ;
1487+ vstr_t vstr ;
14891488
14901489 // do 2 passes over the string:
14911490 // first pass computes the required length of the replaced string
@@ -1537,7 +1536,8 @@ STATIC mp_obj_t str_replace(mp_uint_t n_args, const mp_obj_t *args) {
15371536 return args [0 ];
15381537 } else {
15391538 // substr found, allocate new string
1540- replaced_str = mp_obj_str_builder_start (self_type , replaced_str_index , & data );
1539+ vstr_init_len (& vstr , replaced_str_index );
1540+ data = (byte * )vstr .buf ;
15411541 assert (data != NULL );
15421542 }
15431543 } else {
@@ -1546,7 +1546,7 @@ STATIC mp_obj_t str_replace(mp_uint_t n_args, const mp_obj_t *args) {
15461546 }
15471547 }
15481548
1549- return mp_obj_str_builder_end ( replaced_str );
1549+ return mp_obj_new_str_from_vstr ( self_type , & vstr );
15501550}
15511551
15521552STATIC mp_obj_t str_count (mp_uint_t n_args , const mp_obj_t * args ) {
@@ -1643,13 +1643,13 @@ STATIC mp_obj_t str_rpartition(mp_obj_t self_in, mp_obj_t arg) {
16431643// Supposedly not too critical operations, so optimize for code size
16441644STATIC mp_obj_t str_caseconv (unichar (* op )(unichar ), mp_obj_t self_in ) {
16451645 GET_STR_DATA_LEN (self_in , self_data , self_len );
1646- byte * data ;
1647- mp_obj_t s = mp_obj_str_builder_start (mp_obj_get_type (self_in ), self_len , & data );
1646+ vstr_t vstr ;
1647+ vstr_init_len (& vstr , self_len );
1648+ byte * data = (byte * )vstr .buf ;
16481649 for (mp_uint_t i = 0 ; i < self_len ; i ++ ) {
16491650 * data ++ = op (* self_data ++ );
16501651 }
1651- * data = 0 ;
1652- return mp_obj_str_builder_end (s );
1652+ return mp_obj_new_str_from_vstr (mp_obj_get_type (self_in ), & vstr );
16531653}
16541654
16551655STATIC mp_obj_t str_lower (mp_obj_t self_in ) {
@@ -1856,35 +1856,6 @@ const mp_obj_type_t mp_type_bytes = {
18561856// the zero-length bytes
18571857const mp_obj_str_t mp_const_empty_bytes_obj = {{& mp_type_bytes }, 0 , 0 , NULL };
18581858
1859- mp_obj_t mp_obj_str_builder_start (const mp_obj_type_t * type , mp_uint_t len , byte * * data ) {
1860- mp_obj_str_t * o = m_new_obj (mp_obj_str_t );
1861- o -> base .type = type ;
1862- o -> len = len ;
1863- o -> hash = 0 ;
1864- byte * p = m_new (byte , len + 1 );
1865- o -> data = p ;
1866- * data = p ;
1867- return o ;
1868- }
1869-
1870- mp_obj_t mp_obj_str_builder_end (mp_obj_t o_in ) {
1871- mp_obj_str_t * o = o_in ;
1872- o -> hash = qstr_compute_hash (o -> data , o -> len );
1873- byte * p = (byte * )o -> data ;
1874- p [o -> len ] = '\0' ; // for now we add null for compatibility with C ASCIIZ strings
1875- return o ;
1876- }
1877-
1878- mp_obj_t mp_obj_str_builder_end_with_len (mp_obj_t o_in , mp_uint_t len ) {
1879- mp_obj_str_t * o = o_in ;
1880- o -> data = m_renew (byte , (byte * )o -> data , o -> len + 1 , len + 1 );
1881- o -> len = len ;
1882- o -> hash = qstr_compute_hash (o -> data , o -> len );
1883- byte * p = (byte * )o -> data ;
1884- p [o -> len ] = '\0' ; // for now we add null for compatibility with C ASCIIZ strings
1885- return o ;
1886- }
1887-
18881859mp_obj_t mp_obj_new_str_of_type (const mp_obj_type_t * type , const byte * data , mp_uint_t len ) {
18891860 mp_obj_str_t * o = m_new_obj (mp_obj_str_t );
18901861 o -> base .type = type ;
0 commit comments