]> git.vpit.fr Git - perl/modules/Variable-Magic.git/blobdiff - Magic.xs
Add a couple of missing SvREFCNT_dec() after sv_magicext()
[perl/modules/Variable-Magic.git] / Magic.xs
index 61bc9e092aa5191959e39662a7c83e332528c444..4c5cd5cb5c37e60648ec0650f8db4d18b7133210 100644 (file)
--- a/Magic.xs
+++ b/Magic.xs
@@ -1375,8 +1375,8 @@ STATIC OP *vmg_pp_propagate_errsv(pTHX) {
  SVOP *o = cSVOPx(PL_op);
 
  if (o->op_sv) {
-  SvREFCNT_dec(ERRSV);
-  ERRSV    = o->op_sv;
+  sv_setsv(ERRSV, o->op_sv);
+  SvREFCNT_dec(o->op_sv);
   o->op_sv = NULL;
  }
 
@@ -1386,11 +1386,8 @@ STATIC OP *vmg_pp_propagate_errsv(pTHX) {
 #endif /* VMG_PROPAGATE_ERRSV_NEEDS_TRAMPOLINE */
 
 STATIC int vmg_propagate_errsv_free(pTHX_ SV *sv, MAGIC *mg) {
- if (mg->mg_obj) {
-  ERRSV         = mg->mg_obj;
-  mg->mg_obj    = NULL;
-  mg->mg_flags &= ~MGf_REFCOUNTED;
- }
+ if (mg->mg_obj)
+  sv_setsv(ERRSV, mg->mg_obj);
 
  return 0;
 }
@@ -1437,6 +1434,7 @@ STATIC int vmg_svt_free_cleanup(pTHX_ void *ud_) {
     SV *guard = sv_newmortal();
     sv_magicext(guard, errsv, PERL_MAGIC_ext, &vmg_propagate_errsv_vtbl,
                               NULL, 0);
+    SvREFCNT_dec(errsv);
    }
 #else /* !VMG_PROPAGATE_ERRSV_NEEDS_TRAMPOLINE */
 # if !VMG_HAS_PERL(5, 8, 9)
@@ -1444,6 +1442,7 @@ STATIC int vmg_svt_free_cleanup(pTHX_ void *ud_) {
     SV *guard = sv_newmortal();
     sv_magicext(guard, errsv, PERL_MAGIC_ext, &vmg_propagate_errsv_vtbl,
                               NULL, 0);
+    SvREFCNT_dec(errsv);
    }
 # else
    sv_magicext(ERRSV, errsv, PERL_MAGIC_ext, &vmg_propagate_errsv_vtbl,