@@ -36,9 +36,13 @@ mp_obj_t str_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
3636 if (MP_OBJ_IS_TYPE (rhs_in , & str_type )) {
3737 // add 2 strings
3838 const char * rhs_str = qstr_str (((mp_obj_str_t * )rhs_in )-> qstr );
39- int alloc_len = strlen (lhs_str ) + strlen (rhs_str ) + 1 ;
39+ size_t lhs_len = strlen (lhs_str );
40+ size_t rhs_len = strlen (rhs_str );
41+ int alloc_len = lhs_len + rhs_len + 1 ;
4042 char * val = m_new (char , alloc_len );
41- stpcpy (stpcpy (val , lhs_str ), rhs_str );
43+ memcpy (val , lhs_str , lhs_len );
44+ memcpy (val + lhs_len , rhs_str , rhs_len );
45+ val [lhs_len + rhs_len ] = '\0' ;
4246 return mp_obj_new_str (qstr_from_str_take (val , alloc_len ));
4347 }
4448 break ;
@@ -50,9 +54,12 @@ mp_obj_t str_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
5054mp_obj_t str_join (mp_obj_t self_in , mp_obj_t arg ) {
5155 assert (MP_OBJ_IS_TYPE (self_in , & str_type ));
5256 mp_obj_str_t * self = self_in ;
53- int required_len = strlen (qstr_str (self -> qstr ));
5457
55- // process arg, count required chars
58+ // get separation string
59+ const char * sep_str = qstr_str (self -> qstr );
60+ size_t sep_len = strlen (sep_str );
61+
62+ // process args
5663 uint seq_len ;
5764 mp_obj_t * seq_items ;
5865 if (MP_OBJ_IS_TYPE (arg , & tuple_type )) {
@@ -62,23 +69,35 @@ mp_obj_t str_join(mp_obj_t self_in, mp_obj_t arg) {
6269 } else {
6370 goto bad_arg ;
6471 }
72+
73+ // count required length
74+ int required_len = 0 ;
6575 for (int i = 0 ; i < seq_len ; i ++ ) {
6676 if (!MP_OBJ_IS_TYPE (seq_items [i ], & str_type )) {
6777 goto bad_arg ;
6878 }
79+ if (i > 0 ) {
80+ required_len += sep_len ;
81+ }
6982 required_len += strlen (qstr_str (mp_obj_str_get (seq_items [i ])));
7083 }
7184
7285 // make joined string
7386 char * joined_str = m_new (char , required_len + 1 );
74- joined_str [ 0 ] = 0 ;
87+ char * s_dest = joined_str ;
7588 for (int i = 0 ; i < seq_len ; i ++ ) {
76- const char * s2 = qstr_str (mp_obj_str_get (seq_items [i ]));
7789 if (i > 0 ) {
78- strcat (joined_str , qstr_str (self -> qstr ));
90+ memcpy (s_dest , sep_str , sep_len );
91+ s_dest += sep_len ;
7992 }
80- strcat (joined_str , s2 );
93+ const char * s2 = qstr_str (mp_obj_str_get (seq_items [i ]));
94+ size_t s2_len = strlen (s2 );
95+ memcpy (s_dest , s2 , s2_len );
96+ s_dest += s2_len ;
8197 }
98+ * s_dest = '\0' ;
99+
100+ // return joined string
82101 return mp_obj_new_str (qstr_from_str_take (joined_str , required_len + 1 ));
83102
84103bad_arg :
0 commit comments