Patch 8.2.2289

7 views
Skip to first unread message

Bram Moolenaar

unread,
Jan 3, 2021, 1:52:47 PM1/3/21
to vim...@googlegroups.com

Patch 8.2.2289
Problem: Vim9: 'cpo' can become empty.
Solution: Use empty_option instead of an empty string. Update quickfix
buffer after restoring 'cpo'. (closes #7608)
Files: src/evalfunc.c, src/syntax.c, src/eval.c, src/quickfix.c,
src/evalbuffer.c, src/ex_eval.c, src/gui_motif.c, src/map.c,
src/testdir/test_quickfix.vim


*** ../vim-8.2.2288/src/evalfunc.c 2020-12-28 12:56:54.179617297 +0100
--- src/evalfunc.c 2021-01-03 19:40:07.503140131 +0100
***************
*** 6316,6322 ****

// Make 'cpoptions' empty, the 'l' flag should not be used here.
save_cpo = p_cpo;
! p_cpo = (char_u *)"";

rettv->vval.v_number = -1;
if (type == MATCH_LIST || type == MATCH_POS)
--- 6316,6322 ----

// Make 'cpoptions' empty, the 'l' flag should not be used here.
save_cpo = p_cpo;
! p_cpo = empty_option;

rettv->vval.v_number = -1;
if (type == MATCH_LIST || type == MATCH_POS)
***************
*** 8024,8031 ****
--- 8024,8037 ----
if (p_cpo == empty_option)
p_cpo = save_cpo;
else
+ {
// Darn, evaluating the {skip} expression changed the value.
+ // If it's still empty it was changed and restored, need to restore in
+ // the complicated way.
+ if (*p_cpo == NUL)
+ set_option_value((char_u *)"cpo", 0L, save_cpo, 0);
free_string_option(save_cpo);
+ }

return retval;
}
***************
*** 8723,8729 ****

// Make 'cpoptions' empty, the 'l' flag should not be used here.
save_cpo = p_cpo;
! p_cpo = (char_u *)"";

str = tv_get_string(&argvars[0]);
if (argvars[1].v_type != VAR_UNKNOWN)
--- 8729,8735 ----

// Make 'cpoptions' empty, the 'l' flag should not be used here.
save_cpo = p_cpo;
! p_cpo = empty_option;

str = tv_get_string(&argvars[0]);
if (argvars[1].v_type != VAR_UNKNOWN)
*** ../vim-8.2.2288/src/syntax.c 2020-11-29 14:11:33.159022814 +0100
--- src/syntax.c 2021-01-03 19:41:50.346592075 +0100
***************
*** 5670,5676 ****

// Make 'cpoptions' empty, to avoid the 'l' flag
cpo_save = p_cpo;
! p_cpo = (char_u *)"";
ci->sp_prog = vim_regcomp(ci->sp_pattern, RE_MAGIC);
p_cpo = cpo_save;

--- 5670,5676 ----

// Make 'cpoptions' empty, to avoid the 'l' flag
cpo_save = p_cpo;
! p_cpo = empty_option;
ci->sp_prog = vim_regcomp(ci->sp_pattern, RE_MAGIC);
p_cpo = cpo_save;

***************
*** 5858,5864 ****

// Make 'cpoptions' empty, to avoid the 'l' flag
cpo_save = p_cpo;
! p_cpo = (char_u *)"";
curwin->w_s->b_syn_linecont_prog =
vim_regcomp(curwin->w_s->b_syn_linecont_pat, RE_MAGIC);
p_cpo = cpo_save;
--- 5858,5864 ----

// Make 'cpoptions' empty, to avoid the 'l' flag
cpo_save = p_cpo;
! p_cpo = empty_option;
curwin->w_s->b_syn_linecont_prog =
vim_regcomp(curwin->w_s->b_syn_linecont_pat, RE_MAGIC);
p_cpo = cpo_save;
*** ../vim-8.2.2288/src/eval.c 2021-01-01 21:05:51.222773812 +0100
--- src/eval.c 2021-01-03 19:38:29.071700147 +0100
***************
*** 1940,1946 ****

// avoid 'l' flag in 'cpoptions'
save_cpo = p_cpo;
! p_cpo = (char_u *)"";
regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING);
if (regmatch.regprog != NULL)
{
--- 1940,1946 ----

// avoid 'l' flag in 'cpoptions'
save_cpo = p_cpo;
! p_cpo = empty_option;
regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING);
if (regmatch.regprog != NULL)
{
***************
*** 6200,6207 ****
--- 6200,6213 ----
if (p_cpo == empty_option)
p_cpo = save_cpo;
else
+ {
// Darn, evaluating {sub} expression or {expr} changed the value.
+ // If it's still empty it was changed and restored, need to restore in
+ // the complicated way.
+ if (*p_cpo == NUL)
+ set_option_value((char_u *)"cpo", 0L, save_cpo, 0);
free_string_option(save_cpo);
+ }

return ret;
}
*** ../vim-8.2.2288/src/evalfunc.c 2020-12-28 12:56:54.179617297 +0100
--- src/evalfunc.c 2021-01-03 19:40:07.503140131 +0100
***************
*** 6316,6322 ****

