This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
split pp_predec() from pp_preinc() and improve
authorDavid Mitchell <davem@iabyn.com>
Sun, 25 Oct 2015 08:41:50 +0000 (08:41 +0000)
committerDavid Mitchell <davem@iabyn.com>
Tue, 10 Nov 2015 13:52:34 +0000 (13:52 +0000)
commit4c2c31284ee422eca648d182e07205f67a173227
tree75ed516c3acfcb5c67e98cf201a97d813fbf326e
parent230ee21f3e366901ce5769d324124c522df7ce8a
split pp_predec() from pp_preinc() and improve

pp_preinc() handles both ++$x and --$x (and the integer variants
pp_i_preinc/dec). Split it into two separate functions, as handling
both inc and dec in the same function requires 3 extra conditionals.

At the same time make the code more efficient.

As currently written it:
1) checked for "bad" SVs (such as read-only) and croaked;
2) checked for a IOK-only SV and directly incremented the IVX slot;
3) else called out to sv_inc() to handle the more complex cases.

This commit combines the checks in (1) and (2) into one single big
check of flags, and anything "bad" simply skips the IOK-only code
and calls sv_dec(), which can do its own checking of read-only etc
and croak if necessary. Porting/bench.pl shows the following raw numbers
for ++$x ($x lexical and holding an integer):

         before    after
       -------- --------
    Ir     77.0     56.0
    Dr     30.0     24.0
    Dw     10.0     10.0
  COND     12.0      9.0
   IND      2.0      2.0

COND_m     -0.1      0.0
 IND_m      2.0      2.0

Even having split the function into two, the combined size of the two new
functions is smaller than the single previous function.
opcode.h
pp_hot.c
pp_proto.h
regen/opcode.pl
t/perf/benchmarks