Mercurial > vim
diff src/if_perl.xs @ 14441:2d6703d4448a v8.1.0234
patch 8.1.0234: incorrect reference counting in Perl interface
commit https://github.com/vim/vim/commit/41c363a3154dd1caeb431fa54748ad48ef6d3bd1
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Aug 2 21:46:51 2018 +0200
patch 8.1.0234: incorrect reference counting in Perl interface
Problem: Incorrect reference counting in Perl interface.
Solution: Call SvREFCNT_inc more often, add a test. (Damien)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 02 Aug 2018 22:00:06 +0200 |
parents | c15bef307de6 |
children | d823dfb273c6 |
line wrap: on
line diff
--- a/src/if_perl.xs +++ b/src/if_perl.xs @@ -831,8 +831,7 @@ newWINrv(SV *rv, win_T *ptr) ptr->w_perl_private = newSV(0); sv_setiv(ptr->w_perl_private, PTR2IV(ptr)); } - else - SvREFCNT_inc_void_NN(ptr->w_perl_private); + SvREFCNT_inc_void_NN(ptr->w_perl_private); SvRV(rv) = ptr->w_perl_private; SvROK_on(rv); return sv_bless(rv, gv_stashpv("VIWIN", TRUE)); @@ -847,8 +846,7 @@ newBUFrv(SV *rv, buf_T *ptr) ptr->b_perl_private = newSV(0); sv_setiv(ptr->b_perl_private, PTR2IV(ptr)); } - else - SvREFCNT_inc_void_NN(ptr->b_perl_private); + SvREFCNT_inc_void_NN(ptr->b_perl_private); SvRV(rv) = ptr->b_perl_private; SvROK_on(rv); return sv_bless(rv, gv_stashpv("VIBUF", TRUE)); @@ -918,12 +916,13 @@ I32 cur_val(IV iv, SV *sv) 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. + if (SvRV(sv) != SvRV(rv)) + // XXX: This magic variable is a bit confusing... + // Is curently refcounted ? sv_setsv(sv, rv); + SvREFCNT_dec(rv); + return 0; } #endif /* !PROTO */