X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/cfc1e951d98ba2b9a0e066aba9aadba4cd919eec..e71b8a62048b820e9c251e89453b297934a0f89c:/op.c diff --git a/op.c b/op.c index 3ae15cb..9539248 100644 --- a/op.c +++ b/op.c @@ -103,7 +103,14 @@ recursive, but it's recursive on basic blocks, not on tree nodes. #include "perl.h" #include "keywords.h" -#define CALL_PEEP(o) CALL_FPTR(PL_peepp)(aTHX_ o) +#define CALL_A_PEEP(peep, o) CALL_FPTR((peep)->fn)(aTHX_ o, peep) + +#define CALL_PEEP(o) \ + STMT_START { \ + peep_next_t _next_peep = { PL_peepp, NULL }; \ + CALL_A_PEEP(&_next_peep, o); \ + } STMT_END + #define CALL_OPFREEHOOK(o) if (PL_opfreehook) CALL_FPTR(PL_opfreehook)(aTHX_ o) #if defined(PL_OP_SLAB_ALLOC) @@ -5459,7 +5466,7 @@ Perl_cv_undef(pTHX_ CV *cv) LEAVE; } SvPOK_off(MUTABLE_SV(cv)); /* forget prototype */ - cvgv_set(cv, NULL); + CvGV_set(cv, NULL); pad_undef(cv); @@ -5661,7 +5668,7 @@ Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block) dVAR; GV *gv; const char *ps; - STRLEN ps_len; + STRLEN ps_len = 0; /* init it to avoid false uninit warning from icc */ register CV *cv = NULL; SV *const_sv; /* If the subroutine has no body, no attributes, and no builtin attributes @@ -5872,7 +5879,7 @@ Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block) } } if (!CvGV(cv)) { - cvgv_set(cv, gv); + CvGV_set(cv, gv); CvFILE_set_from_cop(cv, PL_curcop); CvSTASH(cv) = PL_curstash; if (PL_curstash) @@ -6236,7 +6243,7 @@ Perl_newXS(pTHX_ const char *name, XSUBADDR_t subaddr, const char *filename) } if (!name) CvANON_on(cv); - cvgv_set(cv, gv); + CvGV_set(cv, gv); (void)gv_fetchfile(filename); CvFILE(cv) = (char *)filename; /* NOTE: not copied, as it is expected to be an external constant string */ @@ -6285,7 +6292,7 @@ Perl_newFORM(pTHX_ I32 floor, OP *o, OP *block) } cv = PL_compcv; GvFORM(gv) = cv; - cvgv_set(cv, gv); + CvGV_set(cv, gv); CvFILE_set_from_cop(cv, PL_curcop); @@ -8515,11 +8522,13 @@ S_is_inplace_av(pTHX_ OP *o, OP *oright) { * peep() is called */ void -Perl_peep(pTHX_ register OP *o) +Perl_peep(pTHX_ register OP *o, peep_next_t *next_peep) { dVAR; register OP* oldop = NULL; + PERL_ARGS_ASSERT_PEEP; + if (!o || o->op_opt) return; ENTER; @@ -8714,7 +8723,7 @@ Perl_peep(pTHX_ register OP *o) sop = fop->op_sibling; while (cLOGOP->op_other->op_type == OP_NULL) cLOGOP->op_other = cLOGOP->op_other->op_next; - peep(cLOGOP->op_other); /* Recursive calls are not replaced by fptr calls */ + CALL_A_PEEP(next_peep, cLOGOP->op_other); /* Recursive calls are not replaced by fptr calls */ stitch_keys: o->op_opt = 1; @@ -8765,20 +8774,20 @@ Perl_peep(pTHX_ register OP *o) case OP_ONCE: while (cLOGOP->op_other->op_type == OP_NULL) cLOGOP->op_other = cLOGOP->op_other->op_next; - peep(cLOGOP->op_other); /* Recursive calls are not replaced by fptr calls */ + CALL_A_PEEP(next_peep, cLOGOP->op_other); /* Recursive calls are not replaced by fptr calls */ break; case OP_ENTERLOOP: case OP_ENTERITER: while (cLOOP->op_redoop->op_type == OP_NULL) cLOOP->op_redoop = cLOOP->op_redoop->op_next; - peep(cLOOP->op_redoop); + CALL_A_PEEP(next_peep, cLOOP->op_redoop); while (cLOOP->op_nextop->op_type == OP_NULL) cLOOP->op_nextop = cLOOP->op_nextop->op_next; - peep(cLOOP->op_nextop); + CALL_A_PEEP(next_peep, cLOOP->op_nextop); while (cLOOP->op_lastop->op_type == OP_NULL) cLOOP->op_lastop = cLOOP->op_lastop->op_next; - peep(cLOOP->op_lastop); + CALL_A_PEEP(next_peep, cLOOP->op_lastop); break; case OP_SUBST: @@ -8787,7 +8796,7 @@ Perl_peep(pTHX_ register OP *o) cPMOP->op_pmstashstartu.op_pmreplstart->op_type == OP_NULL) cPMOP->op_pmstashstartu.op_pmreplstart = cPMOP->op_pmstashstartu.op_pmreplstart->op_next; - peep(cPMOP->op_pmstashstartu.op_pmreplstart); + CALL_A_PEEP(next_peep, cPMOP->op_pmstashstartu.op_pmreplstart); break; case OP_EXEC: