Mercurial > vim
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 |