summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-04-15 21:16:11 +0200
committerBram Moolenaar <Bram@vim.org>2016-04-15 21:16:11 +0200
commit95509e18f8806046eeee27482c77666bbec515da (patch)
tree3e84cc9c20ee5e87834757e782b46b5b3ae04338 /src
parent5d98c9d93278d6961bfee59151666b8a8bcd23c3 (diff)
patch 7.4.1746v7.4.1746
Problem: Memory leak in Perl. Solution: Decrement the reference count. Add a test. (Damien)
Diffstat (limited to 'src')
-rw-r--r--src/if_perl.xs1
-rw-r--r--src/testdir/test_perl.vim28
-rw-r--r--src/version.c2
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 <SID>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
@@ -749,6 +749,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1746,
+/**/
1745,
/**/
1744,