X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Magic.xs;h=4c5cd5cb5c37e60648ec0650f8db4d18b7133210;hb=b4686a74cf24411a7ae04fdef9b0f19a7a0234e0;hp=95d728287cd04f71a3d172713946487360b0766c;hpb=4eaf2c57794114c12c93c0c8faf9bc07b20182f7;p=perl%2Fmodules%2FVariable-Magic.git diff --git a/Magic.xs b/Magic.xs index 95d7282..4c5cd5c 100644 --- a/Magic.xs +++ b/Magic.xs @@ -285,8 +285,8 @@ STATIC I32 vmg_call_sv(pTHX_ SV *sv, I32 flags, int (*cleanup)(pTHX_ void *), vo SV *old_err = NULL; if (SvTRUE(ERRSV)) { - old_err = ERRSV; - ERRSV = newSV(0); + old_err = newSVsv(ERRSV); + sv_setsv(ERRSV, &PL_sv_undef); } cxix = (cxstack_ix < cxstack_max) ? (cxstack_ix + 1) : Perl_cxinc(aTHX); @@ -299,11 +299,8 @@ STATIC I32 vmg_call_sv(pTHX_ SV *sv, I32 flags, int (*cleanup)(pTHX_ void *), vo cxstack[cxix] = saved_cx; if (SvTRUE(ERRSV)) { - if (old_err) { - sv_setsv(old_err, ERRSV); - SvREFCNT_dec(ERRSV); - ERRSV = old_err; - } + SvREFCNT_dec(old_err); + if (IN_PERL_COMPILETIME) { if (!PL_in_eval) { if (PL_errors) @@ -326,8 +323,8 @@ STATIC I32 vmg_call_sv(pTHX_ SV *sv, I32 flags, int (*cleanup)(pTHX_ void *), vo } } else { if (old_err) { - SvREFCNT_dec(ERRSV); - ERRSV = old_err; + sv_setsv(ERRSV, old_err); + SvREFCNT_dec(old_err); } } @@ -349,6 +346,9 @@ typedef enum { OPc_PVOP, OPc_LOOP, OPc_COP, +#if VMG_HAS_PERL(5, 21, 5) + OPc_METHOP, +#endif OPc_MAX } opclass; @@ -364,7 +364,11 @@ STATIC const char *const vmg_opclassnames[] = { "B::PADOP", "B::PVOP", "B::LOOP", - "B::COP" + "B::COP", +#if VMG_HAS_PERL(5, 21, 5) + "B::METHOP", +#endif + NULL }; STATIC opclass vmg_opclass(const OP *o) { @@ -436,6 +440,10 @@ STATIC opclass vmg_opclass(const OP *o) { return OPc_BASEOP; else return OPc_PVOP; +#if VMG_HAS_PERL(5, 21, 5) + case OA_METHOP: + return OPc_METHOP; +#endif } return OPc_BASEOP; @@ -1367,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; } @@ -1378,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; } @@ -1429,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) @@ -1436,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,