X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Magic.xs;h=9aabb411d9a158cd52f5ed0127f3fad00ab1226d;hb=4fb41bab55f1d514f1421f8fc4aae9da00f559ec;hp=0e9ff74ef9f3aac4a394392d0a54cd8497cc2330;hpb=adf120e73939cd4f80d358bbead5dd79808ae3d9;p=perl%2Fmodules%2FVariable-Magic.git diff --git a/Magic.xs b/Magic.xs index 0e9ff74..9aabb41 100644 --- a/Magic.xs +++ b/Magic.xs @@ -160,9 +160,11 @@ STATIC SV *vmg_clone(pTHX_ SV *sv, tTHX owner) { * reverted to dev-5.11 as 9cdcb38b */ #if VMG_HAS_PERL_MAINT(5, 8, 9, 28160) || VMG_HAS_PERL_MAINT(5, 9, 3, 25854) || VMG_HAS_PERL(5, 10, 0) # ifndef VMG_COMPAT_ARRAY_PUSH_NOLEN -/* This branch should only apply for perls before the official 5.11.0 release. - * Makefile.PL takes care of the higher ones. */ -# define VMG_COMPAT_ARRAY_PUSH_NOLEN 1 +# if VMG_HAS_PERL(5, 11, 0) +# define VMG_COMPAT_ARRAY_PUSH_NOLEN 0 +# else +# define VMG_COMPAT_ARRAY_PUSH_NOLEN 1 +# endif # endif # ifndef VMG_COMPAT_ARRAY_PUSH_NOLEN_VOID # define VMG_COMPAT_ARRAY_PUSH_NOLEN_VOID 1 @@ -447,6 +449,15 @@ STATIC void vmg_mgwiz_free(pTHX_ MGWIZ *w) { if (!w) return; + /* We reach this point in dirty state when ptable_free() is called from the + * atexit cleanup callback, and that the global table still holds a live + * wizard. This happens before all the SV bodies are freed, so all the wizard + * callbacks are still alive (as they are referenced by the undead wizard). + * Hence it is safe to decrement their refcount. Later on, the wizard free + * callback itself will trigger when the wizard body is reaped, but it will + * be skipped as it guards against dirty state - which is good since nothing + * has to be done anymore at that point. */ + SvREFCNT_dec(w->cb_data); SvREFCNT_dec(w->cb_get); SvREFCNT_dec(w->cb_set);