diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-01-22 13:39:08 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-01-22 13:39:08 +0000 |
commit | 9530b580a7b71960dbbdb2b12a3aafeb540bd135 (patch) | |
tree | 5e169ea9710cf9d3e1f9dade5ff223c2850a7d59 | |
parent | 0bfa84916d110d4f4d863e91e144ff05ba431316 (diff) | |
download | vim-git-9530b580a7b71960dbbdb2b12a3aafeb540bd135.tar.gz |
patch 8.2.4179: 'foldtext' is evaluated in the current script contextv8.2.4179
Problem: 'foldtext' is evaluated in the current script context.
Solution: Use the script context where the option was set.
-rw-r--r-- | src/buffer.c | 4 | ||||
-rw-r--r-- | src/eval.c | 6 | ||||
-rw-r--r-- | src/findfile.c | 2 | ||||
-rw-r--r-- | src/fold.c | 15 | ||||
-rw-r--r-- | src/proto/eval.pro | 2 | ||||
-rw-r--r-- | src/testdir/test_vim9_import.vim | 6 | ||||
-rw-r--r-- | src/version.c | 2 |
7 files changed, 24 insertions, 13 deletions
diff --git a/src/buffer.c b/src/buffer.c index d8d0f3cb5..e50b01d4a 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -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; diff --git a/src/eval.c b/src/eval.c index ec34ef13e..2ca337749 100644 --- a/src/eval.c +++ b/src/eval.c @@ -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; diff --git a/src/findfile.c b/src/findfile.c index 110e06b1d..3a6484574 100644 --- a/src/findfile.c +++ b/src/findfile.c @@ -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; } diff --git a/src/fold.c b/src/fold.c index 2a45d2108..73c71160b 100644 --- a/src/fold.c +++ b/src/fold.c @@ -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; diff --git a/src/proto/eval.pro b/src/proto/eval.pro index b0e94a0d7..abb9c565e 100644 --- a/src/proto/eval.pro +++ b/src/proto/eval.pro @@ -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); diff --git a/src/testdir/test_vim9_import.vim b/src/testdir/test_vim9_import.vim index df22a7719..3608802b1 100644 --- a/src/testdir/test_vim9_import.vim +++ b/src/testdir/test_vim9_import.vim @@ -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 diff --git a/src/version.c b/src/version.c index f273a155f..86eb14012 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4179, +/**/ 4178, /**/ 4177, |