#endif
: Used in op.c
pd |void |pad_swipe |PADOFFSET po|bool refadjust
-: FIXME
+: peephole optimiser
p |void |peep |NULLOK OP* o
+p |void |rpeep |NULLOK OP* o
: Defined in doio.c, used only in pp_hot.c
dopM |PerlIO*|start_glob |NN SV *tmpglob|NN IO *io
#if defined(USE_REENTRANT_API)
#ifdef PERL_CORE
#define pad_swipe Perl_pad_swipe
#define peep Perl_peep
+#define rpeep Perl_rpeep
#endif
#if defined(USE_REENTRANT_API)
#define reentrant_size Perl_reentrant_size
#ifdef PERL_CORE
#define pad_swipe(a,b) Perl_pad_swipe(aTHX_ a,b)
#define peep(a) Perl_peep(aTHX_ a)
+#define rpeep(a) Perl_rpeep(aTHX_ a)
#endif
#if defined(USE_REENTRANT_API)
#define reentrant_size() Perl_reentrant_size(aTHX)
#define PL_replgv (vTHX->Ireplgv)
#define PL_restartjmpenv (vTHX->Irestartjmpenv)
#define PL_restartop (vTHX->Irestartop)
+#define PL_rpeepp (vTHX->Irpeepp)
#define PL_rs (vTHX->Irs)
#define PL_runops (vTHX->Irunops)
#define PL_savebegin (vTHX->Isavebegin)
#define PL_Ireplgv PL_replgv
#define PL_Irestartjmpenv PL_restartjmpenv
#define PL_Irestartop PL_restartop
+#define PL_Irpeepp PL_rpeepp
#define PL_Irs PL_rs
#define PL_Irunops PL_runops
#define PL_Isavebegin PL_savebegin
PERLVARA(Icolors,6, char *) /* from regcomp.c */
PERLVARI(Ipeepp, peep_t, MEMBER_TO_FPTR(Perl_peep))
- /* Pointer to peephole optimizer */
+ /* Pointer to per-sub peephole optimizer */
+PERLVARI(Irpeepp, peep_t, MEMBER_TO_FPTR(Perl_rpeep))
+ /* Pointer to recursive peephole optimizer */
/*
=for apidoc Amn|Perl_ophook_t|PL_opfreehook
#include "keywords.h"
#define CALL_PEEP(o) PL_peepp(aTHX_ o)
+#define CALL_RPEEP(o) PL_rpeepp(aTHX_ o)
#define CALL_OPFREEHOOK(o) if (PL_opfreehook) PL_opfreehook(aTHX_ o)
#if defined(PL_OP_SLAB_ALLOC)
o->op_ppaddr = PL_ppaddr[OP_RV2AV];
o->op_flags &= ~OPf_REF; /* treat \(1..2) like an ordinary list */
o->op_flags |= OPf_PARENS; /* and flatten \(1..2,3) */
- o->op_opt = 0; /* needs to be revisited in peep() */
+ o->op_opt = 0; /* needs to be revisited in rpeep() */
curop = ((UNOP*)o)->op_first;
((UNOP*)o)->op_first = newSVOP(OP_CONST, 0, SvREFCNT_inc_NN(*PL_stack_sp--));
#ifdef PERL_MAD
* peep() is called */
void
-Perl_peep(pTHX_ register OP *o)
+Perl_rpeep(pTHX_ register OP *o)
{
dVAR;
register OP* oldop = NULL;
PL_curcop = ((COP*)o);
}
/* XXX: We avoid setting op_seq here to prevent later calls
- to peep() from mistakenly concluding that optimisation
+ to rpeep() from mistakenly concluding that optimisation
has already occurred. This doesn't fix the real problem,
though (See 20010220.007). AMS 20010719 */
/* op_seq functionality is now replaced by op_opt */
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_RPEEP(cLOGOP->op_other);
stitch_keys:
o->op_opt = 1;
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_RPEEP(cLOGOP->op_other);
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_RPEEP(cLOOP->op_redoop);
while (cLOOP->op_nextop->op_type == OP_NULL)
cLOOP->op_nextop = cLOOP->op_nextop->op_next;
- peep(cLOOP->op_nextop);
+ CALL_RPEEP(cLOOP->op_nextop);
while (cLOOP->op_lastop->op_type == OP_NULL)
cLOOP->op_lastop = cLOOP->op_lastop->op_next;
- peep(cLOOP->op_lastop);
+ CALL_RPEEP(cLOOP->op_lastop);
break;
case OP_SUBST:
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_RPEEP(cPMOP->op_pmstashstartu.op_pmreplstart);
break;
case OP_EXEC:
LEAVE;
}
+void
+Perl_peep(pTHX_ register OP *o)
+{
+ CALL_RPEEP(o);
+}
+
const char*
Perl_custom_op_name(pTHX_ const OP* o)
{
#define PL_restartjmpenv (*Perl_Irestartjmpenv_ptr(aTHX))
#undef PL_restartop
#define PL_restartop (*Perl_Irestartop_ptr(aTHX))
+#undef PL_rpeepp
+#define PL_rpeepp (*Perl_Irpeepp_ptr(aTHX))
#undef PL_rs
#define PL_rs (*Perl_Irs_ptr(aTHX))
#undef PL_runops
#endif
PERL_CALLCONV void Perl_pad_swipe(pTHX_ PADOFFSET po, bool refadjust);
PERL_CALLCONV void Perl_peep(pTHX_ OP* o);
+PERL_CALLCONV void Perl_rpeep(pTHX_ OP* o);
PERL_CALLCONV PerlIO* Perl_start_glob(pTHX_ SV *tmpglob, IO *io)
__attribute__nonnull__(pTHX_1)
__attribute__nonnull__(pTHX_2);
/* Pluggable optimizer */
PL_peepp = proto_perl->Ipeepp;
+ PL_rpeepp = proto_perl->Irpeepp;
/* op_free() hook */
PL_opfreehook = proto_perl->Iopfreehook;