patch 9.1.1169: using global variable for get_insert()/get_lambda_name()

Commit: 
https://github.com/vim/vim/commit/0b5fe420715786249cd121d845dbd6a81f962d1b
Author: Yee Cheng Chin <ychin....@gmail.com>
Date:   Mon Mar 3 20:12:05 2025 +0100

    patch 9.1.1169: using global variable for get_insert()/get_lambda_name()
    
    Problem:  using global variable for get_insert()/get_lambda_name()
              (after v9.1.1151)
    Solution: let the functions return a string_T object instead
              (Yee Cheng Chin)
    
    In #16720, `get_insert()` was modified to store a string length in a
    global variable to be queried immediately by another `get_insert_len()`
    function, which is somewhat fragile. Instead, just have the function
    itself return a `string_T` object instead. Also do the same for
    `get_lambda_name()` which has similar issues.
    
    closes: #16775
    
    Signed-off-by: Yee Cheng Chin <ychin....@gmail.com>
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/edit.c b/src/edit.c
index 808aae141..f15a19de2 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -415,14 +415,10 @@ edit(
      * Get the current length of the redo buffer, those characters have to be
      * skipped if we want to get to the inserted characters.
      */
-    ptr = get_inserted();
-    if (ptr == NULL)
-       new_insert_skip = 0;
-    else
-    {
-       new_insert_skip = (int)get_inserted_len();
-       vim_free(ptr);
-    }
+    string_T inserted = get_inserted();
+    new_insert_skip = (int)inserted.length;
+    if (inserted.string != NULL)
+       vim_free(inserted.string);
 
     old_indent = 0;
 
@@ -2445,7 +2441,7 @@ stop_insert(
     int                nomove)                 // <c-\><c-o>, don't move cursor
 {
     int                cc;
-    char_u     *ptr;
+    string_T   inserted;
 
     stop_redo_ins();
     replace_flush();           // abandon replace stack
@@ -2455,16 +2451,16 @@ stop_insert(
      * Don't do it when "restart_edit" was set and nothing was inserted,
      * otherwise CTRL-O w and then <Left> will clear "last_insert".
      */
-    ptr = get_inserted();
-    int added = ptr == NULL ? 0 : (int)get_inserted_len() - new_insert_skip;
+    inserted = get_inserted();
+    int added = inserted.string == NULL ? 0 : (int)inserted.length - 
new_insert_skip;
     if (did_restart_edit == 0 || added > 0)
     {
        vim_free(last_insert);
-       last_insert = ptr;
+       last_insert = inserted.string;
        last_insert_skip = added < 0 ? 0 : new_insert_skip;
     }
     else
-       vim_free(ptr);
+       vim_free(inserted.string);
 
     if (!arrow_used && end_insert_pos != NULL)
     {
diff --git a/src/getchar.c b/src/getchar.c
index 014e5759f..05ae37393 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -88,9 +88,6 @@ static char_u noremapbuf_init[TYPELEN_INIT];  // initial 
typebuf.tb_noremap
 
 static size_t  last_recorded_len = 0;  // number of last recorded chars
 
-static size_t  last_get_inserted_len = 0;      // length of the string 
returned from the
-                                               // last call to get_inserted()
-
 #ifdef FEAT_EVAL
 mapblock_T     *last_used_map = NULL;
 int            last_used_sid = -1;
@@ -203,19 +200,13 @@ get_recorded(void)
  * Return the contents of the redo buffer as a single string.
  * K_SPECIAL and CSI in the returned string are escaped.
  */
-    char_u *
+    string_T
 get_inserted(void)
 {
-    return get_buffcont(&redobuff, FALSE, &last_get_inserted_len);
-}
-
-/*
- * Return the length of string returned from the last call of get_inserted().
- */
-    size_t
-get_inserted_len(void)
-{
-    return last_get_inserted_len;
+    size_t len = 0;
+    char_u* str = get_buffcont(&redobuff, FALSE, &len);
+    string_T ret = { str, len };
+    return ret;
 }
 
 /*
diff --git a/src/proto/getchar.pro b/src/proto/getchar.pro
index c1eb1abad..11a37fb1c 100644
--- a/src/proto/getchar.pro
+++ b/src/proto/getchar.pro
@@ -1,7 +1,6 @@
 /* getchar.c */
 char_u *get_recorded(void);
-char_u *get_inserted(void);
-size_t get_inserted_len(void);
+string_T get_inserted(void);
 int stuff_empty(void);
 int readbuf1_empty(void);
 void typeahead_noflush(int c);
diff --git a/src/proto/userfunc.pro b/src/proto/userfunc.pro
index a0f04b206..95d8cc4f0 100644
--- a/src/proto/userfunc.pro
+++ b/src/proto/userfunc.pro
@@ -2,8 +2,7 @@
 void func_init(void);
 hashtab_T *func_tbl_get(void);
 char_u *make_ufunc_name_readable(char_u *name, char_u *buf, size_t bufsize);
-char_u *get_lambda_name(void);
-size_t get_lambda_name_len(void);
+string_T get_lambda_name(void);
 char_u *register_cfunc(cfunc_T cb, cfunc_free_T cb_free, void *state);
 int get_lambda_tv(char_u **arg, typval_T *rettv, int types_optional, evalarg_T 
*evalarg);
 char_u *deref_func_name(char_u *name, int *lenp, partial_T **partialp, type_T 
**type, int no_autoload, int new_function, int *found_var);
diff --git a/src/userfunc.c b/src/userfunc.c
index b7d2752dc..531b67a55 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -683,36 +683,28 @@ make_ufunc_name_readable(char_u *name, char_u *buf, 
size_t bufsize)
 }
 
 static char_u  lambda_name[8 + NUMBUFLEN];
-static size_t  lambda_namelen = 0;
 
 /*
  * Get a name for a lambda.  Returned in static memory.
  */
-    char_u *
+    string_T
 get_lambda_name(void)
 {
     static int lambda_no = 0;
     int                n;
+    string_T   ret;
 
     n = vim_snprintf((char *)lambda_name, sizeof(lambda_name), "<lambda>%d", 
++lambda_no);
     if (n < 1)
-       lambda_namelen = 0;
+       ret.length = 0;
     else
     if (n >= (int)sizeof(lambda_name))
-       lambda_namelen = sizeof(lambda_name) - 1;
+       ret.length = sizeof(lambda_name) - 1;
     else
-       lambda_namelen = (size_t)n;
-
-    return lambda_name;
-}
+       ret.length = (size_t)n;
 
-/*
- * Get the length of the last lambda name.
- */
-    size_t
-get_lambda_name_len(void)
-{
-    return lambda_namelen;
+    ret.string = lambda_name;
+    return ret;
 }
 
 /*
@@ -756,11 +748,10 @@ alloc_ufunc(char_u *name, size_t namelen)
     char_u *
 register_cfunc(cfunc_T cb, cfunc_free_T cb_free, void *state)
 {
-    char_u     *name = get_lambda_name();
-    size_t     namelen = get_lambda_name_len();
+    string_T   name = get_lambda_name();
     ufunc_T    *fp;
 
-    fp = alloc_ufunc(name, namelen);
+    fp = alloc_ufunc(name.string, name.length);
     if (fp == NULL)
        return NULL;
 
@@ -776,7 +767,7 @@ register_cfunc(cfunc_T cb, cfunc_free_T cb_free, void 
*state)
 
     hash_add(&func_hashtab, UF2HIKEY(fp), "add C function");
 
-    return name;
+    return name.string;
 }
 #endif
 
@@ -1477,8 +1468,7 @@ lambda_function_body(
     char_u     *cmdline = NULL;
     int                ret = FAIL;
     partial_T  *pt;
-    char_u     *name;
-    size_t     namelen;
+    string_T   name;
     int                lnum_save = -1;
     linenr_T   sourcing_lnum_top = SOURCING_LNUM;
     char_u     *line_arg = NULL;
@@ -1597,8 +1587,7 @@ lambda_function_body(
     }
 
     name = get_lambda_name();
-    namelen = get_lambda_name_len();
-    ufunc = alloc_ufunc(name, namelen);
+    ufunc = alloc_ufunc(name.string, name.length);
     if (ufunc == NULL)
        goto erret;
     if (hash_add(&func_hashtab, UF2HIKEY(ufunc), "add function") == FAIL)
@@ -1805,10 +1794,9 @@ get_lambda_tv(
        int         flags = FC_LAMBDA;
        char_u      *p;
        char_u      *line_end;
-       char_u      *name = get_lambda_name();
-       size_t      namelen = get_lambda_name_len();
+       string_T    name = get_lambda_name();
 
-       fp = alloc_ufunc(name, namelen);
+       fp = alloc_ufunc(name.string, name.length);
        if (fp == NULL)
            goto errret;
        fp->uf_def_status = UF_NOT_COMPILED;
diff --git a/src/version.c b/src/version.c
index 190528b9d..3d5f86938 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1169,
 /**/
     1168,
 /**/
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 67eeda857..9d0bf71de 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -1033,8 +1033,7 @@ compile_nested_function(exarg_T *eap, cctx_T *cctx, 
garray_T *lines_to_free)
     char_u     *name_end = to_name_end(eap->arg, TRUE);
     int                off;
     char_u     *func_name;
-    char_u     *lambda_name;
-    size_t     lambda_namelen;
+    string_T   lambda_name;
     ufunc_T    *ufunc;
     int                r = FAIL;
     compiletype_T   compile_type;
@@ -1094,9 +1093,8 @@ compile_nested_function(exarg_T *eap, cctx_T *cctx, 
garray_T *lines_to_free)
     eap->forceit = FALSE;
     // We use the special <Lamba>99 name, but it's not really a lambda.
     lambda_name = get_lambda_name();
-    lambda_namelen = get_lambda_name_len();
-    lambda_name = vim_strnsave(lambda_name, lambda_namelen);
-    if (lambda_name == NULL)
+    lambda_name.string = vim_strnsave(lambda_name.string, lambda_name.length);
+    if (lambda_name.string == NULL)
        return NULL;
 
     // This may free the current line, make a copy of the name.
@@ -1112,7 +1110,7 @@ compile_nested_function(exarg_T *eap, cctx_T *cctx, 
garray_T *lines_to_free)
     int save_KeyTyped = KeyTyped;
     KeyTyped = FALSE;
 
-    ufunc = define_function(eap, lambda_name, lines_to_free, 0, NULL, 0);
+    ufunc = define_function(eap, lambda_name.string, lines_to_free, 0, NULL, 
0);
 
     KeyTyped = save_KeyTyped;
 
@@ -1148,9 +1146,10 @@ compile_nested_function(exarg_T *eap, cctx_T *cctx, 
garray_T *lines_to_free)
     // recursive call.
     if (is_global)
     {
-       r = generate_NEWFUNC(cctx, lambda_name, func_name);
+       r = generate_NEWFUNC(cctx, lambda_name.string, func_name);
        func_name = NULL;
-       lambda_name = NULL;
+       lambda_name.string = NULL;
+       lambda_name.length = 0;
     }
     else
     {
@@ -1197,7 +1196,7 @@ compile_nested_function(exarg_T *eap, cctx_T *cctx, 
garray_T *lines_to_free)
     }
 
 theend:
-    vim_free(lambda_name);
+    vim_free(lambda_name.string);
     vim_free(func_name);
     return r == FAIL ? NULL : (char_u *)"";
 }

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/E1tpBFp-006iS3-BD%40256bit.org.

Raspunde prin e-mail lui