9 months agoUpdate perlhist for 5.19.10 v5.19.10
Aaron Crane [Thu, 20 Mar 2014 18:07:06 +0000]
Update perlhist for 5.19.10

9 months agoFinalise perldelta for 5.19.10
Aaron Crane [Thu, 20 Mar 2014 18:01:33 +0000]
Finalise perldelta for 5.19.10

9 months agoUpdate Module::CoreList for 5.19.10
Aaron Crane [Thu, 20 Mar 2014 16:36:48 +0000]
Update Module::CoreList for 5.19.10

9 months agoPorting/corelist-perldelta.pl: fix bug with 5.*.10 releases
Aaron Crane [Thu, 20 Mar 2014 17:13:56 +0000]
Porting/corelist-perldelta.pl: fix bug with 5.*.10 releases

The two aliases of the new Perl version (in this case, "5.01901" and
"5.019010") were being selected as the two versions to compare.
Unsurprisingly, those two versions have the same modules, so the
generated summary of changes was empty.

9 months agoPorting/corelist-perldelta.pl: fix minor POD error
Aaron Crane [Thu, 20 Mar 2014 17:13:39 +0000]
Porting/corelist-perldelta.pl: fix minor POD error

9 months agoPorting/corelist-perldelta.pl: fix typo in error message
Aaron Crane [Thu, 20 Mar 2014 17:12:57 +0000]
Porting/corelist-perldelta.pl: fix typo in error message

9 months agoUpgrade Devel::PPPort from 3.21 to 3.22
Aaron Crane [Thu, 20 Mar 2014 15:54:11 +0000]
Upgrade Devel::PPPort from 3.21 to 3.22

  [DELTA]

    * Add support for the following API
        SvREFCNT_dec_NN
        mg_findext
        sv_unmagicext
    * Update META
        Move bug tracker to github
        Provide link to repository

9 months agoUpdate perldelta for recent core changes
Aaron Crane [Thu, 20 Mar 2014 13:32:16 +0000]
Update perldelta for recent core changes

9 months agoExtUtils-Install-1.63 has been released to CPAN
Aaron Crane [Thu, 20 Mar 2014 15:31:34 +0000]
ExtUtils-Install-1.63 has been released to CPAN

9 months agoThe linux hints file should only look for -lgdbm_compat if -lgdbm is wanted.
Nicholas Clark [Wed, 19 Mar 2014 10:30:07 +0000]
The linux hints file should only look for -lgdbm_compat if -lgdbm is wanted.

Previously they would unconditionally add gdbm_compat to the list of wanted
libraries. This is unhelpful if the user has passed Configure arguments to
constrain the library search to avoid libgdbm.so, because Configure would
still end up finding libgdbm_compat.so, which at best is not useful without
libgdbm.so, and at worse could have the same problems that caused the
user to avoid libgdbm.so (eg not compatible with the current compiler flags)

9 months agosync-with-cpan: allow digits after -TRIAL
Ricardo Signes [Thu, 20 Mar 2014 14:00:56 +0000]
sync-with-cpan: allow digits after -TRIAL

9 months agohv.h: tweak comment about HvAUX preallocation for large hashes
Aaron Crane [Thu, 20 Mar 2014 12:39:20 +0000]
hv.h: tweak comment about HvAUX preallocation for large hashes

9 months agoUpgrade CPAN from 2.03-TRIAL to 2.04-TRIAL
Aaron Crane [Wed, 19 Mar 2014 16:15:21 +0000]
Upgrade CPAN from 2.03-TRIAL to 2.04-TRIAL

  [DELTA]

    2014-03-18  Andreas Koenig  <k@UX31A>

    * release 2.04-TRIAL

    * history of master branch was rewritten after Tour de France bughunting
    (Lyon #QA2014); apologies to all repository followers: the real history,
    as it actually went, is not worth being recorded in the master branch.

    * address #91706 and #86915: the 'force install' bug and the endless
    loop bugs reported in the two tickets are fixed (joined forces)

    * new configure option 'use_prompt_default' (David Golden)

    * add new dummy distros OptionalPrereq and CircularPrereq for testing
    recommends/suggests support

    * experimental recommends/suggests support (David Golden, Andreas Koenig)

    * enable hiding of directories in the distroprefs tree (suggested by
    Slaven Rezić)

9 months ago[MERGE] audit anchoring in re_intuit_start()
David Mitchell [Wed, 19 Mar 2014 19:28:47 +0000]
[MERGE] audit anchoring in re_intuit_start()

This series of commits audits all the code in re_intuit_start()
that handles anchoring, e.g. /^.../, /^.../m, /\G.../.

It fixes a couple of potential performance issues, and makes the code a
lot safer with with \G. (Until recently, intuit was skipped altogether
under \G, so its \G handling isn't well developed and tested.)

9 months agore_intuit_start(): move comments abut IMPLICIT
David Mitchell [Wed, 19 Mar 2014 18:05:24 +0000]
re_intuit_start(): move comments abut IMPLICIT

After the previous reworking of the PREGf_IMPLICIT tests, move commentary
about PREGf_IMPLICIT closer to where its now relevant.

9 months agore_intuit_start(): don't unset MBOL on uselessness
David Mitchell [Wed, 19 Mar 2014 17:37:20 +0000]
re_intuit_start(): don't unset MBOL on uselessness

When BmUSEFUL() for a pattern goes negative, we unset ~RXf_USE_INTUIT.

A bug fix in 2010 (c941595168) made this part of the code also remove
the RXf_ANCH_MBOL at the same time, if PREGf_IMPLICIT was set.

However, this was really just working round a bug in regexec_flags().
Once intuit was disabled, regexec_flags() would then start taking the
buggy code path.

This buggy code path was separately fixed in 2012 by 21eede782, so there's
no longer any need to remove this flag. So don't.

9 months agore_intuit_start(): change definition of ml_anch
David Mitchell [Wed, 19 Mar 2014 16:44:25 +0000]
re_intuit_start(): change definition of ml_anch

The ml_anch variable is supposed to indicate that a multi-line match is
possible, i.e. that the regex is anchored to a \n.

Currently we just do

    ml_anch = (prog->intflags & PREGf_ANCH_MBOL);

However, MBOL is also set on /.*..../; the two cases are distinguished by
adding the PREGf_IMPLICIT flag too.

So at the moment we have lots of tests along the lines of

    if (ml_anch && !(prog->intflags & PREGf_IMPLICIT))

Simplify this by adding the IMPLICIT condition when initially calculating
ml_anch, so there's no need to keep testing for it later. This also means
that ml_anch actually means what it says now.

9 months agore_intuit_start(): check for IMPLICIT in abs anch
David Mitchell [Wed, 19 Mar 2014 16:34:28 +0000]
re_intuit_start(): check for IMPLICIT in abs anch

The block of code that deals with absolute anchors looks like:

    if (...) {
        if (.... && !PREGf_IMPLICIT) ...;
        if (FOO) {
            assert(!PREGf_IMPLICIT);
            ....
        }
    }

where the constraints of FOO imply PREGf_IMPLICIT, as shown by the
assertion. Simplify this to:

    if (... && !PREGf_IMPLICIT) {
        if (....) ...;
        if (FOO) {
            ....
        }
    }

9 months agore_intuit_start(): check for IMPLICIT in stclass
David Mitchell [Wed, 19 Mar 2014 14:58:19 +0000]
re_intuit_start(): check for IMPLICIT in stclass

In the stclass block of code, there are various checks for anchored-ness.
Add !(prog->intflags & PREGf_IMPLICIT) to these conditions, since
from the perspective of these tests, we can only quit early etc if these
are real rather than fake anchors.

As it happens, this currently makes no logical difference, since an
PREGf_IMPLICIT pattern starts with .*, and so more or less by definition
can't have an stclass.

So this commit is really only for logical completeness, and to allow us to
change the definition of ml_anch shortly.

9 months agore_intuit_start(): use better limit on anch float
David Mitchell [Tue, 18 Mar 2014 23:36:20 +0000]
re_intuit_start(): use better limit on anch float

The 'check' block of code has special handling for if the pattern is
anchored; in this case, it allows us to set an upper bound on where a
floating substring might match; e.g. in

    /^..\d?abc/

the floating string can't be more than 3 chars from the absolute beginning
of the string. Similarly with /..\G\d?abc/, it can't be more than 3 chars
from the start position (assuming that position been calculated correctly
by the caller).

However, the current code used rx_origin as the base for the offset
calculation, rather than strbeg/strpos as appropriate. This meant that

a) the first time round the loop, if strpos > strbeg, then the upper bound
would be set higher than needed;
b) if we ever go back to restart: with an incremented rx_origin, then the
upper limit is recalculated with more wasted slack at the latter end.

