diff options
author | Nicholas Clark <nick@ccl4.org> | 2010-04-15 11:37:53 +0100 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2010-04-15 11:37:53 +0100 |
commit | f410a2119920dd04690025a349e79575cfb9c972 (patch) | |
tree | ff2c2f6480e96613f0609b4b959385c90f78bcec /pp_ctl.c | |
parent | d1515be42a17e7bb3fa584aea980f54524603f34 (diff) | |
download | perl-f410a2119920dd04690025a349e79575cfb9c972.tar.gz |
Move PERL_ASYNC_CHECK() from the runloop to control flow OPs.
For the typical code this gives a 5% speedup, and removes the cost of "safe
signals". Tight looping code will show less gains, but should never be slower.
Subtle bugs might remain - there might be constructions that enter the runloop
(where signals used to be dispatched) but don't contain any PERL_ASYNC_CHECK()
calls themselves.
Diffstat (limited to 'pp_ctl.c')
-rw-r--r-- | pp_ctl.c | 7 |
1 files changed, 7 insertions, 0 deletions
@@ -264,6 +264,9 @@ PP(pp_substcont) register REGEXP * const rx = cx->sb_rx; SV *nsv = NULL; REGEXP *old = PM_GETRE(pm); + + PERL_ASYNC_CHECK(); + if(old != rx) { if(old) ReREFCNT_dec(old); @@ -1870,6 +1873,8 @@ PP(pp_dbstate) PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp; FREETMPS; + PERL_ASYNC_CHECK(); + if (PL_op->op_flags & OPf_SPECIAL /* breakpoint */ || SvIV(PL_DBsingle) || SvIV(PL_DBsignal) || SvIV(PL_DBtrace)) { @@ -2652,6 +2657,8 @@ PP(pp_goto) else label = cPVOP->op_pv; + PERL_ASYNC_CHECK(); + if (label && *label) { OP *gotoprobe = NULL; bool leaving_eval = FALSE; |