comparison src/vim9execute.c @ 24226:f49f80a0905d v8.2.2654

patch 8.2.2654: Vim9: getting a character from a string can be slow Commit: https://github.com/vim/vim/commit/ff871400461183010d3ab98f3f326e4bb75e221b Author: Bram Moolenaar <Bram@vim.org> Date: Fri Mar 26 13:34:05 2021 +0100 patch 8.2.2654: Vim9: getting a character from a string can be slow Problem: Vim9: getting a character from a string can be slow. Solution: Avoid a function call to get the character byte size. (https://github.com/vim/vim/issues/8000)
author Bram Moolenaar <Bram@vim.org>
date Fri, 26 Mar 2021 13:45:02 +0100
parents a7a9176bb542
children 7ffc795288dd
comparison
equal deleted inserted replaced
24225:b19ab4d458ab 24226:f49f80a0905d
1065 1065
1066 if (str == NULL) 1066 if (str == NULL)
1067 return NULL; 1067 return NULL;
1068 slen = STRLEN(str); 1068 slen = STRLEN(str);
1069 1069
1070 // do the same as for a list: a negative index counts from the end 1070 // Do the same as for a list: a negative index counts from the end.
1071 // Optimization to check the first byte to be below 0x80 (and no composing
1072 // character follows) makes this a lot faster.
1071 if (index < 0) 1073 if (index < 0)
1072 { 1074 {
1073 int clen = 0; 1075 int clen = 0;
1074 1076
1075 for (nbyte = 0; nbyte < slen; ++clen) 1077 for (nbyte = 0; nbyte < slen; ++clen)
1076 nbyte += mb_ptr2len(str + nbyte); 1078 {
1079 if (str[nbyte] < 0x80 && str[nbyte + 1] < 0x80)
1080 ++nbyte;
1081 else if (enc_utf8)
1082 nbyte += utfc_ptr2len(str + nbyte);
1083 else
1084 nbyte += mb_ptr2len(str + nbyte);
1085 }
1077 nchar = clen + index; 1086 nchar = clen + index;
1078 if (nchar < 0) 1087 if (nchar < 0)
1079 // unlike list: index out of range results in empty string 1088 // unlike list: index out of range results in empty string
1080 return NULL; 1089 return NULL;
1081 } 1090 }
1082 1091
1083 for (nbyte = 0; nchar > 0 && nbyte < slen; --nchar) 1092 for (nbyte = 0; nchar > 0 && nbyte < slen; --nchar)
1084 nbyte += mb_ptr2len(str + nbyte); 1093 {
1094 if (str[nbyte] < 0x80 && str[nbyte + 1] < 0x80)
1095 ++nbyte;
1096 else if (enc_utf8)
1097 nbyte += utfc_ptr2len(str + nbyte);
1098 else
1099 nbyte += mb_ptr2len(str + nbyte);
1100 }
1085 if (nbyte >= slen) 1101 if (nbyte >= slen)
1086 return NULL; 1102 return NULL;
1087 return vim_strnsave(str + nbyte, mb_ptr2len(str + nbyte)); 1103 return vim_strnsave(str + nbyte, mb_ptr2len(str + nbyte));
1088 } 1104 }
1089 1105