]> git.vpit.fr Git - perl/modules/Variable-Magic.git/commitdiff
Fix refcount of scalars with free callback
authorVincent Pit <vince@profvince.com>
Tue, 20 Jan 2009 22:32:44 +0000 (23:32 +0100)
committerVincent Pit <vince@profvince.com>
Tue, 20 Jan 2009 22:32:44 +0000 (23:32 +0100)
Or they'll appear as leaked for non null destruction levels.

Magic.xs

index 40997edcf1286f054f2ae457fe7f69bd1ebf9d67..c0c4297b82177cb431e9d548c2da6b3d91736b0a 100644 (file)
--- a/Magic.xs
+++ b/Magic.xs
@@ -569,6 +569,7 @@ STATIC int vmg_svt_clear(pTHX_ SV *sv, MAGIC *mg) {
 
 STATIC int vmg_svt_free(pTHX_ SV *sv, MAGIC *mg) {
  SV *wiz = (SV *) mg->mg_ptr;
+ int ret = 0;
 
  /* This may happen in global destruction */
  if (SvTYPE(wiz) == SVTYPEMASK)
@@ -586,7 +587,13 @@ STATIC int vmg_svt_free(pTHX_ SV *sv, MAGIC *mg) {
 
  /* Perl_mg_free will get rid of the magic and decrement mg->mg_obj and
   * mg->mg_ptr reference count */
- return vmg_cb_call1e(SV2MGWIZ(wiz)->cb_free, sv, mg->mg_obj);
+ ret = vmg_cb_call1e(SV2MGWIZ(wiz)->cb_free, sv, mg->mg_obj);
+
+ /* Calling SvREFCNT_dec() will trigger destructors in an infinite loop, so
+  * we have to rely on SvREFCNT() being a lvalue. Heck, even the core does it */
+ --SvREFCNT(sv);
+
+ return ret;
 }
 
 #if MGf_COPY