diff options
author | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2002-04-16 19:53:28 +0000 |
---|---|---|
committer | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2002-04-16 19:53:28 +0000 |
commit | f3be9b723687406602d002dae264a30089a212fe (patch) | |
tree | a08aef3035c4fad7cf95484e86f413836845059c /ext/B/B.xs | |
parent | 8d3e8850e58492e2cf837de0c4e42975e5f9ab0e (diff) | |
download | perl-f3be9b723687406602d002dae264a30089a212fe.tar.gz |
B::walkoptree bugfix (see also #15850)
p4raw-id: //depot/perl@15953
Diffstat (limited to 'ext/B/B.xs')
-rw-r--r-- | ext/B/B.xs | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/ext/B/B.xs b/ext/B/B.xs index 885a73c6d9..6392b9b2cc 100644 --- a/ext/B/B.xs +++ b/ext/B/B.xs @@ -365,7 +365,7 @@ void walkoptree(pTHX_ SV *opsv, char *method) { dSP; - OP *o; + OP *o, *kid; dMY_CXT; if (!SvROK(opsv)) @@ -383,13 +383,18 @@ walkoptree(pTHX_ SV *opsv, char *method) PUTBACK; perl_call_method(method, G_DISCARD); if (o && (o->op_flags & OPf_KIDS)) { - OP *kid; for (kid = ((UNOP*)o)->op_first; kid; kid = kid->op_sibling) { /* Use the same opsv. Rely on methods not to mess it up. */ sv_setiv(newSVrv(opsv, cc_opclassname(aTHX_ kid)), PTR2IV(kid)); walkoptree(aTHX_ opsv, method); } } + if (o && (cc_opclass(aTHX_ o) == OPc_PMOP) + && (kid = cPMOPo->op_pmreplroot)) + { + sv_setiv(newSVrv(opsv, opclassnames[OPc_PMOP]), PTR2IV(kid)); + walkoptree(aTHX_ opsv, method); + } } typedef OP *B__OP; |