diff options
Diffstat (limited to 'data/vim/patches/8.1.0190')
-rw-r--r-- | data/vim/patches/8.1.0190 | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0190 b/data/vim/patches/8.1.0190 new file mode 100644 index 000000000..36f52ad9b --- /dev/null +++ b/data/vim/patches/8.1.0190 @@ -0,0 +1,269 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.0190 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 8.1.0190 +Problem: Perl refcounts are wrong. +Solution: Improve refcounting. Add a test. (Damien) +Files: src/if_perl.xs, src/testdir/test_perl.vim + + +*** ../vim-8.1.0189/src/if_perl.xs 2018-07-08 17:18:58.416462371 +0200 +--- src/if_perl.xs 2018-07-16 17:34:41.750473682 +0200 +*************** +*** 845,850 **** +--- 845,858 ---- + return sv_bless(rv, gv_stashpv("VIBUF", TRUE)); + } + ++ #if 0 ++ SV *__sv_save[1024]; ++ int __sv_save_ix; ++ # define D_Save_Sv(sv) do { if (__sv_save_ix < 1024) __sv_save[__sv_save_ix++] = (sv); } while (0) ++ #else ++ # define D_Save_Sv(sv) NOOP ++ #endif ++ + /* + * perl_win_free + * Remove all references to the window to be destroyed +*************** +*** 852,868 **** + void + perl_win_free(win_T *wp) + { +! if (wp->w_perl_private) +! sv_setiv((SV *)wp->w_perl_private, 0); +! return; + } + + void + perl_buf_free(buf_T *bp) + { +! if (bp->b_perl_private) +! sv_setiv((SV *)bp->b_perl_private, 0); +! return; + } + + #ifndef PROTO +--- 860,886 ---- + void + perl_win_free(win_T *wp) + { +! if (wp->w_perl_private && perl_interp != NULL) +! { +! SV *sv = (SV*)wp->w_perl_private; +! D_Save_Sv(sv); +! sv_setiv(sv, 0); +! SvREFCNT_dec(sv); +! } +! wp->w_perl_private = NULL; + } + + void + perl_buf_free(buf_T *bp) + { +! if (bp->b_perl_private && perl_interp != NULL) +! { +! SV *sv = (SV *)bp->b_perl_private; +! D_Save_Sv(sv); +! sv_setiv(sv, 0); +! SvREFCNT_dec(sv); +! } +! bp->b_perl_private = NULL; + } + + #ifndef PROTO +*************** +*** 885,896 **** + # endif + { + SV *rv; + if (iv == 0) + rv = newWINrv(newSV(0), curwin); + else + rv = newBUFrv(newSV(0), curbuf); +! sv_setsv(sv, rv); +! SvREFCNT_dec(SvRV(rv)); + return 0; + } + #endif /* !PROTO */ +--- 903,921 ---- + # endif + { + SV *rv; ++ + if (iv == 0) + rv = newWINrv(newSV(0), curwin); + else + rv = newBUFrv(newSV(0), curbuf); +! +! if (SvRV(sv) == SvRV(rv)) +! SvREFCNT_dec(SvRV(rv)); +! else /* XXX: Not sure if the `else` condition are right +! * Test_SvREFCNT() pass in all case. +! */ +! sv_setsv(sv, rv); +! + return 0; + } + #endif /* !PROTO */ +*************** +*** 1539,1545 **** + else + { + FOR_ALL_BUFFERS(vimbuf) +! XPUSHs(newBUFrv(newSV(0), vimbuf)); + } + } + else +--- 1564,1570 ---- + else + { + FOR_ALL_BUFFERS(vimbuf) +! XPUSHs(sv_2mortal(newBUFrv(newSV(0), vimbuf))); + } + } + else +*************** +*** 1564,1570 **** + { + vimbuf = buflist_findnr(b); + if (vimbuf) +! XPUSHs(newBUFrv(newSV(0), vimbuf)); + } + } + } +--- 1589,1595 ---- + { + vimbuf = buflist_findnr(b); + if (vimbuf) +! XPUSHs(sv_2mortal(newBUFrv(newSV(0), vimbuf))); + } + } + } +*************** +*** 1584,1590 **** + else + { + FOR_ALL_WINDOWS(vimwin) +! XPUSHs(newWINrv(newSV(0), vimwin)); + } + } + else +--- 1609,1615 ---- + else + { + FOR_ALL_WINDOWS(vimwin) +! XPUSHs(sv_2mortal(newWINrv(newSV(0), vimwin))); + } + } + else +*************** +*** 1594,1600 **** + w = (int) SvIV(ST(i)); + vimwin = win_find_nr(w); + if (vimwin) +! XPUSHs(newWINrv(newSV(0), vimwin)); + } + } + +--- 1619,1625 ---- + w = (int) SvIV(ST(i)); + vimwin = win_find_nr(w); + if (vimwin) +! XPUSHs(sv_2mortal(newWINrv(newSV(0), vimwin))); + } + } + +*** ../vim-8.1.0189/src/testdir/test_perl.vim 2017-03-18 19:45:55.000000000 +0100 +--- src/testdir/test_perl.vim 2018-07-16 17:34:41.754473657 +0200 +*************** +*** 219,238 **** + call assert_equal(['&VIM::Msg', 'STDOUT', 'STDERR'], split(l:out, "\n")) + endfunc + +! func Test_SvREFCNT() + new t + perl <<--perl + my ($b, $w); +! $b = $curbuf for 0 .. 10; +! $w = $curwin for 0 .. 10; + VIM::DoCommand('bw! t'); + if (exists &Internals::SvREFCNT) { + my $cb = Internals::SvREFCNT($$b); + my $cw = Internals::SvREFCNT($$w); +! VIM::Eval("assert_equal(2, $cb)"); +! VIM::Eval("assert_equal(2, $cw)"); + } + VIM::Eval("assert_false($$b)"); + VIM::Eval("assert_false($$w)"); + --perl + endfunc +--- 219,260 ---- + call assert_equal(['&VIM::Msg', 'STDOUT', 'STDERR'], split(l:out, "\n")) + endfunc + +! " Run first to get a clean namespace +! func Test_000_SvREFCNT() +! for i in range(10) +! exec 'new X'.i +! endfor + new t + perl <<--perl ++ #line 5 "Test_000_SvREFCNT()" + my ($b, $w); +! +! $b = $curbuf for 0 .. 100; +! $w = $curwin for 0 .. 100; +! () = VIM::Buffers for 0 .. 100; +! () = VIM::Windows for 0 .. 100; +! + VIM::DoCommand('bw! t'); + if (exists &Internals::SvREFCNT) { + my $cb = Internals::SvREFCNT($$b); + my $cw = Internals::SvREFCNT($$w); +! VIM::Eval("assert_equal(2, $cb, 'T1')"); +! VIM::Eval("assert_equal(2, $cw, 'T2')"); +! foreach ( VIM::Buffers, VIM::Windows ) { +! my $c = Internals::SvREFCNT($_); +! VIM::Eval("assert_equal(2, $c, 'T3')"); +! $c = Internals::SvREFCNT($$_); +! # Why only one ref? +! # Look wrong but work. Maybe not portable... +! VIM::Eval("assert_equal(1, $c, 'T4')"); +! } +! $cb = Internals::SvREFCNT($$curbuf); +! $cw = Internals::SvREFCNT($$curwin); +! VIM::Eval("assert_equal(3, $cb, 'T5')"); +! VIM::Eval("assert_equal(3, $cw, 'T6')"); + } + VIM::Eval("assert_false($$b)"); + VIM::Eval("assert_false($$w)"); + --perl ++ %bw! + endfunc +*** ../vim-8.1.0189/src/version.c 2018-07-15 20:26:37.418459878 +0200 +--- src/version.c 2018-07-16 17:37:41.017344049 +0200 +*************** +*** 791,792 **** +--- 791,794 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 190, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +255. You work for a newspaper and your editor asks you to write an + article about Internet addiction...in the "first person." + + /// 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 /// |