neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 6061169183c02e6e6cabae09a56dd68989afe257
parent 53fd3657ccf50046f095e90f44ef4c34e2e2f6d5
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Tue, 16 Dec 2025 08:13:18 +0800

vim-patch:9.1.1983: Vim9: class_name definition can be improved

Problem:  Vim9: class_name definition can be improved
Solution: Use string_T to store class_name, avoid using STRLEN() calls,
          simplify code, remove unused definition of struct
          oc_newmember_S (John Marriott)

Use struct string_T to store the field class_name in struct class_T,
which means we can just use the .length field in struct string_T
instead of measuring it.

In addition:
1. In eval.c use string_T to store class_name and s in function
   class_tv2string().
2. In vim9type.c change some calls from ga_concat() to ga_concat_len()
   where the length is known.
3. In vim9class.c remove unused struct definition oc_newmember_S.
   Change some calls from ga_concat() to ga_concat_len() where the
   length is known.
4. In scriptfile.c use string_T to store type_name, class_name and
   es_name in function estack_sfile().
5. In function estack_sfile() simplify construction of the grow array ga
   and change some calls from ga_concat() to ga_concat_len() when the
   length is known.

closes: vim/vim#18925

https://github.com/vim/vim/commit/2019321e0be320183afa47b7ea979dc4fc3984a0

Co-authored-by: John Marriott <basilisk@internode.on.net>

Diffstat:
Msrc/nvim/runtime.c | 25++++++++++++++-----------
1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/src/nvim/runtime.c b/src/nvim/runtime.c @@ -195,38 +195,41 @@ char *estack_sfile(estack_arg_T which) for (int idx = 0; idx < exestack.ga_len; idx++) { entry = ((estack_T *)exestack.ga_data) + idx; if (entry->es_name != NULL) { - char *type_name = ""; + String type_name = STATIC_CSTR_AS_STRING(""); + String es_name = cstr_as_string(entry->es_name); if (entry->es_type != last_type) { switch (entry->es_type) { case ETYPE_SCRIPT: - type_name = "script "; break; + type_name = STATIC_CSTR_AS_STRING("script "); break; case ETYPE_UFUNC: - type_name = "function "; break; + type_name = STATIC_CSTR_AS_STRING("function "); break; default: - type_name = ""; break; + break; } last_type = entry->es_type; } linenr_T lnum = idx == exestack.ga_len - 1 ? which == ESTACK_STACK ? SOURCING_LNUM : 0 : entry->es_lnum; - size_t len = strlen(entry->es_name) + strlen(type_name) + 26; + + size_t len = es_name.size + type_name.size + 26; ga_grow(&ga, (int)len); - ga_concat(&ga, type_name); - ga_concat(&ga, entry->es_name); + ga_concat_len(&ga, type_name.data, type_name.size); + ga_concat_len(&ga, es_name.data, es_name.size); // For the bottom entry of <sfile>: do not add the line number, it is used in // <slnum>. Also leave it out when the number is not set. if (lnum != 0) { - ga.ga_len += vim_snprintf((char *)ga.ga_data + ga.ga_len, 23, - "[%" PRIdLINENR "]", lnum); + ga.ga_len += (int)vim_snprintf_safelen((char *)ga.ga_data + ga.ga_len, + len - (size_t)ga.ga_len, + "[%" PRIdLINENR "]", lnum); } if (idx != exestack.ga_len - 1) { - ga_concat(&ga, ".."); + ga_concat_len(&ga, S_LEN("..")); } } } - ga_append(&ga, '\0'); + ga_append(&ga, NUL); return (char *)ga.ga_data; }