@@ -1365,6 +1365,32 @@ STATIC mp_obj_t str_rpartition(mp_obj_t self_in, mp_obj_t arg) {
13651365 return str_partitioner (self_in , arg , -1 );
13661366}
13671367
1368+ enum { CASE_UPPER , CASE_LOWER };
1369+
1370+ // Supposedly not too critical operations, so optimize for code size
1371+ STATIC mp_obj_t str_caseconv (int op , mp_obj_t self_in ) {
1372+ GET_STR_DATA_LEN (self_in , self_data , self_len );
1373+ byte * data ;
1374+ mp_obj_t s = mp_obj_str_builder_start (mp_obj_get_type (self_in ), self_len , & data );
1375+ for (int i = 0 ; i < self_len ; i ++ ) {
1376+ if (op == CASE_UPPER ) {
1377+ * data ++ = unichar_toupper (* self_data ++ );
1378+ } else {
1379+ * data ++ = unichar_tolower (* self_data ++ );
1380+ }
1381+ }
1382+ * data = 0 ;
1383+ return mp_obj_str_builder_end (s );
1384+ }
1385+
1386+ STATIC mp_obj_t str_lower (mp_obj_t self_in ) {
1387+ return str_caseconv (CASE_LOWER , self_in );
1388+ }
1389+
1390+ STATIC mp_obj_t str_upper (mp_obj_t self_in ) {
1391+ return str_caseconv (CASE_UPPER , self_in );
1392+ }
1393+
13681394#if MICROPY_CPYTHON_COMPAT
13691395// These methods are superfluous in the presense of str() and bytes()
13701396// constructors.
@@ -1428,6 +1454,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_replace_obj, 3, 4, str_replace);
14281454STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (str_count_obj , 2 , 4 , str_count );
14291455STATIC MP_DEFINE_CONST_FUN_OBJ_2 (str_partition_obj , str_partition );
14301456STATIC MP_DEFINE_CONST_FUN_OBJ_2 (str_rpartition_obj , str_rpartition );
1457+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (str_lower_obj , str_lower );
1458+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (str_upper_obj , str_upper );
14311459
14321460STATIC const mp_map_elem_t str_locals_dict_table [] = {
14331461#if MICROPY_CPYTHON_COMPAT
@@ -1449,6 +1477,8 @@ STATIC const mp_map_elem_t str_locals_dict_table[] = {
14491477 { MP_OBJ_NEW_QSTR (MP_QSTR_count ), (mp_obj_t )& str_count_obj },
14501478 { MP_OBJ_NEW_QSTR (MP_QSTR_partition ), (mp_obj_t )& str_partition_obj },
14511479 { MP_OBJ_NEW_QSTR (MP_QSTR_rpartition ), (mp_obj_t )& str_rpartition_obj },
1480+ { MP_OBJ_NEW_QSTR (MP_QSTR_lower ), (mp_obj_t )& str_lower_obj },
1481+ { MP_OBJ_NEW_QSTR (MP_QSTR_upper ), (mp_obj_t )& str_upper_obj },
14521482};
14531483
14541484STATIC MP_DEFINE_CONST_DICT (str_locals_dict , str_locals_dict_table );
0 commit comments