diff options
author | Nicholas Clark <nick@ccl4.org> | 2007-04-07 12:15:40 +0000 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2007-04-07 12:15:40 +0000 |
commit | 20e98b0f9ccd1237d697ca82b2dc40058ff7f30b (patch) | |
tree | 807971e3b2e0b89a03097e244207533567c0728d /ext | |
parent | a6aa0b75b0eb9c04ef2df088983c48258eaa6f4f (diff) | |
download | perl-20e98b0f9ccd1237d697ca82b2dc40058ff7f30b.tar.gz |
Turn op_pmreplroot in struct pmop into a real union.
p4raw-id: //depot/perl@30865
Diffstat (limited to 'ext')
-rw-r--r-- | ext/B/B.xs | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/ext/B/B.xs b/ext/B/B.xs index 717dbf179b..c09ddc3d19 100644 --- a/ext/B/B.xs +++ b/ext/B/B.xs @@ -487,7 +487,12 @@ walkoptree(pTHX_ SV *opsv, const char *method) } } if (o && (cc_opclass(aTHX_ o) == OPc_PMOP) && o->op_type != OP_PUSHRE - && (kid = cPMOPo->op_pmreplroot)) +#if PERL_VERSION >= 9 + && (kid = cPMOPo->op_pmreplrootu.op_pmreplroot) +#else + && (kid = cPMOPo->op_pmreplroot) +#endif + ) { sv_setiv(newSVrv(opsv, cc_opclassname(aTHX_ kid)), PTR2IV(kid)); walkoptree(aTHX_ opsv, method); @@ -981,7 +986,6 @@ LISTOP_children(o) OUTPUT: RETVAL -#define PMOP_pmreplroot(o) o->op_pmreplroot #if PERL_VERSION >= 9 # define PMOP_pmreplstart(o) o->op_pmstashstartu.op_pmreplstart #else @@ -999,6 +1003,8 @@ LISTOP_children(o) MODULE = B PACKAGE = B::PMOP PREFIX = PMOP_ +#if PERL_VERSION <= 8 + void PMOP_pmreplroot(o) B::PMOP o @@ -1008,18 +1014,43 @@ PMOP_pmreplroot(o) root = o->op_pmreplroot; /* OP_PUSHRE stores an SV* instead of an OP* in op_pmreplroot */ if (o->op_type == OP_PUSHRE) { -#ifdef USE_ITHREADS +# ifdef USE_ITHREADS sv_setiv(ST(0), INT2PTR(PADOFFSET,root) ); -#else +# else sv_setiv(newSVrv(ST(0), root ? svclassnames[SvTYPE((SV*)root)] : "B::SV"), PTR2IV(root)); -#endif +# endif } else { sv_setiv(newSVrv(ST(0), cc_opclassname(aTHX_ root)), PTR2IV(root)); } +#else + +void +PMOP_pmreplroot(o) + B::PMOP o + CODE: + ST(0) = sv_newmortal(); + if (o->op_type == OP_PUSHRE) { +# ifdef USE_ITHREADS + sv_setiv(ST(0), o->op_pmreplrootu.op_pmtargetoff); +# else + GV *const target = o->op_pmreplrootu.op_pmtargetgv; + sv_setiv(newSVrv(ST(0), target ? + svclassnames[SvTYPE((SV*)target)] : "B::SV"), + PTR2IV(target)); +# endif + } + else { + OP *const root = o->op_pmreplrootu.op_pmreplroot; + sv_setiv(newSVrv(ST(0), cc_opclassname(aTHX_ root)), + PTR2IV(root)); + } + +#endif + B::OP PMOP_pmreplstart(o) B::PMOP o |