// Make 'cpoptions' empty, the 'l' flag should not be used here.
save_cpo = p_cpo;
! p_cpo = (char_u *)"";

rettv->vval.v_number = -1;
if (type == MATCH_LIST || type == MATCH_POS)
--- 6316,6322 ----

// Make 'cpoptions' empty, the 'l' flag should not be used here.
save_cpo = p_cpo;
! p_cpo = empty_option;

rettv->vval.v_number = -1;
if (type == MATCH_LIST || type == MATCH_POS)
***************
*** 8024,8031 ****
--- 8024,8037 ----
if (p_cpo == empty_option)
p_cpo = save_cpo;
else
+ {
// Darn, evaluating the {skip} expression changed the value.
+ // If it's still empty it was changed and restored, need to restore in
+ // the complicated way.
+ if (*p_cpo == NUL)
+ set_option_value((char_u *)"cpo", 0L, save_cpo, 0);
free_string_option(save_cpo);
+ }

return retval;
}
***************
*** 8723,8729 ****

// Make 'cpoptions' empty, the 'l' flag should not be used here.
save_cpo = p_cpo;
! p_cpo = (char_u *)"";

str = tv_get_string(&argvars[0]);
if (argvars[1].v_type != VAR_UNKNOWN)
--- 8729,8735 ----

// Make 'cpoptions' empty, the 'l' flag should not be used here.
save_cpo = p_cpo;
! p_cpo = empty_option;

str = tv_get_string(&argvars[0]);
if (argvars[1].v_type != VAR_UNKNOWN)
*** ../vim-8.2.2288/src/quickfix.c 2020-12-22 11:40:40.669481249 +0100
--- src/quickfix.c 2021-01-03 19:48:59.668580325 +0100
***************
*** 8099,8104 ****
--- 8099,8105 ----
int new_qi = FALSE;
char_u *au_name = NULL;
char_u *lang = NULL;
+ int updated = FALSE;

switch (eap->cmdidx)
{
***************
*** 8150,8163 ****
qfl->qf_ptr = qfl->qf_start;
qfl->qf_index = 1;
qf_list_changed(qfl);
! qf_update_buffer(qi, NULL);
}

if (p_cpo == empty_option)
p_cpo = save_cpo;
else
! // Darn, some plugin changed the value.
free_string_option(save_cpo);

if (au_name != NULL)
{
--- 8151,8174 ----
qfl->qf_ptr = qfl->qf_start;
qfl->qf_index = 1;
qf_list_changed(qfl);
! updated = TRUE;
}

if (p_cpo == empty_option)
p_cpo = save_cpo;
else
! {
! // Darn, some plugin changed the value. If it's still empty it was
! // changed and restored, need to restore in the complicated way.
! if (*p_cpo == NUL)
! set_option_value((char_u *)"cpo", 0L, save_cpo, 0);
free_string_option(save_cpo);
+ }
+
+ if (updated)
+ // This may open a window and source scripts, do this after 'cpo' was
+ // restored.
+ qf_update_buffer(qi, NULL);

if (au_name != NULL)
{
*** ../vim-8.2.2288/src/evalbuffer.c 2021-01-02 13:53:55.345783905 +0100
--- src/evalbuffer.c 2021-01-03 19:38:54.179553553 +0100
***************
*** 68,74 ****
save_magic = p_magic;
p_magic = TRUE;
save_cpo = p_cpo;
! p_cpo = (char_u *)"";

buf = buflist_findnr(buflist_findpat(name, name + STRLEN(name),
TRUE, FALSE, curtab_only));
--- 68,74 ----
save_magic = p_magic;
p_magic = TRUE;
save_cpo = p_cpo;
! p_cpo = empty_option;

buf = buflist_findnr(buflist_findpat(name, name + STRLEN(name),
TRUE, FALSE, curtab_only));
*** ../vim-8.2.2288/src/ex_eval.c 2020-12-19 17:55:50.810666202 +0100
--- src/ex_eval.c 2021-01-03 19:40:35.182989235 +0100
***************
*** 1695,1701 ****
*end = NUL;
}
save_cpo = p_cpo;
! p_cpo = (char_u *)"";
// Disable error messages, it will make current_exception
// invalid.
++emsg_off;
--- 1695,1701 ----
*end = NUL;
}
save_cpo = p_cpo;
! p_cpo = empty_option;
// Disable error messages, it will make current_exception
// invalid.
++emsg_off;
*** ../vim-8.2.2288/src/gui_motif.c 2020-11-05 20:50:45.331984998 +0100
--- src/gui_motif.c 2021-01-03 19:41:02.386843466 +0100
***************
*** 3525,3531 ****
char_u *save_cpo = p_cpo;

