Maintaining the Perl 5 Core: January 2017 report

No Comments

Dave Mitchell writes:

There are two main things I did in December (along with the usual
day-to-day stuff).

First I sorted out infrastructure for ops which are called in boolean

Currently PADHV and RV2HV ops are flagged specially if they are not only
used in scalar context, but where the result they return will only
ever be used as a boolean value; for example 'if (%h) {...}'

This was originally done since a hash in scalar context returned a bucket
usage ratio, which became expensive to calculate when we no longer
stored the bucket occupancy count with each hash.

In 5.25.x we've changed it so that in scalar context it now only returns a
key count, which is always known and doesn't need to be calculated on the
fly. But it can still be quicker to return just a boolean value in
these cases rather than an integer.

My work took this special-case boolean context detection code in the
peephole optimiser, and improved it so that:

 * it fixes a bunch of bugs - e.g. if (!%h) {...} wasn't recognised as
 * it expands the number of situations that are recognised as boolean
   context, such as grep:  e.g. grep %$_, @AoH;
 * it adds a reasonably comprehensive set of tests for checking that ops
   have been flagged as boolean under various boolean scenarios;
 * it allows other ops to be easily added to the boolean detection in the
   optimiser; and to the test suite.

I've also tweaked RV2HV so that in the negative case it just returns
&PL_sv_no rather than sv_2mortal(newSViv(0)))

I've also pushed a branch davem/boolref2 that allows the ref() function to
be optimised in boolean context; so 'if (ref $r) {...}' doesn't have to
generate a temporary string like "Foo=ARRAY(0xc8afd8)". I intend to merge
this after 5.26, and maybe booleanise a few more ops too (like length()).

The other notable thing I did last month was to change the output format
produced by the op_dump() function (and perl -Dx). It now displays an
ASCII-art tree structure, and more low-level information is displayed,
such as each op's address and class.

      3:21 RT #129285 Perl_gv_fullname4 assertion
      0:36 RT #130617 Perl_rpeep: Assertion ....
      0:55 RT #130621 Segfault in Perl_vwarner (util.c:2051)
      0:49 RT #130648 S_pat_upgrade_to_utf8 Assertion ...
      1:17 RT #130651] regcomp.c:6881 Assertion `expr' failed
      1:19 RT #130661 perly.c:341: Perl_yyparse: Assertion failed
      1:03 RT #130667 Perl_sv_clear Assertion `SvTYPE(sv) != ...
      0:52 RT #130669 Perl_sv_2nv_flags: Assertion `SvTYPE(sv) != ...
      5:18 [perl #130198] chop(@x =~ tr///)
      3:00 [perl #130584] Slow pos function in taint mode with \G
     22:53 [perl #78288] ref and other ops are inefficient in boolean context
     12:08 change output format of op_dump()
      3:20 factor out common optree finalisation code
      4:30 general housekeeping
     10:41 process p5p mailbox
      2:51 review security tickets
     74:53 TOTAL (HH::MM)

 172.3 weeks
2376.7 total hours
  13.8 average hours per week

There are 423 hours left on the grant

Leave a comment

About TPF

The Perl Foundation - supporting the Perl community since 2000. Find out more at

About this Entry

This page contains a single entry by Makoto Nozaki published on February 7, 2017 11:00 PM.

January 2017 Grant Votes was the previous entry in this blog.

Perl 5 Core Hackathon (p5hack) Report is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.


OpenID accepted here Learn more about OpenID
Powered by Movable Type 6.2.2