X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/9f39b4f19b0088633249b846695908092673b0e0..1ef17b7294e4839ff6f8051fb15eaa566aed4dd1:/pp.h diff --git a/pp.h b/pp.h index d6d70d5..4e663ba 100644 --- a/pp.h +++ b/pp.h @@ -425,10 +425,8 @@ Does not use C. See also C, C and C. return NORMAL; \ } STMT_END -#define AMG_CALLun_var(sv,meth_enum) amagic_call(sv,&PL_sv_undef, \ - meth_enum,AMGf_noright | AMGf_unary) -#define AMG_CALLun(sv,meth) AMG_CALLun_var(sv,CAT2(meth,_amg)) - +#define AMG_CALLun(sv,meth) \ + amagic_call(sv,&PL_sv_undef, CAT2(meth,_amg), AMGf_noright | AMGf_unary) #define tryAMAGICunTARGET(meth, shift) \ STMT_START { \ @@ -440,7 +438,8 @@ Does not use C. See also C, C and C. SV *tmpsv; \ SV *arg= sp[shift]; \ if (SvAMAGIC(arg) && \ - (tmpsv=AMG_CALLun_var(arg,CAT2(meth,_amg)))) { \ + (tmpsv = amagic_call(arg, &PL_sv_undef, CAT2(meth,_amg), \ + AMGf_noright | AMGf_unary))) { \ SPAGAIN; \ sp += shift; \ sv_setsv(TARG, tmpsv); \ @@ -450,26 +449,14 @@ Does not use C. See also C, C and C. } \ } STMT_END -#define tryAMAGICunDEREF_var(meth_enum) \ +/* This is no longer used anywhere in the core. You might wish to consider + calling amagic_deref_call() directly, as it has a cleaner interface. */ +#define tryAMAGICunDEREF(meth) \ STMT_START { \ - SV *tmpsv; \ - SV *arg = *sp; \ - am_again: \ - if (SvAMAGIC(arg) && \ - (tmpsv=AMG_CALLun_var(arg,(meth_enum)))) { \ - SPAGAIN; \ - sv = tmpsv; \ - if (!SvROK(tmpsv)) \ - Perl_croak(aTHX_ "Overloaded dereference did not return a reference"); \ - if (tmpsv != arg && SvRV(tmpsv) != SvRV(arg)) { \ - arg = tmpsv; \ - goto am_again; \ - } \ - } \ + sv = amagic_deref_call(*sp, CAT2(meth,_amg)); \ + SPAGAIN; \ } STMT_END -#define tryAMAGICunDEREF(meth) tryAMAGICunDEREF_var(CAT2(meth,_amg)) - #define opASSIGN (PL_op->op_flags & OPf_STACKED) #define SETsv(sv) STMT_START { \ @@ -482,18 +469,6 @@ Does not use C. See also C, C and C. { sv_setsv(TARG, (sv)); SETTARG; } \ else SETs(sv); } STMT_END -/* newSVsv does not behave as advertised, so we copy missing - * information by hand */ - -/* SV* ref causes confusion with the member variable - changed SV* ref to SV* tmpRef */ -#define RvDEEPCP(rv) STMT_START { SV* tmpRef=SvRV(rv); SV* rv_copy; \ - if (SvREFCNT(tmpRef)>1 && (rv_copy = AMG_CALLun(rv,copy))) { \ - SvRV_set(rv, rv_copy); \ - SvSETMAGIC(rv); \ - SvREFCNT_dec(tmpRef); \ - } } STMT_END - /* =for apidoc mU||LVRET True if this op will be the return value of an lvalue subroutine