From 95509e18f8806046eeee27482c77666bbec515da Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Fri, 15 Apr 2016 21:16:11 +0200 Subject: patch 7.4.1746 Problem: Memory leak in Perl. Solution: Decrement the reference count. Add a test. (Damien) --- src/if_perl.xs | 1 + src/testdir/test_perl.vim | 28 +++++++++++++++++++++++----- src/version.c | 2 ++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/if_perl.xs b/src/if_perl.xs index b091bf7cab..23246a57b1 100644 --- a/src/if_perl.xs +++ b/src/if_perl.xs @@ -844,6 +844,7 @@ I32 cur_val(IV iv, SV *sv) else rv = newBUFrv(newSV(0), curbuf); sv_setsv(sv, rv); + SvREFCNT_dec(SvRV(rv)); return 0; } #endif /* !PROTO */ diff --git a/src/testdir/test_perl.vim b/src/testdir/test_perl.vim index b523805a89..da47ab153c 100644 --- a/src/testdir/test_perl.vim +++ b/src/testdir/test_perl.vim @@ -34,7 +34,7 @@ fu catch_peval(expr) endtry call assert_true(0, 'no exception for `perleval("'.a:expr.'")`') return '' -endf +endfunc function Test_perleval() call assert_false(perleval('undef')) @@ -73,7 +73,7 @@ function Test_perleval() call assert_equal('*VIM', perleval('"*VIM"')) call assert_true(perleval('\\0') =~ 'SCALAR(0x\x\+)') -endf +endfunc function Test_perldo() sp __TEST__ @@ -82,7 +82,7 @@ function Test_perldo() 1 call assert_false(search('\Cperl')) bw! -endf +endfunc function Test_VIM_package() perl VIM::DoCommand('let l:var = "foo"') @@ -91,7 +91,7 @@ function Test_VIM_package() set noet perl VIM::SetOption('et') call assert_true(&et) -endf +endfunc function Test_stdio() redir =>l:out @@ -102,4 +102,22 @@ function Test_stdio() EOF redir END call assert_equal(['&VIM::Msg', 'STDOUT', 'STDERR'], split(l:out, "\n")) -endf +endfunc + +function 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 diff --git a/src/version.c b/src/version.c index bfb64e6dee..74e5f92359 100644 --- a/src/version.c +++ b/src/version.c @@ -748,6 +748,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1746, /**/ 1745, /**/ -- cgit v1.2.3