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 */