To: vim_dev@googlegroups.com Subject: Patch 8.2.1636 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.1636 Problem: Get stuck if a popup filter causes an error. Solution: Check whether the function can be called and does not cause an error. (closes #6902) Files: src/structs.h, src/popupwin.c, src/testdir/test_popupwin.vim src/testdir/dumps/Test_popupwin_wrong_name.dump, src/testdir/dumps/Test_popupwin_three_errors_1.dump, src/testdir/dumps/Test_popupwin_three_errors_2.dump *** ../vim-8.2.1635/src/structs.h 2020-08-31 21:58:36.115898718 +0200 --- src/structs.h 2020-09-08 21:30:50.795915168 +0200 *************** *** 3338,3343 **** --- 3338,3344 ---- // with "cursorline" set callback_T w_close_cb; // popup close callback callback_T w_filter_cb; // popup filter callback + int w_filter_errors; // popup filter error count int w_filter_mode; // mode when filter callback is used win_T *w_popup_curwin; // close popup if curwin differs *** ../vim-8.2.1635/src/popupwin.c 2020-09-02 22:33:20.824524597 +0200 --- src/popupwin.c 2020-09-08 22:04:31.605374591 +0200 *************** *** 3126,3131 **** --- 3126,3132 ---- typval_T argv[3]; char_u buf[NUMBUFLEN]; linenr_T old_lnum = wp->w_cursor.lnum; + int prev_called_emsg = called_emsg; // Emergency exit: CTRL-C closes the popup. if (c == Ctrl_C) *************** *** 3151,3160 **** argv[2].v_type = VAR_UNKNOWN; // NOTE: The callback might close the popup and make "wp" invalid. ! call_callback(&wp->w_filter_cb, -1, &rettv, 2, argv); if (win_valid_popup(wp) && old_lnum != wp->w_cursor.lnum) popup_highlight_curline(wp); ! res = tv_get_bool(&rettv); vim_free(argv[1].vval.v_string); clear_tv(&rettv); --- 3152,3186 ---- argv[2].v_type = VAR_UNKNOWN; // NOTE: The callback might close the popup and make "wp" invalid. ! if (call_callback(&wp->w_filter_cb, -1, &rettv, 2, argv) == FAIL) ! { ! // Cannot call the function, close the popup to avoid that the filter ! // eats keys and the user can't get out. ! popup_close_with_retval(wp, -1); ! return 1; ! } ! if (win_valid_popup(wp) && old_lnum != wp->w_cursor.lnum) popup_highlight_curline(wp); ! ! // If an error was given always return FALSE, so that keys are not ! // consumed and the user can type something. ! // If we get three errors in a row then close the popup. Decrement the ! // error count by 1/10 if there are no errors, thus allowing up to 1 in ! // 10 calls to cause an error. ! if (win_valid_popup(wp) && called_emsg > prev_called_emsg) ! { ! wp->w_filter_errors += 10; ! if (wp->w_filter_errors >= 30) ! popup_close_with_retval(wp, -1); ! res = FALSE; ! } ! else ! { ! if (win_valid_popup(wp) && wp->w_filter_errors > 0) ! --wp->w_filter_errors; ! res = tv_get_bool(&rettv); ! } vim_free(argv[1].vval.v_string); clear_tv(&rettv); *** ../vim-8.2.1635/src/testdir/test_popupwin.vim 2020-09-04 21:18:40.484161926 +0200 --- src/testdir/test_popupwin.vim 2020-09-08 21:51:49.447792103 +0200 *************** *** 3516,3522 **** call VerifyScreenDump(buf, 'Test_popupwin_ctrl_c', {}) call StopVimInTerminal(buf) ! call delete('XtestPopupCorners') endfunc func Test_popupwin_atcursor_far_right() --- 3516,3559 ---- call VerifyScreenDump(buf, 'Test_popupwin_ctrl_c', {}) call StopVimInTerminal(buf) ! call delete('XtestPopupCtrlC') ! endfunc ! ! func Test_popupwin_filter_close_wrong_name() ! CheckScreendump ! ! let lines =<< trim END ! call popup_create('one two three...', {'filter': 'NoSuchFunc'}) ! END ! call writefile(lines, 'XtestPopupWrongName') ! ! let buf = RunVimInTerminal('-S XtestPopupWrongName', #{rows: 10}) ! ! call term_sendkeys(buf, "j") ! call VerifyScreenDump(buf, 'Test_popupwin_wrong_name', {}) ! ! call StopVimInTerminal(buf) ! call delete('XtestPopupWrongName') ! endfunc ! ! func Test_popupwin_filter_close_three_errors() ! CheckScreendump ! ! let lines =<< trim END ! set cmdheight=2 ! call popup_create('one two three...', {'filter': 'filter'}) ! END ! call writefile(lines, 'XtestPopupThreeErrors') ! ! let buf = RunVimInTerminal('-S XtestPopupThreeErrors', #{rows: 10}) ! ! call term_sendkeys(buf, "jj") ! call VerifyScreenDump(buf, 'Test_popupwin_three_errors_1', {}) ! call term_sendkeys(buf, "j") ! call VerifyScreenDump(buf, 'Test_popupwin_three_errors_2', {}) ! ! call StopVimInTerminal(buf) ! call delete('XtestPopupThreeErrors') endfunc func Test_popupwin_atcursor_far_right() *** ../vim-8.2.1635/src/testdir/dumps/Test_popupwin_wrong_name.dump 2020-09-08 22:05:40.421147922 +0200 --- src/testdir/dumps/Test_popupwin_wrong_name.dump 2020-09-08 21:48:26.380379649 +0200 *************** *** 0 **** --- 1,10 ---- + > +0&#ffffff0@74 + |~+0#4040ff13&| @73 + |~| @73 + |~| @73 + |~| @73 + |~| @73 + |~| @73 + |~| @73 + |~| @73 + |E+0#ffffff16#e000002|1@1|7|:| |U|n|k|n|o|w|n| |f|u|n|c|t|i|o|n|:| |N|o|S|u|c|h|F|u|n|c| +0#0000000#ffffff0@22|0|,|0|-|1| @8|A|l@1| *** ../vim-8.2.1635/src/testdir/dumps/Test_popupwin_three_errors_1.dump 2020-09-08 22:05:40.425147907 +0200 --- src/testdir/dumps/Test_popupwin_three_errors_1.dump 2020-09-08 21:52:15.963712771 +0200 *************** *** 0 **** --- 1,10 ---- + > +0&#ffffff0@74 + |~+0#4040ff13&| @73 + |~| @73 + |~| @73 + |~| @27|o+0#0000001#ffd7ff255|n|e| |t|w|o| |t|h|r|e@1|.@2| +0#4040ff13#ffffff0@29 + |~| @73 + |~| @73 + |~| @73 + |E+0#ffffff16#e000002|8|9|6|:| |A|r|g|u|m|e|n|t| |o|f| |f|i|l|t|e|r|(|)| |m|u|s|t| |b|e| |a| |L|i|s|t|,| |D|i|c|t|i|o|n|a|r|y| |o|r| |B|l|o|b| +0#0000000#ffffff0@13 + @57|0|,|0|-|1| @8|A|l@1| *** ../vim-8.2.1635/src/testdir/dumps/Test_popupwin_three_errors_2.dump 2020-09-08 22:05:40.429147896 +0200 --- src/testdir/dumps/Test_popupwin_three_errors_2.dump 2020-09-08 21:52:17.011709626 +0200 *************** *** 0 **** --- 1,10 ---- + > +0&#ffffff0@74 + |~+0#4040ff13&| @73 + |~| @73 + |~| @73 + |~| @73 + |~| @73 + |~| @73 + |~| @73 + |E+0#ffffff16#e000002|8|9|6|:| |A|r|g|u|m|e|n|t| |o|f| |f|i|l|t|e|r|(|)| |m|u|s|t| |b|e| |a| |L|i|s|t|,| |D|i|c|t|i|o|n|a|r|y| |o|r| |B|l|o|b| +0#0000000#ffffff0@13 + @57|0|,|0|-|1| @8|A|l@1| *** ../vim-8.2.1635/src/version.c 2020-09-08 19:05:41.723819080 +0200 --- src/version.c 2020-09-08 21:25:50.372923132 +0200 *************** *** 756,757 **** --- 756,759 ---- { /* Add new patch number below this line */ + /**/ + 1636, /**/ -- TIM: That is not an ordinary rabbit ... 'tis the most foul cruel and bad-tempered thing you ever set eyes on. ROBIN: You tit. I soiled my armour I was so scared! "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// Bram Moolenaar -- Bram@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 ///