patch 8.2.4179: 'foldtext' is evaluated in the current script context v8.2.4179
authorBram Moolenaar <Bram@vim.org>
Sat, 22 Jan 2022 13:39:08 +0000 (13:39 +0000)
committerBram Moolenaar <Bram@vim.org>
Sat, 22 Jan 2022 13:39:08 +0000 (13:39 +0000)
Problem:    'foldtext' is evaluated in the current script context.
Solution:   Use the script context where the option was set.

src/buffer.c
src/eval.c
src/findfile.c
src/fold.c
src/proto/eval.pro
src/testdir/test_vim9_import.vim
src/version.c

index d8d0f3cb5f5d58f838f84d55d5e3d7c5331d67d3..e50b01d4a78bdd4f4009762bba256e45a3ee3c01 100644 (file)
@@ -4162,7 +4162,7 @@ build_stl_str_hl(
        tv.vval.v_number = wp->w_id;
        set_var((char_u *)"g:statusline_winid", &tv, FALSE);
 
-       usefmt = eval_to_string_safe(fmt + 2, use_sandbox);
+       usefmt = eval_to_string_safe(fmt + 2, use_sandbox, FALSE);
        if (usefmt == NULL)
            usefmt = fmt;
 
@@ -4546,7 +4546,7 @@ build_stl_str_hl(
            if (curwin != save_curwin)
                VIsual_active = FALSE;
 
-           str = eval_to_string_safe(p, use_sandbox);
+           str = eval_to_string_safe(p, use_sandbox, FALSE);
 
            curwin = save_curwin;
            curbuf = save_curbuf;
index ec34ef13e2b532a29552c8bc53d066dad38338be..2ca3377492e6817204d9df487e45b73ca6fcae2c 100644 (file)
@@ -555,14 +555,16 @@ eval_to_string(
     char_u *
 eval_to_string_safe(
     char_u     *arg,
-    int                use_sandbox)
+    int                use_sandbox,
+    int                keep_script_version)
 {
     char_u     *retval;
     funccal_entry_T funccal_entry;
     int                save_sc_version = current_sctx.sc_version;
     int                save_garbage = may_garbage_collect;
 
-    current_sctx.sc_version = 1;
+    if (!keep_script_version)
+       current_sctx.sc_version = 1;
     save_funccal(&funccal_entry);
     if (use_sandbox)
        ++sandbox;
index 110e06b1d6e560505ff4b865af4c986adff2ceef..3a6484574ed35ed401d314f3bce1d0603b7ee4a9 100644 (file)
@@ -2097,7 +2097,7 @@ eval_includeexpr(char_u *ptr, int len)
 
     set_vim_var_string(VV_FNAME, ptr, len);
     res = eval_to_string_safe(curbuf->b_p_inex,
-                     was_set_insecurely((char_u *)"includeexpr", OPT_LOCAL));
+               was_set_insecurely((char_u *)"includeexpr", OPT_LOCAL), FALSE);
     set_vim_var_string(VV_FNAME, NULL, 0);
     return res;
 }
index 2a45d2108fc07d6e9a7728104fd1fe51cb3c5301..73c71160bda4945a776f13793ce6838346c79af2 100644 (file)
@@ -1923,7 +1923,6 @@ get_foldtext(
     if (*wp->w_p_fdt != NUL)
     {
        char_u  dashes[MAX_LEVEL + 2];
-       win_T   *save_curwin;
        int     level;
        char_u  *p;
 
@@ -1941,23 +1940,27 @@ get_foldtext(
        set_vim_var_string(VV_FOLDDASHES, dashes, -1);
        set_vim_var_nr(VV_FOLDLEVEL, (long)level);
 
-       // skip evaluating foldtext on errors
+       // skip evaluating 'foldtext' on errors
        if (!got_fdt_error)
        {
-           save_curwin = curwin;
+           win_T   *save_curwin = curwin;
+           sctx_T  saved_sctx = current_sctx;
+
            curwin = wp;
            curbuf = wp->w_buffer;
+           current_sctx = wp->w_p_script_ctx[WV_FDT];
 
-           ++emsg_silent; // handle exceptions, but don't display errors
+           ++emsg_off; // handle exceptions, but don't display errors
            text = eval_to_string_safe(wp->w_p_fdt,
-                        was_set_insecurely((char_u *)"foldtext", OPT_LOCAL));
-           --emsg_silent;
+                   was_set_insecurely((char_u *)"foldtext", OPT_LOCAL), TRUE);
+           --emsg_off;
 
            if (text == NULL || did_emsg)
                got_fdt_error = TRUE;
 
            curwin = save_curwin;
            curbuf = curwin->w_buffer;
+           current_sctx = saved_sctx;
        }
        last_lnum = lnum;
        last_wp   = wp;
index b0e94a0d76428fc69c29750f204786cc98e28e34..abb9c565e2538ecca8f81f0c1e14f34b8906621c 100644 (file)
@@ -14,7 +14,7 @@ int skip_expr_concatenate(char_u **arg, char_u **start, char_u **end, evalarg_T
 char_u *typval2string(typval_T *tv, int convert);
 char_u *eval_to_string_eap(char_u *arg, int convert, exarg_T *eap);
 char_u *eval_to_string(char_u *arg, int convert);
-char_u *eval_to_string_safe(char_u *arg, int use_sandbox);
+char_u *eval_to_string_safe(char_u *arg, int use_sandbox, int keep_script_version);
 varnumber_T eval_to_number(char_u *expr);
 typval_T *eval_expr(char_u *arg, exarg_T *eap);
 int call_vim_function(char_u *func, int argc, typval_T *argv, typval_T *rettv);
index df22a7719c04209faaf6c40f879f9b63571b295b..3608802b1902bdd4a6541f0acb554e0f266bc992 100644 (file)
@@ -683,6 +683,9 @@ def Test_use_autoload_import_in_fold_expression()
       export def Expr(): string
         return getline(v:lnum) =~ '^#' ? '>1' : '1'
       enddef
+      export def Text(): string
+        return 'fold text'
+      enddef
       g:fold_loaded = 'yes'
   END
   writefile(lines, 'Xdir/autoload/fold.vim')
@@ -691,6 +694,7 @@ def Test_use_autoload_import_in_fold_expression()
       vim9script
       import autoload 'fold.vim'
       &foldexpr = 'fold.Expr()'
+      &foldtext = 'fold.Text()'
       &foldmethod = 'expr'
       &debug = 'throw'
   END
@@ -706,7 +710,7 @@ def Test_use_autoload_import_in_fold_expression()
   edit! otherfile
   redraw
 
-  set foldexpr= foldmethod& debug=
+  set foldexpr= foldtext& foldmethod& debug=
   bwipe!
   delete('Xdir', 'rf')
   &rtp = save_rtp
index f273a155f822bda74fd169132e9668b2ad38053f..86eb140126bed583caddf99f08aaa3b304835eb1 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4179,
 /**/
     4178,
 /**/