Tue, 07-Feb-2017 by Makoto Nozaki edit post
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 context. 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 boolean; * 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. SUMMARY: 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
The Perl Foundation - supporting the Perl community since 2000. Find out more at www.perlfoundation.org.