// No need to be Vi compatible here.
! p_cpo = (char_u *)"";
u_undo(1);
p_cpo = save_cpo;
gui_update_screen();
--- 3525,3531 ----
char_u *save_cpo = p_cpo;

// No need to be Vi compatible here.
! p_cpo = empty_options;
u_undo(1);
p_cpo = save_cpo;
gui_update_screen();
*** ../vim-8.2.2288/src/map.c 2020-12-18 19:49:52.341571870 +0100
--- src/map.c 2021-01-03 19:41:25.626720783 +0100
***************
*** 2475,2481 ****
char_u *s;
char_u *cpo_save = p_cpo;

! p_cpo = (char_u *)""; // Allow <> notation
s = vim_strsave(map);
if (s != NULL)
{
--- 2475,2481 ----
char_u *s;
char_u *cpo_save = p_cpo;

! p_cpo = empty_option; // Allow <> notation
s = vim_strsave(map);
if (s != NULL)
{
*** ../vim-8.2.2288/src/testdir/test_quickfix.vim 2020-12-16 21:02:51.642934141 +0100
--- src/testdir/test_quickfix.vim 2021-01-03 19:47:26.604988132 +0100
***************
*** 702,707 ****
--- 702,727 ----
call s:test_xhelpgrep('l')
endfunc

+ def Test_helpgrep_vim9_restore_cpo()
+ assert_equal('aABceFs', &cpo)
+
+ var rtp_save = &rtp
+ var dir = 'Xruntime/after'
+ &rtp ..= ',' .. dir
+ mkdir(dir .. '/ftplugin', 'p')
+ writefile(['vim9'], dir .. '/ftplugin/qf.vim')
+ filetype plugin on
+ silent helpgrep grail
+ cwindow
+ silent helpgrep grail
+
+ assert_equal('aABceFs', &cpo)
+ delete(dir, 'rf')
+ &rtp = rtp_save
+ cclose
+ helpclose
+ enddef
+
func Test_errortitle()
augroup QfBufWinEnter
au!
*** ../vim-8.2.2288/src/version.c 2021-01-03 18:33:09.992382498 +0100
--- src/version.c 2021-01-03 19:49:39.684408496 +0100
***************
*** 752,753 ****
--- 752,755 ----
{ /* Add new patch number below this line */
+ /**/
+ 2289,
/**/

--
% cat /usr/include/long_life.h
long life(double fun);

/// Bram Moolenaar -- Br...@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

Tony Mechelynck

unread,
Jan 3, 2021, 3:20:01 PM1/3/21
to Bram Moolenaar, vim_dev
On Sun, Jan 3, 2021 at 7:52 PM Bram Moolenaar <Br...@moolenaar.net> wrote:
>
>
> Patch 8.2.2289
> Problem: Vim9: 'cpo' can become empty.
> Solution: Use empty_option instead of an empty string. Update quickfix
> buffer after restoring 'cpo'. (closes #7608)
> Files: src/evalfunc.c, src/syntax.c, src/eval.c, src/quickfix.c,
> src/evalbuffer.c, src/ex_eval.c, src/gui_motif.c, src/map.c,
> src/testdir/test_quickfix.vim
>

Regression: Build error in gui_motif.c with Small features (I could
build a Small Vim with Motif GUI before)

gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_MOTIF -O2
-fno-strength-reduce -Wall -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
-o objects/gui_motif.o gui_motif.c
gui_motif.c: In function ‘find_replace_callback’:
gui_motif.c:3528:10: error: ‘empty_options’ undeclared (first use in
this function); did you mean ‘empty_option’?
p_cpo = empty_options;
^~~~~~~~~~~~~
empty_option
gui_motif.c:3528:10: note: each undeclared identifier is reported only
once for each function it appears in
make: *** [Makefile:3296: objects/gui_motif.o] Error 1
exit status 2
Sun 3 Jan 21:10:00 CET 2021


Best regards,
Tony.

Bram Moolenaar

unread,
Jan 3, 2021, 4:13:25 PM1/3/21
to vim...@googlegroups.com, Tony Mechelynck
Thanks for reporting. I don't think we have a CI test with Motif.

--
From "know your smileys":
<>:-) Bishop

Tony Mechelynck

unread,
Jan 3, 2021, 4:28:29 PM1/3/21
to Bram Moolenaar, vim_dev
On Sun, Jan 3, 2021 at 10:13 PM Bram Moolenaar <Br...@moolenaar.net> wrote:
>
> Thanks for reporting. I don't think we have a CI test with Motif.
>
Well, at the moment I build the following:
- Huge with several interpreted languages and GTK3 GUI
- Big and Normal with GTK3 GUI
- Small with Motif GUI
- Tiny with no GUI
but I don't run any predefined tests: I just check that all five can
build, and I use the Big one (with no interpreted languages)
day-to-day as a "live" test.

Moge jouw nieuw jaar beter zijn dan het oude ;-)

Best regards,
Tony.
Reply all
Reply to author
Forward
0 new messages