This commit changes the limit calculation, which reduces the following
from second to milliseconds:

    $s = "abcdefg" x 1_000_000;
    $s =~ /^XX\d{1,10}cde/ for 1..100;

It also adds a quick test to skip hopping when the result is likely to
leave end_point unchanged, and adds an explicit test for !PREGf_IMPLICIT.
This latter test isn't strictly necessary, as if PREGf_IMPLICIT were set,
it implies that the pattern starts with '.*', which implies that
prog->check_offset_max == SSize_t_MAX, which is already tested for.
However, it makes the overall condition more comprehensible, and makes it
more robust in the face of future changes.

9 months agore_intuit_start(): do 'not at start' check on BOL
David Mitchell [Tue, 18 Mar 2014 21:32:39 +0000]
re_intuit_start(): do 'not at start' check on BOL

The quick reject test that says "if a pattern has an absolute anchor,
then immediately reject if strpos != strbeg", currently skips that test
if PREGf_ANCH_GPOS is present. Instead, skip unless BOL or SBOL is present.

This means that something like /^abc\G/ will still do the quick reject
test.

I can't think of any example that will actually give a measurable
performance boost, and this is a fairly unlikely scenario, but the code is
more logical this way, and makes it more robust against future changes
(it's less likely to suddenly skip the quick test where it used to do it).

I've also updated the commentary on why we don't do a quick /\G/ test
akin to the /^/ test, and added some more info about why we test for the
PREGf_IMPLICIT flag.

And I've added an assert about PREGf_IMPLICIT too.

9 months agore_intuit_start(): reduce scope of /^...$/m test
David Mitchell [Tue, 18 Mar 2014 20:15:27 +0000]
re_intuit_start(): reduce scope of /^...$/m test

Intuit has a quick reject test for a fixed pattern that is anchored at
both ends. For example, with the pattern /^abcd$/, only the exact strings
"abcd" or "abcd\n" will match; anything else, and the match immediately
fails.

A fix for [perl #115242] correctly made intuit skip the test in the
presence of //m, since in this case the $ doesn't necessarily correspond
to the end of the string.

However, the fix was too wide in scope; it caused //m patterns to skip
searching for a known string anchored just at the start, as well as one
anchored at both ends.

With this commit, the following code now runs in a few milliseconds rather
than a few seconds on my machine:

    $s = "abcdefg" x 1_000_000;
    $s =~ /(?-m:^)abcX?fg/m for 1..100;

9 months agore_intuit_start(): change !ml_anch debugging msg
David Mitchell [Tue, 18 Mar 2014 16:10:59 +0000]
re_intuit_start(): change !ml_anch debugging msg

When MBOL (/^.../m) matching is skipped, the debugging output looks like:

    Starting position does not contradict /^/m...

which sounds a bit like the \n test *was* done and passed, rather than
the test being skipped. Change the message to:

    (multiline anchor test skipped)

9 months agore_intuit_start(): don't set ml_anch on BOL
David Mitchell [Tue, 18 Mar 2014 15:26:00 +0000]
re_intuit_start(): don't set ml_anch on BOL

re_intuit_start() decided that a pattern was capable of being anchored
after *any* \n in the string for a //m pattern that contains a BOL
(rather than an MBOL). This can happen by embedding one regex in another
for example.

This is an incorrect assumption, and means that intuit() might try
against every \n position in the string rather than just trying at the
beginning. With this commit, the following code on my machine reduces in
execution time from 7000ms to 5ms:

    my $r = qr/^abcd/;
    my $s = "abcd-xyz\n" x 500_000;
    $s =~ /$r\d{1,2}xyz/m for 1..200;

9 months agoPorting/sync-with-cpan: allow "-TRIAL" version numbers
Aaron Crane [Wed, 19 Mar 2014 16:56:09 +0000]
Porting/sync-with-cpan: allow "-TRIAL" version numbers

9 months agoMerge the refactoring of Perl_do_openn() to blead.
Nicholas Clark [Wed, 19 Mar 2014 10:03:04 +0000]
Merge the refactoring of Perl_do_openn() to blead.

This makes Perl_do_openn() a wrapper around two functions Perl_do_open_raw()
and Perl_do_open6(), which provide sysopen and open functionality.
In turn, shared setup and cleanup code from these two is moved to two static
functions S_openn_setup() and S_openn_cleanup().

For now both functions are not part of the public API, as they may change,
and offer no functionality that isn't already accessible via Perl_do_openn().

These changes make it easi*er* to follow the twisted logic of open.

9 months agoIn Perl_nextargv(), move variable declarations into the blocks that use them.
Nicholas Clark [Sun, 2 Mar 2014 09:12:08 +0000]
In Perl_nextargv(), move variable declarations into the blocks that use them.

This makes it clearer that variables don't hold values between iterations of
the loop, and permits the variable sv to be made const.

9 months agoSimplify the code in Perl_nextargv().
Nicholas Clark [Sun, 2 Mar 2014 09:02:51 +0000]
Simplify the code in Perl_nextargv().

Split the ternary that called Perl_do_open_raw() and Perl_do_open6() based
on PL_inplace into two different if blocks, and merge these with the following
code which is also conditional on PL_inplace.

Remove the warning code from an else block and re-indent it, to make it clear
that it is always called if control reaches the end of the while loop.

9 months agoChange core uses of Perl_do_openn() to Perl_do_open6() or Perl_do_open_raw().
Nicholas Clark [Sun, 2 Mar 2014 08:50:38 +0000]
Change core uses of Perl_do_openn() to Perl_do_open6() or Perl_do_open_raw().

Calls to Perl_do_openn() all have at least 2 unused arguments which clutter
the code and hinder easy understanding. Perl_do_open6() and
Perl_do_open_raw() each only do one job, so don't have the dead arguments.

9 months agoSplit Perl_do_openn() into Perl_do_open_raw() and Perl_do_open6().
Nicholas Clark [Sun, 2 Mar 2014 08:26:29 +0000]
Split Perl_do_openn() into Perl_do_open_raw() and Perl_do_open6().

Perl_do_open_raw() handles the as_raw part of Perl_do_openn().
Perl_do_open6() handles the !as_raw part of Perl_do_openn().
do_open6() isn't a great name, but I can't see an obvious concise name that
covers 2 arg open, 3 arg open, piped open, implicit fork, and layers.

9 months agoExtract the cleanup code of Perl_do_openn() into S_openn_cleanup().
Nicholas Clark [Sun, 2 Mar 2014 07:14:13 +0000]
Extract the cleanup code of Perl_do_openn() into S_openn_cleanup().

A 12 parameter function is extremely ugly (as demonstrated by the need to add
macros for it to perl.h), but it's private, and it will permit the two-headed
public interface of Perl_do_openn() to be simplified.

9 months agoExtract the setup code of Perl_do_openn() into S_openn_setup().
Nicholas Clark [Sun, 2 Mar 2014 06:38:00 +0000]
Extract the setup code of Perl_do_openn() into S_openn_setup().

9 months agoIn Perl_do_openn(), disambiguate the two separate uses of the variable fd.
Nicholas Clark [Sat, 1 Mar 2014 21:53:52 +0000]
In Perl_do_openn(), disambiguate the two separate uses of the variable fd.

Rename the first uses of the variable fd to wanted_fd to show that the
variable is not used to pass a value to later in the function.

9 months agoIn Perl_do_openn(), move the variable result into the block that uses it.
Nicholas Clark [Sat, 1 Mar 2014 21:38:18 +0000]
In Perl_do_openn(), move the variable result into the block that uses it.

This also removes a couple of places which would set result = 0 to simulate
"success" for an a later if block. Those paths now don't even reach that
if block.

9 months agoPerl_do_openn() doesn't need to set num_svs and svp.
Nicholas Clark [Sat, 1 Mar 2014 20:32:19 +0000]
Perl_do_openn() doesn't need to set num_svs and svp.

These variables are no longer used later in the function, so no need to set
them. This permits the declaration of the variable namesv to be moved from
the top of the function into the blocks that use it.

9 months agoPerl_do_openn() should call PerlIO_openn() with arg NULL if narg is 0.
Nicholas Clark [Sat, 1 Mar 2014 20:10:38 +0000]
Perl_do_openn() should call PerlIO_openn() with arg NULL if narg is 0.

If narg is NULL, then PerlIO_openn() doesn't look at args.

(Technically except for PerlIOStdio_open() if f is non-NULL, which doesn't
check narg and assumes that args[0] is valid. That lack of check is probably
a bug. But it doesn't matter in this case, as f is NULL)

This makes it clear that arg isn't needed at this point in Perl_do_openn().

This is a more complete version of the change made by commit dd37d22f759197ae
(March 2002), which just changed the call to pass 0 for narg.

9 months agoIn Perl_do_openn(), move {in,out}_{raw,crlf} into the !as_raw block.
Nicholas Clark [Sat, 1 Mar 2014 21:00:29 +0000]
In Perl_do_openn(), move {in,out}_{raw,crlf} into the !as_raw block.

These 4 variables are only needed there, so by moving them into the block we
save doing unneeded work for the as_raw case (ie sysopen), and as a side
effect make the function a bit clearer.

9 months agoTests that warnings are emitted if in-place edit fails to open a pathname.
Nicholas Clark [Sun, 2 Mar 2014 14:36:52 +0000]
Tests that warnings are emitted if in-place edit fails to open a pathname.

These have the same text as other warnings which are tested. However the
existing tests only covered the code path where a directory was able to be
opened (read only) and then caught by an explicit stat test for non-files.

9 months agoFix minor inaccuracy in the release manager's guide
Aaron Crane [Tue, 18 Mar 2014 18:51:54 +0000]
Fix minor inaccuracy in the release manager's guide

9 months agoUpgrade Digest-SHA from 5.87 to 5.88
Aaron Crane [Tue, 18 Mar 2014 18:50:38 +0000]
Upgrade Digest-SHA from 5.87 to 5.88

  [DELTA]

        - added OUTPUT clause in SHA.xs to silence compiler warning
                -- ref. shaclose()
        - changed text file test (-T) to act on filehandles
                -- ref. addfile portable mode
                -- improves consistency when reading from STDIN
                -- still acts on filenames for early Perls (< 5.6)
        - added -M and -V options to shasum
                -- undocumented: for development and testing use only

9 months agoPorting/todo.pod: Use F<> instead of C<>
Karl Williamson [Tue, 18 Mar 2014 18:45:49 +0000]
Porting/todo.pod: Use F<> instead of C<>

A file path is supposed to be enclosed in F<>

9 months agomktables: In-line defns for tables up to 3 ranges
Karl Williamson [Tue, 18 Mar 2014 18:17:16 +0000]
mktables: In-line defns for tables up to 3 ranges

eb0925341cc65ce6ce57503ec0ab97cdad39dc98 caused the definitions for
about 45% of the Unicode tables to be placed in-line in Heavy.pl instead
of them having to be read-in from disk.  This new commit extends that so
that about 55% are in-lined, by in-lining tables which consist of up to
3 ranges.

This is a no-brainer to do, as the memory usage does not increase by
doing it, and disk accesses go down.  I used the delta in the disk size
of Heavy.pl as a proxy for the delta in the memory size that it uses,
as what this commit does is to change various scalar strings in it.
Doing this measurement indicates that this commit results in a slightly
smaller Heavy.pl than what was there before eb092534.  The amounts will
vary between Unicode releases.  I also checked for Unicode beta 7.0, and
the sizes are again comparable, with a slightly larger Heavy.pl for the
3-range version there.

For 4-, 5-, ... range tables, doing this results in slowly increasing
Heavy.pl size (and hence more and more memory use), and that is
something we may wish to look at in the future, trading memory for fewer
files and less disk start-up cost.  But for the imminent v5.20, doing it
for 3-range tables doesn't cost us anything, and gains us fewer disk
files and accesses.

9 months agomktables: Remove obsolete sort constraint
Karl Williamson [Tue, 18 Mar 2014 18:10:46 +0000]
mktables: Remove obsolete sort constraint

Zero-length tables are no longer expressed in terms of the Perl 'All'
property, so the sort no longer has to make sure the latter is processed
before the former.

9 months agomktables: Add comments, reorder a gen'd file
Karl Williamson [Tue, 18 Mar 2014 18:09:25 +0000]
mktables: Add comments, reorder a gen'd file

This adds some clarifying comments, and reorders Heavy.pl so the array
referred to by two hashes occurs before both hashes in the output.

9 months agomktables: White-space only
Karl Williamson [Tue, 18 Mar 2014 18:07:55 +0000]
mktables: White-space only

This indents code to conform to the new block created in the previous
commit

9 months agoutf8_heavy.pl: Change data structure for in-lined definitions
Karl Williamson [Tue, 18 Mar 2014 17:43:59 +0000]
utf8_heavy.pl: Change data structure for in-lined definitions

This commit puts the in-lined definitions introduced by
eb0925341cc65ce6ce57503ec0ab97cdad39dc98 into a separate array,
where each element is a unique definition.  This can result in slightly
smaller current memory usage in utf8_heavy.pl, as the strings giving the
file names now only appear once, and what replaces them in the hash
values are strings of digits indices, which are shorter.

But doing this allows us in a later commit to increase the number of
ranges in the tables that get in-lined, without increasing memory usage.

This commit also changes the code that generates the definitions to be
more general, so that it becomes trivial to change things to generate
in-line definitions for tables with more than one range.

9 months agomktables: Fix overlooked in-line table defns code
Karl Williamson [Tue, 18 Mar 2014 16:39:53 +0000]
mktables: Fix overlooked in-line table defns code

Commit eb0925341cc65ce6ce57503ec0ab97cdad39dc98 introduced the idea of a
pseudo-directory as a way to store table definitions in-line in
Heavy.pl, but conform to the expectations of the code in regard to
objects being files within directories.  This kept the needed changes to
a minimum.  The code changed by the current commit  was overlooked then
as something that also needed to change, because there are no current
instances of it needing to.  But this could change with future Unicode
versions, or as in the next few commits, in extending the in-line
definitions.

9 months agoAdd support for test.valgrind parallel testing
Matthew Horsfall (via RT) [Thu, 13 Mar 2014 12:39:48 +0000]
Add support for test.valgrind parallel testing

# New Ticket Created by  Matthew Horsfall
# Please include the string:  [perl #121431]
# in the subject line of all future correspondence about this issue.
# <URL: https://rt.perl.org/Ticket/Display.html?id=121431 >

This is a bug report for perl from wolfsage@gmail.com,
generated with the help of perlbug 1.39 running under perl 5.14.2.

-----------------------------------------------------------------
[Please describe your issue here]

The included patch allows test.valgrind to run tests in parallel.

Valgrind output for each test will be printed out after the test
completes, with the name of the test prefixing every line.

Example usage might be:

  TEST_JOBS=8 make test.valgrind VALGRIND='valgrind -q' 2>&1 | tee out.txt

-q is needed to ensure only *errors* are captured, otherwise the output will
be much louder than it already is. (Perhaps this should be the default mode?)

[Please do not change anything below this line]
-----------------------------------------------------------------

9 months agoMerge perllexwarn.pod into warnings.pm
Ricardo Signes [Tue, 18 Mar 2014 17:29:54 +0000]
Merge perllexwarn.pod into warnings.pm

9 months agoregenerate warnings.pm
Ricardo Signes [Tue, 18 Mar 2014 17:29:42 +0000]
regenerate warnings.pm

9 months agodo not podcheck regen/warnings.pl
Ricardo Signes [Tue, 18 Mar 2014 17:24:50 +0000]
do not podcheck regen/warnings.pl

9 months agowarnings.pm: improve awkward sentence in pod
Ricardo Signes [Tue, 18 Mar 2014 17:16:08 +0000]
warnings.pm: improve awkward sentence in pod

9 months agobump the version of warnings.pm
Ricardo Signes [Fri, 14 Mar 2014 08:28:38 +0000]
bump the version of warnings.pm

(and of regen/warnings.pl)

9 months agoreplace links to perllexwarn with links to warnings
Ricardo Signes [Fri, 14 Mar 2014 08:15:36 +0000]
replace links to perllexwarn with links to warnings

or, sometimes, simply remove them

9 months agoremove references to perllexwarn from warnings.pm
Ricardo Signes [Fri, 14 Mar 2014 08:11:28 +0000]
remove references to perllexwarn from warnings.pm

9 months agoregen/warnings.pl no longer touches perllexwarn
Ricardo Signes [Fri, 14 Mar 2014 08:09:29 +0000]
regen/warnings.pl no longer touches perllexwarn

9 months agoturn perllexwarn into a stub
Ricardo Signes [Fri, 14 Mar 2014 08:09:09 +0000]
turn perllexwarn into a stub

9 months agomerge most of perllexwarn into warnings
Ricardo Signes [Fri, 14 Mar 2014 08:04:09 +0000]
merge most of perllexwarn into warnings

9 months agoreplace printTree with warningsTree
Ricardo Signes [Fri, 14 Mar 2014 07:51:31 +0000]
replace printTree with warningsTree

we return, rather than print, the warnings, so we can potentially
futz around with the string and put it where we like without
having to worry about C<select>

9 months agoenclose warnings.h generation in a block
Ricardo Signes [Fri, 14 Mar 2014 07:45:06 +0000]
enclose warnings.h generation in a block

...to limit the number of variables visible everywhere and
make it a bit easier to see what I am doing as I refactor
regen/warnings.pl

9 months agoFix uninitialized-value warnings in Thread::Queue
Aaron Crane [Tue, 18 Mar 2014 17:17:54 +0000]
Fix uninitialized-value warnings in Thread::Queue

This involves a version bump, to 3.05.

9 months agoMake sure the PWD environment variable points to the t directory.
Andy Dougherty [Thu, 13 Mar 2014 20:16:22 +0000]
Make sure the PWD environment variable points to the t directory.

runtests is typically run under /bin/sh.  If the user uses a different
interactive shell (such as /bin/ksh) that maintains the PWD environment
variable, but /bin/sh does not, then the 'cd t' line in runtests ends
up changing the working directory without updating $PWD.  Several tests
in t/io/fs.t rely on being able to change directories and then get back
to the original.  The tests assume that if $PWD is set at all, then
it is set correctly.  This fix changes runtests to ensure it is so.

9 months agoSplit file into parts with and without substitutions.
Andy Dougherty [Thu, 13 Mar 2014 19:44:19 +0000]
Split file into parts with and without substitutions.

At this point, there are no functional changes.  This just prepares
the way for future work.

9 months agoPreallocate HvAUX() structures for large bucket arrays
Yves Orton [Sat, 1 Mar 2014 16:31:53 +0000]
Preallocate HvAUX() structures for large bucket arrays

The assumption is that the time/space tradeoff of not allocating
the HvAUX() structure goes away for a large bucket array where the
size of the allocated buffer is much larger than the nonallocated
HvAUX() "extension".

This should make keys() and each() on larger hashes faster, but
still preserve the essence of the original space conservation,
where the assumption is a lot of small hash based objects which
will never be traversed.

9 months agoSplit out part of hv_auxinit() so it can be reused
Yves Orton [Sat, 1 Mar 2014 14:49:28 +0000]
Split out part of hv_auxinit() so it can be reused

Changes nothing except that it introduces hv_auxinit_interal() which
does part of the job of hv_auxinit(), so that we can call it from
somewhere else in the next commit.

9 months agoperlfunc: clarify kill()'s return value
David Mitchell [Mon, 17 Mar 2014 16:44:48 +0000]
perlfunc: clarify kill()'s return value

9 months agotidy up kill0.t and kill0_child
David Mitchell [Mon, 17 Mar 2014 16:19:10 +0000]
tidy up kill0.t and kill0_child

The previous commit added some tests to kill0.t, and added the auxiliary
file kill0_child. Tidy up the new code to better match normal standards.
In particular, improve the format, grammar and clarity of the comments,
and replace q|...| with "..." where appropriate.
Also, make the temporary filename a variable, and prefix it with "tmp-",
so that if gets left around for any reason, it's more obvious that it's
just an extraneous temporary file.

(I haven't actually tested this commit on win32)

9 months agoRT #121230, tests for process group kill on Win32
Daniel Dragan [Mon, 17 Mar 2014 15:29:52 +0000]
RT #121230, tests for process group kill on Win32

Add tests for 111f73b5d79, the fix for kill -SIG on win32, which was
broken in 5.18.0

(A follow-up commit will clean this code up a bit)

9 months ago[MERGE] avoid calling pp_null().
David Mitchell [Sun, 16 Mar 2014 18:51:07 +0000]
[MERGE] avoid calling pp_null().

Several 'empty' ops like OP_NULL and OP_SCOPE call pp_null() at run-time
(which just returns). Attempts are made to strip such empty ops from the
op_next execution chain, but this has not been not complete. In
particular, ops at the head or tail of a sub-chain, or ops that rpeep()
has itself nulled, weren't being eliminated.

This merge avoids all calls to pp_null() in the test suite, apart from
those called via the constant folder (which is called before null op
elimination), and OP_REGCMAYBE (which isn't addressed here).

9 months agoelide "empty" ops at the head of op_next chains
David Mitchell [Wed, 5 Mar 2014 16:08:02 +0000]
elide "empty" ops at the head of op_next chains

Currently all OP_NULL/OP_SCOPE/OP_SCALAR/OP_LINESEQ ops (which all map at
run time to pp_null()) are eliminated from op_next chains *except* ones at
the head of a chain (e.g. pointed to by o->op_other).

The API of peep()/rpeep() makes it difficult to directly do this within
the function itself, as it has no return value  - and thus
RPEEP(o->op_other) has no way to update op_other to skip the first op if
it happens to be a null or whatever.

Instead, we add a small helper function, S_prune_chain_head(), and
always call it after we call peep, e.g.

         CALL_PEEP(PL_main_start);
         finalize_optree(PL_main_root);
        +S_prune_chain_head(aTHX_ &PL_main_start);

rpeep() is also complicated by its recursion reduction mechanism, where
it saves the addresses of several ops before recursing on them. I had to
change this so that it saves the addresses of the addresses of the ops
instead, so they can be updated: i.e. rather than saving o->op_other,
it saves &(o->op_other).

With this commit, nothing in the test suite triggers executing pp_null(),
execpt OP_REGCMAYBE and S_fold_constants(). I verified this with the
following hacky diff:

>>>>diff --git a/op.c b/op.c
>>>>index 716c684..819a717 100644
>>>>--- a/op.c
>>>>+++ b/op.c
>>>>@@ -3489,6 +3489,7 @@ S_op_integerize(pTHX_ OP *o)
>>>>     return o;
>>>> }
>>>>
>>>>+int XXX_folding = 0;
>>>> static OP *
>>>> S_fold_constants(pTHX_ OP *o)
>>>> {
>>>>@@ -3504,6 +3505,7 @@ S_fold_constants(pTHX_ OP *o)
>>>>     SV * const olddiehook  = PL_diehook;
>>>>     COP not_compiling;
>>>>     dJMPENV;
>>>>+    int XXX_folding_old = XXX_folding;
>>>>
>>>>     PERL_ARGS_ASSERT_FOLD_CONSTANTS;
>>>>
>>>>@@ -3583,11 +3585,13 @@ S_fold_constants(pTHX_ OP *o)
>>>>     assert(IN_PERL_RUNTIME);
>>>>     PL_warnhook = PERL_WARNHOOK_FATAL;
>>>>     PL_diehook  = NULL;
>>>>+    XXX_folding = 1;
>>>>     JMPENV_PUSH(ret);
>>>>
>>>>     switch (ret) {
>>>>     case 0:
>>>>  CALLRUNOPS(aTHX);
>>>>+        XXX_folding = XXX_folding_old;
>>>>  sv = *(PL_stack_sp--);
>>>>  if (o->op_targ && sv == PAD_SV(o->op_targ)) { /* grab pad temp? */
>>>> #ifdef PERL_MAD
>>>>@@ -3608,10 +3612,12 @@ S_fold_constants(pTHX_ OP *o)
>>>>     case 3:
>>>>  /* Something tried to die.  Abandon constant folding.  */
>>>>  /* Pretend the error never happened.  */
>>>>+        XXX_folding = XXX_folding_old;
>>>>  CLEAR_ERRSV();
>>>>  o->op_next = old_next;
>>>>  break;
>>>>     default:
>>>>+        XXX_folding = XXX_folding_old;
>>>>  JMPENV_POP;
>>>>  /* Don't expect 1 (setjmp failed) or 2 (something called my_exit)  */
>>>>  PL_warnhook = oldwarnhook;
>>>>diff --git a/pp_hot.c b/pp_hot.c
>>>>index 36eac2b..ccb582f 100644
>>>>--- a/pp_hot.c
>>>>+++ b/pp_hot.c
>>>>@@ -68,9 +68,16 @@ PP(pp_gvsv)
>>>>     RETURN;
>>>> }
>>>>
>>>>+extern int XXX_folding;
>>>> PP(pp_null)
>>>> {
>>>>     dVAR;
>>>>+    if (!XXX_folding && PL_op->op_type != OP_REGCMAYBE) {
>>>>+        sv_dump((SV*)find_runcv(0));
>>>>+        op_dump(PL_op);
>>>>+        op_dump((OP*)PL_curcop);
>>>>+        assert(0);
>>>>+    }
>>>>     return NORMAL;
>>>> }
>>>>

9 months agorpeep(): elide just-nulled ops
David Mitchell [Wed, 5 Mar 2014 19:42:36 +0000]
rpeep(): elide just-nulled ops

Perl_rpeep() currently spots "empty" ops like OP_NULL, OP_SCOPE
and elides them from the op_next chain (by setting oldop->op_next to point
to the op following the current op). However, if rpeep() itself
op_null()'s the current op, then when the main loop is re-entered, that
mechanism is bypassed. Modify re-entry to the loop in this case so that
the just nulled op re-processed and thus elided.

(Also document what the OP_SASSIGN/OP_SUBSTR optimisation is doing;
studying that was what originally led me to this general fix.)

9 months agorpeep(): remove trailing OP_NULLs etc
David Mitchell [Wed, 5 Mar 2014 19:42:02 +0000]
rpeep(): remove trailing OP_NULLs etc

Perl_rpeep() elides OP_NULLs etc in the middle of an op_next chain, but
not at the start or end. Doing it at the start is hard (and not addressed
here); doing it at the end is trivial, and it just looks like a mistake in
the original code (there since 1994) that was (incorrectly) worried about
following through a null pointer.

9 months agocode following eval {} not always optimised
David Mitchell [Thu, 6 Mar 2014 13:32:56 +0000]
code following eval {} not always optimised

In something like this

    eval { 1 while 1 };
    $x = $a[0];

The optimising of the while loop makes Perl_rpeep() miss processing the
chain of ops from the OP_LEAVETRY onwards. So in the code above for
example, the alem wont be optimised into an alemfast.

Fix this by explicitly recursing into the entertry->op_other branch
(which actually points at the leavetry).

The infinite loop above can be broken by, for example, a signal handler
calling die.

9 months agoOP_SORT: store start of block in null->op_next
David Mitchell [Wed, 5 Mar 2014 14:44:41 +0000]
OP_SORT: store start of block in null->op_next

When a sort with a code block, like sort { BLOCK } arg, ...
is compiled, it comes out like

     sort
        pushmark
        null
           scope
              BLOCK
        arg
        ...

(The 'scope' may be instead be 'ex-leave' depending on circumstances).

At run time, pp_sort() navigates its way down from the sort op to find the
start op of the BLOCK. We can shorten this process slightly by storing the
start of BLOCK in the otherwise unused op_next field of the OP_NULL.
Effectively we are using the null->op_next field as a surrogate op_other
field for the op_sort (which doesn't have a spare field we could store
the pointer in).

The main point of this commit however is not the slight speed up from
skipping a couple of pointer follows at run-time; rather that it will
shortly allow us to trim any null ops from the beginning of the BLOCK. We
can't do this directly, as that would involve changing the scope->op_first
pointer, which might confuse B:: type modules.

9 months agorpeep(): OP_SORT with code block has OPf_SPECIAL
David Mitchell [Wed, 5 Mar 2014 14:19:33 +0000]
rpeep(): OP_SORT with code block has OPf_SPECIAL

In rpeep(), we check whether the OP_SORT has a code block as the first arg
(e.g. sort {BLOCK} ...) by testing for OPf_STACKED, then looking for
an OP_SCOPE or ex-OP_LEAVE. However, ck_sort() has already checked for
this situation and set the OPf_SPECIAL flag. So just just check for this
flag in  rpeep(); leave in the OP_SCOPE/ex-OP_LEAVE checks as just
assertions.

Also, add some commentary to ck_sort() and S_simplify_sort().

9 months ago[MERGE] more refactoring of re_intuit_start()
David Mitchell [Sun, 16 Mar 2014 18:04:13 +0000]
[MERGE] more refactoring of re_intuit_start()

This is the second merge commit of work I've done on re_intuit_start().
This one mostly concentrates on the block of code that looks for a start
class. It does a lot of reorganisation of the ordering of the various
nested if/elses, and by doing do manages to eliminate three labels and
associated gotos.

It also audits that block for UTF8 correctness, either fixing or
documenting areas where byte rather than char arithmetic was being
performed. At this point I've now done a basic audit of the whole
function.

It also swaps the start class and 'update BmUSEFUL' blocks. This seems
more logical, and makes the code simpler.

Finally, it cleans up and updates a lot of comments in the function
generally.

This merge has mainly been simplifying, cleaning up and fixing work.
I still have a big list of stuff that *could* be done, including further
optimisations.

9 months agore_intuit_start(): re-comment head of function
David Mitchell [Sun, 16 Mar 2014 16:25:59 +0000]
re_intuit_start(): re-comment head of function

The blurb above this function is a mess and contains lots of obsolete
stuff. Mostly rewrite it. Also sprinkle a few extra comments elsewhere.

9 months agore_intuit_start(): indent rest of check block
David Mitchell [Sun, 16 Mar 2014 15:41:55 +0000]
re_intuit_start(): indent rest of check block

Most of the 'check' substring matching code is in its own scope;
move the last few bits into that scope too. This is purely cosmetic.

9 months agore_intuit_start(): add some general comments
David Mitchell [Sun, 16 Mar 2014 15:40:00 +0000]
re_intuit_start(): add some general comments

9 months agore_intuit_start(): update comments in BmUSEFUL blk
David Mitchell [Sun, 16 Mar 2014 12:17:18 +0000]
re_intuit_start(): update comments in BmUSEFUL blk

9 months agore_intuit_start(): update comments in stclass code
David Mitchell [Sun, 16 Mar 2014 11:58:51 +0000]
re_intuit_start(): update comments in stclass code

Improve the description at the start of this code block, and move
some of the comments closer to where they apply (and explain why they're
probably wrong)

9 months agore_intuit_start(): improve main terminating cond
David Mitchell [Sun, 16 Mar 2014 11:36:43 +0000]
re_intuit_start(): improve main terminating cond

At the end of the failure block in the stclass code, it decides whether
rx_origin has been advanced too much for the match to ever succeed, and if
so, quits.

That test has a comment next to it about perhaps testing for this earlier.
It also does a byte rather than chars calculation.

This commit does the following.

It adds a proper chars-based termination test near the beginning of the
'check' code block. This test is essentially free, since at that point
we've just done the necessary HOPs. It also calculates start_point using
end_point rather the strend as the limit, so avoiding a bit of unnecessary
hopping when we're about to fail anyway. It introduces the new HOPMAYBE3
macro wrapper for this purpose.

It keeps the old bytes-based test at the end in stclass, with a note that
the simple bytes calculation errs on the side of re-entering the check
block where the accurate chars-based test is now done.

9 months agore_intuit_start(): update stclass code comments
David Mitchell [Sat, 15 Mar 2014 15:08:46 +0000]
re_intuit_start(): update stclass code comments

Document instances where its safe to use bytes verses char length
arithmetic, and generally improve some of the commentary in this block of
code.

9 months agore_intuit_start(): remove an obsolete assert.
David Mitchell [Sat, 15 Mar 2014 15:00:48 +0000]
re_intuit_start(): remove an obsolete assert.

I added the assert a while ago while I was refactoring this code. It's
pretty obvious now that at this point, rx_origin > strpos.  (It wasn't
back then, as strpos wasn't constant).

9 months agore_intuit_start(): fix byte/char calculation err
David Mitchell [Sat, 15 Mar 2014 14:27:47 +0000]
re_intuit_start(): fix byte/char calculation err

On failure to find stclass in float range, it currently does:

    rx_origin = check_at - start_shift;

which should instead be

    rx_origin = HOP3c(check_at, - start_shift, strbeg);

The second added test is an example of when this causes a false negative.
(The first test is just the analogue without a UTF8 string, so it already
passes).

Since we actually already calculate this value earlier as part of
determining endpos in the float case, assign the result of that calc to a
local var, then just reuse it.

9 months agore_intuit_start(): eliminate checked_upto var
David Mitchell [Mon, 10 Mar 2014 17:53:48 +0000]
re_intuit_start(): eliminate checked_upto var

This var is supposed to record the latest place that stclass
had rejected, so if we try again, we don't start any earlier than that.
However, an assert showed that nothing in the test suite ever left
checked_upto > rx_origin on re-entry, so we could always use rx_origin
directly.

On failure, checked_upto is reset to HOPBACKc(endpos, start_shift)
where endpoint is the highest char that find_byclass() was asked to search
to. Now, I think that this is a logical error; it should have been
HOPBACKc(endpos, cl_l) or similar; i.e. just hop back the number of chars
equal to the length of the character class; using start_shift just makes
checked_upto artificially too small.

But in either case, consider the following more formal analysis (the
arithmetic below is in terms of chars).

Assume initially at least, that checked_upto <= rx_origin. The question is
whether we can ever end up with checked_upto "overtaking" rx_origin.

Where there is an anchored substring or ml_anch, we have:

    endpos = r_origin + cl_l;
    on failure,
        checked_upto = endpos - (start_shift or cl_l)

    since start_shift should be => cl_l, in either case we end up with
    checked_upto <= rx_origin.

Where there is only a floating substring, we have:

    endpos = r_origin - start_shift + cl_l;
    on failure,
        checked_upto = endpos - (start_shift or cl_l)

    again, since start_shift should be => cl_l, in either case we end up with
    checked_upto <= rx_origin.

Where there are no substrings, we return on failure; so the updating
checked_upto is irrelevant.

On success we return, so again the updating of checked_upto is irrelevant.

9 months agore_intuit_start(): fix a comment about overlap
David Mitchell [Mon, 10 Mar 2014 15:48:25 +0000]
re_intuit_start(): fix a comment about overlap

The comment said that we don't allow the anchored and floating substrings
to overlap. This is trivially wrong, e.g.

/aa+/ has an anchored of "aa" at 0 and a float of "a at 1..inf

Fix the comment to say what the assertion actually already tests for, i.e.
that the float doesn't start before the anchored.

9 months agore_intuit_start(): trivial reorg of stclass code
David Mitchell [Sat, 8 Mar 2014 17:29:43 +0000]
re_intuit_start(): trivial reorg of stclass code

make all the actions on success follow the actions on failure,
rather than being partly before and partly after.

No functional changes.

9 months agore_intuit_start(): always initialise start_shift
David Mitchell [Sat, 8 Mar 2014 14:38:56 +0000]
re_intuit_start(): always initialise start_shift

The start_shift variable is usually initialised to prog->check_offset_min,
except for one code path where it is left at zero. It turns out that
in that code path, the value isn't (currently) used, so is safe. However,
that may change, so unconditionally initialise it.

9 months agore_intuit_start(): swap BmUSEFUL + stclass blocks
David Mitchell [Tue, 18 Feb 2014 10:13:54 +0000]
re_intuit_start(): swap BmUSEFUL + stclass blocks

Currently the code that does BmUSEFUL()--, and which and frees the
substring if the count reaches zero, comes before the stclass code. This
is problematic, because by the time the stclass code is executed, the
check substrings may have been freed. The stclass code does have some
checks for this, but they are inadequate: I managed to produce code that
segfaulted. It's also hard to test - you have to run against the same
pattern 100 times to get the BmUSEFUL() count down to zero, then on the
101st attempt, do something that both triggers the decrement/free and
fails the st class.

By moving the BmUSEFUL()-- stuff to *after* the stclass code, it removes
this issue completely.

As to how it affects the BmUSEFUL() count: I think it makes it slightly
better. Before, a substring could match at rx_origin offset 0, triggering
BmUSEFUL()--, then the stclass could fail, triggering a new substring
match at at a non-zero offset, and thus doing BmUSEFUL()++. The overall
affect being neutral. Now, the overall effect is BmUSEFUL += 1, which
better reflects the fact that the substring *did* help us find a non-zero
offset.

9 months agore_intuit_start(): de-duplicate condition
David Mitchell [Mon, 17 Feb 2014 20:46:15 +0000]
re_intuit_start(): de-duplicate condition

Change

    if (have_anchored && check_ix == 1) {
        B;
    }

    if (!have_anchored) {
        A;
    }

    C;

To:

    if (have_anchored) {
        if (check_ix == 1) {
            B;
        }
    }
    else {
        A;
    }

    C;

This change should be functionally equivalent, but eliminates calculating
the have_anchored condition twice.

9 months agore_intuit_start(): swap two blocks, delete label
David Mitchell [Mon, 17 Feb 2014 20:37:13 +0000]
re_intuit_start(): swap two blocks, delete label

Change

    if (!have_anchored) {
        A;
        goto hop_and_restart;
    }

    if (check_ix == 1) {
        B;
    }

  hop_and_restart:
    C;

To:

    if (have_anchored && check_ix == 1) {
        B;
    }

    if (!have_anchored) {
        A;
    }

    C;

This change should be functionally equivalent, but eliminates a label.

9 months agore_intuit_start(): swap another if/else block
David Mitchell [Mon, 17 Feb 2014 20:20:40 +0000]
re_intuit_start(): swap another if/else block

Change

    {
        ...
        if (has_anchored) {
            A;
            goto restart;
        }
        B;
        goto hop_and_restart;
    }

to

    {
        ...
        if (!has_anchored) {
            B;
            goto hop_and_restart;
        }
        A;
        goto restart;
    }

Functionally the same, but will allow simpler code shortly

9 months agore_intuit_start(): remove redundant assertion
David Mitchell [Mon, 17 Feb 2014 20:12:31 +0000]
re_intuit_start(): remove redundant assertion

assert(prog->substrs->check_ix) is within the block
    if (prog->substrs->check_ix == 1)
so it's not needed any more.

9 months agore_intuit_start(): swap another if/else block
David Mitchell [Mon, 17 Feb 2014 19:45:12 +0000]
re_intuit_start(): swap another if/else block

Change

    {
        if (cond)
            goto x;
        A;
        goto y;
    }
    x:

into

    {
        if (!cond) {
            A;
            goto y;
        }
    }
    x:

Functionally equivalent, but eliminates one 'goto'.

9 months agore_intuit_start(): swap if/else blocks
David Mitchell [Mon, 17 Feb 2014 19:39:44 +0000]
re_intuit_start(): swap if/else blocks

Change

    {
        if (cond) {
            A;
            goto x;
        }
        B;
        goto y;
    }

into
    {
        if (!cond) {
            B;
            goto y;
        }
        A;
        goto x;
    }

Should be functionally equivalent, but will allow for some further code
factorisation shortly.

9 months agore_intuit_start(): eliminate one label
David Mitchell [Mon, 17 Feb 2014 19:07:08 +0000]
re_intuit_start(): eliminate one label

Currently the code looks like:

    if (rx_origin + start_shift >= check_at)
        goto retry_floating_check;

    ....

  retry_floating_check:
    rx_origin = check_at - start_shift;
    goto hop_and_restart;

But that conditional only kicks in when the floating substring (which was
the check substring) matched, so this condition always applies:

    rx_origin + start_shift <= check_at

So the condition in the code will only ever be true when

    rx_origin + start_shift == check_at

In this case, this assignment is a noop:

    rx_origin = check_at - start_shift;

So skip it and jump directly to hop_and_restart. This eliminates the
retry_floating_check: label.

9 months agoadd test for a code path in intuit_start()
David Mitchell [Mon, 17 Feb 2014 18:51:48 +0000]
add test for a code path in intuit_start()

Nothing in the test suite currently triggers *not* taking this branch:

    /* Have both, check_string is floating */
    if (rx_origin + start_shift >= check_at) /* Contradicts floating=check */

So add something that does trigger it.

9 months agore_intuit_start(): eliminate debug-only var
David Mitchell [Mon, 10 Feb 2014 19:56:08 +0000]
re_intuit_start(): eliminate debug-only var

'what' is only defined and assigned to in debugging builds.
Just calculate the value on the fly instead when printing debugging
output. Makes the code less messy.

9 months agore_intuit_start(): eliminate t from stclass code
David Mitchell [Mon, 10 Feb 2014 15:37:30 +0000]
re_intuit_start(): eliminate t from stclass code

The 't' variable now just contains a copy of rx_origin; so just use
rx_origin directly, and eliminate t.