2 years agoRevert "Um, finish reordering the parser struct"
Father Chrysostomos [Wed, 3 Aug 2016 20:31:06 +0000 (13:31 -0700)] 
Revert "Um, finish reordering the parser struct"

This reverts commit d64e121b07bda895f7f3a5d0e449fc948986e2f1.

It contained stupid blunders.  See

2 years agoremove most 'a' flags from embed.fnc
David Mitchell [Thu, 4 Aug 2016 10:47:02 +0000 (11:47 +0100)] 
remove most 'a' flags from embed.fnc


In embed.fnc, we mark about 80 functions with the a flag, which we
document as meaning:

:   a  Allocates memory a la malloc/calloc.  Also implies "R":
:         proto.h: add __attribute__malloc__

Now, the current gcc docs for the malloc attribute states:

    This tells the compiler that a function is malloc-like, i.e., that the
    pointer P returned by the function cannot alias any other pointer
    valid when the function returns, and moreover no pointers to valid
    objects occur in any storage addressed by P.

    Using this attribute can improve optimization. Functions like malloc
    and calloc have this property because they return a pointer to
    uninitialized or zeroed-out storage. However, functions like realloc
    do not have this property, as they can return a pointer to storage
    containing pointers.

This implies to me that we should only flag functions as 'a' if both:

    1) it returns a pointer to memory that isn't pointed to from elsewhere;
    2) that the block of memory itself contains no pointers.

I think we are failing condition (2) for many 'a' functions; for example
the op.c newXXXOP() functions return an alloced op struct (condition 1
probably satisfied), but which contain pointers (condition 2 fails).

2 years ago[MERGE] add OP_ARGELEM etc
David Mitchell [Wed, 3 Aug 2016 19:55:39 +0000 (20:55 +0100)] 

this branch:

* moves the parsing of subroutine signatures into perly.y rather than
  using a custom mini-parser in toke.c;
* adds 3 new ops, OP_ARGELEM, OP_ARGDEFELEM, OPARGCHECK to handle
  the checking and processing of subroutine arguments;
* fixes up to handle the new ops and to handle
  'use feature "signatures"' better.

2 years agosilence compiler warning in perly.y
David Mitchell [Mon, 1 Aug 2016 16:20:27 +0000 (17:20 +0100)] 
silence compiler warning in perly.y

assigning a char from an I32 gives a warning. Add an explicit cast
as we know the int only ever holds a char.

2 years - avoid deep recursion warning
David Mitchell [Mon, 1 Aug 2016 11:41:06 +0000 (12:41 +0100)] - avoid deep recursion warning

also add some basic descriptions to a few functions.

2 years agoenable warnings+strict in t/op/signatures.t
David Mitchell [Mon, 1 Aug 2016 11:08:09 +0000 (12:08 +0100)] 
enable warnings+strict in t/op/signatures.t

2 years agoduplicate signature vars gave wrong warning
David Mitchell [Mon, 1 Aug 2016 10:41:42 +0000 (11:41 +0100)] 
duplicate signature vars gave wrong warning

RT #128719. This:

    sub f ($x, $x) {}


    "state" variable $x masks earlier declaration in same scope

This commit changes that to '"my" variable'

2 years agopeephole optimise op_other branch in OP_ARGDEFELEM
David Mitchell [Mon, 1 Aug 2016 10:06:14 +0000 (11:06 +0100)] 
peephole optimise op_other branch in OP_ARGDEFELEM

I forgot to do this earlier.

2 years agopessimise pp_argelem, pp_argdefelem
David Mitchell [Thu, 28 Jul 2016 09:18:26 +0000 (10:18 +0100)] 
pessimise pp_argelem, pp_argdefelem

These two ops assumed that, since they occur at the start of a
function, weird tricks with goto and closures can't be used to
cause the new lexical vars to already have a value, so the assign code
can be simpler and quicker than that found in pp_sassign and pp_aassign.

However Father Chrysostomos demonstrated that this wasn't the case,
using e.g. code that does strange things in signature default expressions.

In particular we can not assume:

    * that scalar lexicals will be undef
    * that array and hash lexicals will be empty
    * that lexicals and @_ can't be magical or tied;
    * that @_ remains unchanged (especially in relation to its number of
    * that there are no common elements, since with aliases and closures,
      my @a = @_ can be equivalent to my @a = (...); @a = ($a_[0],...)

So this commit removes the short-cuts, and for aggregates, if the
new lexical array or hash may be non-empty, makes a copy of each @_
element first.

It is intended in the near future that normal runs of OP_ARGELEM
will be replaced by OP_SIGNATURE, which will be able to do a better job of
knowing when its safe to optimise.

2 years agosignatures: make param and optional param count IV
David Mitchell [Mon, 25 Jul 2016 11:24:39 +0000 (12:24 +0100)] 
signatures: make param and optional param count IV

During the course of parsing end exection, these values get stored
as ints and UVs, then used as SSize_t.

Standardise on IVs instead. Technically they can never be negative, but
their final use is as indices into AVs, which is SSize_t, so it's
easier to standardise on a signed value throughout.

2 years agoucfirst() new signature diagnostic messages
David Mitchell [Mon, 25 Jul 2016 10:37:37 +0000 (11:37 +0100)] 
ucfirst() new signature diagnostic messages


    a slurpy parameter may not have a default value
    A slurpy parameter may not have a default value

Also, split the "Too %s arguments for subroutine" diagnostic into
separate "too few" and "too many" entries in perldiag.

Based on suggestions by Father Chrysostomos.

2 years agomore pruning of Porting/deparse-skips.txt
David Mitchell [Fri, 22 Jul 2016 20:26:44 +0000 (21:26 +0100)] 
more pruning of Porting/deparse-skips.txt

In the summary output of

    cd t; ./perl TEST -deparse

it doesn't distinguish between test scripts expected to pass that fail,
and those expected to fail that succeed. They're all listed as failures.

So I've just removed 5 further entries from deparse-skips.txt that I
hadn't noticed were passing. I don't know when they first started
unexpectedly passing.

It's down to 78 unexpected failures now. Not good, since a couple of
years ago there were no unexpected failures, but at least its down from
the 194 at the start of this branch. The entries in deparse-skips.txt
have also reduced by about 28 over the course of this branch.

2 years agodeparse subroutine signatures
David Mitchell [Fri, 22 Jul 2016 17:25:08 +0000 (18:25 +0100)] 
deparse subroutine signatures

If 'use feature "signatures"' is in scope, deparse subs using the

    sub foo ($a,$b) { ... }

syntax rather than

    sub foo {
        my $a = $_[0];
        my $b = $_[0];

Only do this where the sequence of OP_SIGCHECK and OP_SIGELEM etc ops
make up a consistent signature. Otherwise (e.g. someone's modified
it with a parser hook), fall back to 'my $a = $_[0]' syntax.

2 years agofix deparsing of Test::More's use_ok()
David Mitchell [Fri, 22 Jul 2016 13:24:33 +0000 (14:24 +0100)] 
fix deparsing of Test::More's use_ok()

Code like

    BEGIN {use_ok 'Net::Ping'};

got deparsed as:

    BEGIN {use_ok 'Net::Ping'};
    use Net::Ping (@{$args[0];});

This is due to the tricks it plays faking up and evaling a use statement.

This commit filters out these spurious 'use's in the Deparse output.

With this commit, 109 'TEST -deparse' tests that were expected to pass
but had been failing for some time, now pass; and 22 tests that were
expected to fail, now pass.

I also removed the entry for lib/Switch/t/ in Porting/deparse-skips.txt,
since Switch is no longer bundled.

2 years agoOP_MULTIDEREF: remove ghost entry in op_aux list
David Mitchell [Fri, 22 Jul 2016 12:12:17 +0000 (13:12 +0100)] 
OP_MULTIDEREF: remove ghost entry in op_aux list

In the case where a multideref expression ends with an index that initially
looks simple (e.g. const or var) but turns out to be complex, the code
which optimises a sequence of aelem etc into a single multideref backs off
from including that last index expression in the multideref, but still
allocates a slot in the op_aux array for that ghost index.

For example in


it allocates a slot for the "1" constant but then doesn't use it.

This isn't an issue for multideref itself, but when running Deparse or
otherwise inspecting the op tree, the $op->aux_list() method returns a
list of the elements of the op_aux array with an extra garbage element at
the end, which can cause Deparse to crash.

2 years agofix up exists etc deparsing
David Mitchell [Fri, 22 Jul 2016 11:19:03 +0000 (12:19 +0100)] 
fix up exists etc deparsing

a general multideref expression like

    exists +($r//{})->{foo}

was being deparsed without the '+', meaning it was being interpreted

    (exists ($r//{}))->{foo}

2 years agohandle deparsing of sub prototypes with sigs
David Mitchell [Fri, 22 Jul 2016 09:08:50 +0000 (10:08 +0100)] 
handle deparsing of sub prototypes with sigs

when 'use feature "signatures"' is in scope, subroutine prototypes
should be deparsed as ':prototype($$)' rather than '($$)'

I've also tweaked the sub in question slightly to make adding
signature deparsing easier later on.

2 years agoDeparse: emit pragmas *before* each sub
David Mitchell [Thu, 21 Jul 2016 14:11:50 +0000 (15:11 +0100)] 
Deparse: emit pragmas *before* each sub

Before deparsing a sub, emit any pragma changes associated with the
first nextstate in the sub *before* emitting the sub itself.

So this:

    use strict;
    sub f { ...}

doesn't get deparsed as

    sub f { use strict; ...}

There was already a partial fix for this in pp_nextstate. Making
next_todo() always emit pragmas catches more cases and makes pp_nextstate

This is in preparation for deparsing 'use feature "signatures"'.

2 years agoDeparse: use more local vars in next_todo()
David Mitchell [Thu, 21 Jul 2016 13:21:01 +0000 (14:21 +0100)] 
Deparse: use more local vars in next_todo()

assign @$ent to some local vars rather than directly using $ent->[2] etc:
makes the code more self-documenting.

Should be no functional changes.

2 years agoDeparse: move pragma deparsing into separate sub
David Mitchell [Thu, 21 Jul 2016 13:01:17 +0000 (14:01 +0100)] 
Deparse: move pragma deparsing into separate sub

Currently this is done in pp_nextstate(). Move it out into a separate
method called pragmata() so in the next commit it can be used elsewhere.

Should be no functional changes.

2 years agodeparse pragmas before subs
David Mitchell [Wed, 20 Jul 2016 16:31:00 +0000 (17:31 +0100)] 
deparse pragmas before subs

Currently something like this:

    use strict;
    sub f {

deparses as:

    sub f {
        use strict;
        print $_;
    use strict;
    print $_;

(Note where the 'strict's appear). Although ugly, this is semantically
correct for most pragmas. However, it breaks down for "use feature
'signatures'", since that needs to appear before the sub if the
deparsing of the sub's header is altered to reflect signature syntax or
not, based on whether the pragma is in scope.

This commit changes the deparsing of each nextstate op so that it outputs
any pragmas which reflect changes since the last nextstate's hints etc,
*before* deparsing any subs whose COP is less than that of the new
nextstate. After this commit, the code above deparses as:

    use strict;
    sub f {
        print $_;
    print $_;

It also allows some hacky code to be removed from that
ensured that "no warnings experimental::lexical_subs" appeared before
each lexical sub was deparsed.

[ This fix is not comprehensive; a fuller fix comes in a few commits time ]

David Mitchell [Sat, 9 Jul 2016 09:41:08 +0000 (10:41 +0100)] 

Currently subroutine signature parsing emits many small discrete ops
to implement arg handling. This commit replaces them with a couple of ops
per signature element, plus an initial signature check op.

These new ops are added to the OP tree during parsing, so will be visible
to hooks called up to and including peephole optimisation. It is intended
soon that the peephole optimiser will take these per-element ops, and
replace them with a single OP_SIGNATURE op which handles the whole
signature in a single go. So normally these ops wont actually get executed
much. But adding these intermediate-level ops gives three advantages:

1) it allows the parser to efficiently generate subtrees containing
   individual signature elements, which can't be done if only OP_SIGNATURE
   or discrete ops are available;
2) prior to optimisation, it provides a simple and straightforward
   representation of the signature;
3) hooks can mess with the signature OP subtree in ways that make it
   no longer possible to optimise into an OP_SIGNATURE, but which can
   still be executed, deparsed etc (if less efficiently).

This code:

    use feature "signatures";
    sub f($a, $, $b = 1, @c)  {$a}

under 'perl -MO=Concise,f' now gives:

    d  <1> leavesub[1 ref] K/REFC,1 ->(end)
    -     <@> lineseq KP ->d
    1        <;> nextstate(main 84 foo:6) v:%,469762048 ->2
    2        <+> argcheck(3,1,@) v ->3
    3        <;> nextstate(main 81 foo:6) v:%,469762048 ->4
    4        <+> argelem(0)[$a:81,84] v/SV ->5
    5        <;> nextstate(main 82 foo:6) v:%,469762048 ->6
    8        <+> argelem(2)[$b:82,84] vKS/SV ->9
    6           <|> argdefelem(other->7)[2] sK ->8
    7              <$> const(IV 1) s ->8
    9        <;> nextstate(main 83 foo:6) v:%,469762048 ->a
    a        <+> argelem(3)[@c:83,84] v/AV ->b
    -        <;> ex-nextstate(main 84 foo:6) v:%,469762048 ->b
    b        <;> nextstate(main 84 foo:6) v:%,469762048 ->c
    c        <0> padsv[$a:81,84] s ->d

The argcheck(3,1,@) op knows the number of positional params (3), the
number of optional params (1), and whether it has an array / hash slurpy
element at the end. This op is responsible for checking that @_ contains
the right number of args.

A simple argelem(0)[$a] op does the equivalent of 'my $a = $_[0]'.
Similarly, argelem(3)[@c] is equivalent to 'my @c = @_[3..$#_]'.
If it has a child, it gets its arg from the stack rather than using $_[N].
Currently the only used child is the logop argdefelem.

argdefelem(other->7)[2] is equivalent to '@_ > 2 ? $_[2] : other'.

[ These ops currently assume that the lexical var being introduced
is undef/empty and non-magival etc. This is an incorrect assumption and
is fixed in a few commits' time ]

2 years agomake op.c:S_alloc_LOGOP() non-static
David Mitchell [Thu, 14 Jul 2016 09:47:01 +0000 (10:47 +0100)] 
make op.c:S_alloc_LOGOP() non-static

This is principally so that it can be accessed from perly.y too.

2 years agosub signatures: use parser rather than lexer
David Mitchell [Thu, 28 Jan 2016 15:14:57 +0000 (15:14 +0000)] 
sub signatures: use parser rather than lexer

Currently the signature of a sub (i.e. the '($a, $b = 1)' bit) is parsed
in toke.c using a roll-your-own mini-parser. This commit makes
the signature be part of the general grammar in perly.y instead.

In theory it should still generate the same optree as before, except
that an OP_STUB is no longer appended to each signature optree: it's
unnecessary, and I assume that was a hangover from early development of
the original signature code.

Error messages have changed somewhat: the generic 'Parse error' has
changed to the generic 'syntax error', with the addition of ', near "xyz"'
now appended to each message.

Also, some specific error messages have been added; for example
(@a=1) now says that slurpy params can't have a default vale, rather than
just giving 'Parse error'.

It introduces a new lexer expect state, XSIGVAR, since otherwise when
the lexer saw something like '($, ...)' it would see the identifier
'$,' rather than the tokens '$' and ','.

Since it no longer uses parse_termexpr(), it is no longer subject to the
bug (#123010) associated with that; so sub f($x = print, $y) {}
is no longer mis-interpreted as sub f($x = print($_, $y)) {}

2 years agoUm, finish reordering the parser struct
Father Chrysostomos [Wed, 3 Aug 2016 13:36:24 +0000 (06:36 -0700)] 
Um, finish reordering the parser struct

Follow-up to 25e092d6d, which left some gaping holes.  I committed it
too soon.

2 years agoReorder parser struct for alignment
Father Chrysostomos [Wed, 3 Aug 2016 07:17:58 +0000 (00:17 -0700)] 
Reorder parser struct for alignment

We still have a 16-bit hole, which I have noted.  There’s no point in
moving the two U8s near the end of the struct (lex_fakeeof and lex_flags)
to fill that hole, as we would just have a bigger hole at the end.

2 years agoEmpty sublex_info into the parser struct
Father Chrysostomos [Wed, 3 Aug 2016 06:58:52 +0000 (23:58 -0700)] 
Empty sublex_info into the parser struct

sublex_info is never validly copied or set* all at once and no pointer
is ever taken to it.  It seems to be left over from the time when
PL_sublex_info was a global variable.  (Indeed, the struct is still
defined in perl.h, an odd place for something used only by parser.h.)

It will be easier to eliminate alignment holes in the parser struct if
we just empty it out.

* The one instance of sublex_info being copied, in
sv.c:Perl_parser_dup, ended up potentially sharing an SV between
threads, which is a no-no.  I say potentially, because I can’t see how
it could be non-null during thread cloning, which would have to happen
between sublex_start and sublex_push.

2 years agoparser.h: Remove lex_expect
Father Chrysostomos [Wed, 3 Aug 2016 06:26:46 +0000 (23:26 -0700)] 
parser.h: Remove lex_expect

In commit 8f0d8652cd, I mentioned that PL_parser->lex_expect is
still assigned to by Data::Alias.  That is no longer the case as
of Data::Alias 1.19.  So there is no need to keep this member

2 years agoparser.h: Make nexttoke a U8
Father Chrysostomos [Wed, 3 Aug 2016 00:57:52 +0000 (17:57 -0700)] 
parser.h: Make nexttoke a U8

As mentioned in the commit message for a2867f88735d4, this can
only contain numbers from 0 to 5.

2 years agolocale.c: Add some DEBUG statements
Karl Williamson [Sun, 31 Jul 2016 09:34:47 +0000 (03:34 -0600)] 
locale.c: Add some DEBUG statements

This also involves moving some complicated debugging statements to a
separate function so that it can be called from more than one place

2 years agolocale.c: Use %zu to print size_t values.
Karl Williamson [Sun, 31 Jul 2016 09:26:33 +0000 (03:26 -0600)] 
locale.c: Use %zu to print size_t values.

Previously these were printed with %"UVuf", but not all parameters were
cast to a UV, thus causing problems on certain platforms and
configurations.  All these were in DEBUG statements.

2 years agolocale.c: Some systems include NUL in strxfrm() return
Karl Williamson [Tue, 26 Jul 2016 20:09:46 +0000 (14:09 -0600)] 
locale.c: Some systems include NUL in strxfrm() return

strxfrm() is supposed to not include the trailing NUL in the length
returned, but we have run into a Windows system that does include it
(some Windows ones don't), so test for and compensate for this

2 years agolocale.c: White-space only
Karl Williamson [Wed, 3 Aug 2016 01:21:43 +0000 (19:21 -0600)] 
locale.c: White-space only

This indents code that the previous commit formed a block around, and a
couple of other white-space changes to fit in a terminal-sized window.

2 years agolocale.c: Improve embedded NUL collation handling
Karl Williamson [Tue, 26 Jul 2016 19:35:18 +0000 (13:35 -0600)] 
locale.c: Improve embedded NUL collation handling

When collating a Perl string that contains NUL characters, these are
replaced by the lowest collating non-NUL control.  However, if something
goes wrong with the calculation, until this commit \001 is arbitrarily
used.  But \001 is likely to be one of the characters that didn't work,
so we shouldn't arbitrarily choose it.  Instead, what this commit does
is to repeat the calculation a second time, allowing any character, not
just controls.  If that fails, something is seriously wrong, and an
error is returned.  This will cause the comparison that called this
function to fall back to using a raw string compare, instead of locale

Also, previously an empty transformed string was considered an error,
but that actually should be allowable.  This commit also changes a
similar finding of the highest collating character to not error on an
empty string, and to return an error if no such character is found.

Also, some comments were deleted that suggested that all this might not
be necessary.  But since those were written, real world experience shows
that it is.

And finally, debug outputting the transformation of the found
replacements is deleted, as these come from a recursive call, and the
transformation will have already been output in that call.

2 years agosv.c: Use raw cmp if error in locale collation
Karl Williamson [Mon, 1 Aug 2016 21:32:33 +0000 (15:32 -0600)] 
sv.c: Use raw cmp if error in locale collation

Prior to this commit, if there is an error in the generation of locale
collation information for a string, the string would always sort before
any string that had no such error.  That's suboptimal, as it throws away
information.  It would be better to fall back to using a raw compare
between the operands, as is already done for other errors in the
comparison process.  And that is what this commit does.

Normally this doesn't come up, but it can if there is a buggy locale
implementation of the libc function strxfrm(), or if memory was at the
edge and got exhausted by this operation.

This was discovered on an HP machine which doesn't work properly for
UTF-8 locales in its current configuration.  I've added the output of
perl -V of it in case someone ever wants to look at it, and I lazily
used the whole thing so as to not omit something crucial.

Summary of my perl5 (revision 5 version 25 subversion 4) configuration:
  Derived from: 863ca36a1db803bdd82e88ef0e862696379ba681
    uname='hp-ux p5p-hpux b.11.23 u 9000800 701987621 unlimited-user license '
    config_args='-des -Uversiononly -Dprefix=/home/khw/devel -Dusedevel -D'optimize=-ggdb3' -A'optimize=-ggdb3' -A'optimize=-O0' -Accflags='-DPERL_BOOL_AS_CHAR' -Accflags='-DPERL_EXTERNAL_GLOB' -Dman1dir=none -Dman3dir=none -DDEBUGGING -Dusemorebits -Dusethreads -Accflags='-Werror=declaration-after-statement' -Accflags='-DNO_MATHOMS''
    ccflags =' -D_POSIX_C_SOURCE=199506L -D_REENTRANT -Ae -D_HPUX_SOURCE -Wl,+vnocompatwarnings -DPERL_BOOL_AS_CHAR -DPERL_EXTERNAL_GLOB -Werror=declaration-after-statement -DNO_MATHOMS -DDEBUGGING -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 '
    optimize=' -ggdb3 '
    cppflags='-Aa -D__STDC_EXT__ -D_HPUX_SOURCE -D_POSIX_C_SOURCE=199506L -D_REENTRANT -Ae -D_HPUX_SOURCE -Wl,+vnocompatwarnings -DPERL_BOOL_AS_CHAR -DPERL_EXTERNAL_GLOB -Werror=declaration-after-statement -DNO_MATHOMS -DDEBUGGING -I/usr/local/include'
    ivtype='long long'
  Linker and Libraries:
    ldflags =' -L/usr/local/lib'
    libpth=/usr/local/lib /lib /usr/lib /usr/ccs/lib
    libs=-lcl -lpthread -lnsl -lndbm -ldb -lmalloc -lm -lcrypt -lsec -lc
    perllibs=-lcl -lpthread -lnsl -lmalloc -lm -lcrypt -lsec -lc
  Dynamic Linking:
    ccdlflags='-Wl,-E -Wl,-B,deferred '
    lddlflags='-b +vnocompatwarnings -L/usr/local/lib'

Characteristics of this binary (from libperl):
  Compile-time options:
  Locally applied patches:
  Built under hpux
  Compiled at Aug  1 2016 22:44:23

2 years agolib/locale.t: Better debug output
Karl Williamson [Mon, 1 Aug 2016 21:45:11 +0000 (15:45 -0600)] 
lib/locale.t: Better debug output

This output an array that was hopefully sorted, but the function it
calls sorts things itself, so the array looked sorted even if it

2 years agolib/locale.t: Add note() function, for future use
Karl Williamson [Mon, 1 Aug 2016 21:41:13 +0000 (15:41 -0600)] 
lib/locale.t: Add note() function, for future use

2 years agoutf8.h: Add comment clarification
Karl Williamson [Mon, 1 Aug 2016 03:46:05 +0000 (21:46 -0600)] 
utf8.h: Add comment clarification

2 years agoperlapi: Add a clarification.
Karl Williamson [Wed, 20 Jul 2016 22:06:08 +0000 (16:06 -0600)] 
perlapi: Add a clarification.

2 years agoMANIFEST description typo
Father Chrysostomos [Tue, 2 Aug 2016 05:07:07 +0000 (22:07 -0700)] 
MANIFEST description typo

2 years agoCorrect 3 bad email addresses for 'perlbug'.
James E Keenan [Tue, 2 Aug 2016 02:34:22 +0000 (22:34 -0400)] 
Correct 3 bad email addresses for 'perlbug'.

For: RT #128808

2 years ago[perl #128769] Localize @INC unconditionally
Father Chrysostomos [Tue, 2 Aug 2016 04:59:57 +0000 (21:59 -0700)] 
[perl #128769] Localize @INC unconditionally

As Zefram pointed out in
having inconsistent behaviour is going to cause more problems
than solves.

2 years agolib/locale.t: Clarify debug output
Karl Williamson [Tue, 26 Jul 2016 19:28:51 +0000 (13:28 -0600)] 
lib/locale.t: Clarify debug output

2 years ago[perl #128740] Check for null in pp_ghostent et al.
Father Chrysostomos [Mon, 1 Aug 2016 02:21:02 +0000 (19:21 -0700)] 
[perl #128740] Check for null in pp_ghostent et al.

Specifically in the S_space_join_names_mortal static function that
several pp functions call.  On some platforms (such as Gentoo Linux
with torsocks), hent->h_aliases (where hent is a struct hostent *) may
be null after a gethostent call.

2 years ago[RT #128574] Missed one incorrect usage of fresh_perl_
Dan Collins [Thu, 14 Jul 2016 01:50:28 +0000 (21:50 -0400)] 
[RT #128574] Missed one incorrect usage of fresh_perl_

2 years ago[RT #128574] Fix use of fresh_perl in tests
Dan Collins [Mon, 11 Jul 2016 02:05:40 +0000 (22:05 -0400)] 
[RT #128574] Fix use of fresh_perl in tests

2 years ago(perl #128685) generate dependency rules for perlmain$(OBJ_EXT) tonyc/128685-perlmain-dep-b
Tony Cook [Mon, 1 Aug 2016 01:37:39 +0000 (11:37 +1000)] 
(perl #128685) generate dependency rules for perlmain$(OBJ_EXT)

Without these rules changes to files like might not
result in perlmain.o being rebuilt.

Aristotle Pagaltzis improved this.

2 years agoMANIFEST typo
Father Chrysostomos [Sun, 31 Jul 2016 21:02:31 +0000 (14:02 -0700)] 

Sorry for the smoke.

2 years ago[perl #128769] Improve @INC '.' handling
Father Chrysostomos [Sun, 31 Jul 2016 20:51:36 +0000 (13:51 -0700)] 
[perl #128769] Improve @INC '.' handling

• Localise @INC only if necessary.
• Don’t mention '.' in the @INC list in the error message, since it
  was not in the @INC that was searched (this is accomplished by local-
  ising @INC in the same scope as the error).
• If a file exists that would have been loaded had '.' not been
  ignored, mention it and suggest ‘use lib’.
• Use the same number of closing as opening parentheses in the
  error message.

2 years agoDon’t trigger warnings for qq"@builtin"
Father Chrysostomos [Sun, 31 Jul 2016 06:51:29 +0000 (23:51 -0700)] 
Don’t trigger warnings for qq"@builtin"

Built-in arrays should not be giving warnings about possible unin-
tended interpolation (which happens with nonexistent arrays).

Some built-in variables do not exist if they are not needed, but perl
will generally pretend that they did already exist whenever they are
fetched.  It is such variables that trigger this warning erroneously:

$ ./miniperl -we 'sub dump_isa { warn "@ISA" } @ISA = ("foo","bar"); dump_isa'
Possible unintended interpolation of @ISA in string at -e line 1.
foo bar at -e line 1.

I discovered this when writing a test for @DB::args, using -w. uses @DB::args, so ‘use warnings’ code won’t get the warn-
ing, but code using -w gets it:

$ ./miniperl -we 'sub foo { package DB { () = caller 0 } print "@DB::args\n" } foo(1..3);'
Possible unintended interpolation of @DB::args in string at -e line 1.
1 2 3

The code in toke.c that decides whether this warning should take place
needs to supply the GV_ADDMG flag to gv_fetchpvn_flags, making it one
of the code paths that engages in the pretence mentioned above.

That code already had an explicit exception for @+ and @-.  This com-
mit removes it as being no longer necessary.

2 years agot/lib/ Ignore editor droppings
Father Chrysostomos [Sun, 31 Jul 2016 06:19:11 +0000 (23:19 -0700)] 
t/lib/ Ignore editor droppings

This bites me all the time.

2 years agoExempt @DB::args from ‘used once’ warnings
Father Chrysostomos [Sun, 31 Jul 2016 02:37:04 +0000 (19:37 -0700)] 
Exempt @DB::args from ‘used once’ warnings

A perfectly benign use of @DB::args like

sub foo { package DB { () = caller 0 } print "@DB::args\n" }

warns under -w, though that is exactly its intended use.  That is
is not nice. itself uses @DB::args, which is why this went unnoticed
for so many years.

This commit eliminates the ‘used once’ warning, but the ‘Possible
unintended interpolation’ message that that code produces will be
handled in another commit.

2 years agoFix comment typos principal → principle
Dagfinn Ilmari Mannsåker [Sun, 31 Jul 2016 12:47:01 +0000 (13:47 +0100)] 
Fix comment typos principal → principle

The ones in cpan/File-Temp/ have been submitted upstream as

2 years agomove platform list before function description (RT #128782)
Lukas Mai [Sat, 30 Jul 2016 21:14:21 +0000 (23:14 +0200)] 
move platform list before function description (RT #128782)

2 years agoperlport: remove getservbyport entry orphaned by 204ad8d57498ad6
Lukas Mai [Sat, 30 Jul 2016 21:16:49 +0000 (23:16 +0200)] 
perlport: remove getservbyport entry orphaned by 204ad8d57498ad6

2 years agoperlport: eliminate function signatures missed in 47cd99a476cec
Lukas Mai [Sat, 30 Jul 2016 21:15:41 +0000 (23:15 +0200)] 
perlport: eliminate function signatures missed in 47cd99a476cec

2 years agoPull in unnecessarily duplicated case "$opt".
Jarkko Hietaniemi [Sat, 30 Jul 2016 12:54:26 +0000 (08:54 -0400)] 
Pull in unnecessarily duplicated case "$opt".

2 years agoperlport: major overhaul
Lukas Mai [Fri, 29 Jul 2016 23:48:14 +0000 (01:48 +0200)] 
perlport: major overhaul

- hyperlink function names
- hyperlink variable names
- hyperlink module names
- hyperlink $Config{...} entries
- hyperlink some C function names
- hyperlink ``/qx, tr///, bitwise operators, BEGIN
- remove bareword filehandles from examples
- remove 2-arg open from examples
- recommend 3-arg open always
- clean up weird formatting and use \Q \E in $Config{_exe} example
- mention Time::Piece (a core module) for date parsing (-> strptime)
- prefer 'use' for loading modules unless there's a reason to 'require'
- remove paragraph about using 'use bytes' to indicate that your source
  code is in some native 8-bit encoding (that's not what 'use bytes'
  does and its use is "strongly discouraged" anyway)
- consistently use 2 spaces after a period
- consistently spell $Config{foo} as $Config{foo}, not $Config{'foo'}
- fix some POD markup
- remove reference to 'pl2cmd' because I've never heard of it and all
  search results on the web point back to copies of perlport
- remove claim that binmode is a no-op on non-windows systems (that
  hasn't been true since the introduction of I/O layers and Unicode text
- realign some tables
- don't describe sets of characters as "matching tr/...//" because tr///
  isn't really a matching operator (it can be used to *count*, but
  that's not obvious to most people)
- remove nonsensical VOS example that claims to check the architecture
  by examining @INC but doesn't actually use @INC or check the
- 'chown' can't be both "not implemented" and "implemented, but does
  nothing" on Win32
- remove "semantics of raise()" wording from 'kill' because it's unclear
  (raise doesn't send a signal to another process anyway)
- remove 'sockatmark' entry because there is no such built-in function
  (the closest thing I can find is IO::Socket->atmark, which already
  carries appropriate portability warnings)
- in 'stat', consistently refer to fields by their names from
- add myself to list of contributors

2 years agofix version numbering for dist/PathTools
Tony Cook [Fri, 29 Jul 2016 23:32:03 +0000 (09:32 +1000)] 
fix version numbering for dist/PathTools

I messed up my search and replace and didn't notice it when

2 years agolocale.c: Revamp my_strerror() for thread-safeness
Karl Williamson [Wed, 20 Jul 2016 16:33:40 +0000 (10:33 -0600)] 
locale.c: Revamp my_strerror() for thread-safeness

This commit is the first step in making locale handling thread-safe.

[perl #127708] was solved for 5.24 by adding a mutex in this function.
That bug was caused by the code changing the locale even if the calling
program is not consciously using locales.

Posix 2008 introduced thread-safe locale functions.  This commit changes
this function to use them if the perl is threaded and the platform has
them available.  This means that the mutex is avoided on modern

It restructures the function to return a mortal copy of the error
message.  This is a step towards making the function completely thread
safe.  Right now, as documented, if you do 'use locale', locale handling
isn't thread-safe.

A global C locale object is created and used here if necessary.  It is
destroyed at the end of the program.

Note that some platforms have a strerror_r(), which is automatically
used instead of strerror() if available.  It differs form straight
strerror() by taking a buffer to place the returned string, so the
return does not point to internal static storage.  One could test for
the existence of this and avoid the mortal copy.

2 years agot/ Increase Darwin stack size
Karl Williamson [Fri, 29 Jul 2016 03:19:24 +0000 (21:19 -0600)] 
t/ Increase Darwin stack size

The next commit causes one test in the suite to use more than the
previously allowed  max.

2 years agot/lib/warnings/pp_pack: Redundant tests
Father Chrysostomos [Fri, 29 Jul 2016 17:44:01 +0000 (10:44 -0700)] 
t/lib/warnings/pp_pack: Redundant tests

This commit:

commit 533367d84727b326a81c972a3555d6a7847a4558
Author: Jarkko Hietaniemi <>
Date:   Sun Jun 24 22:24:49 2001 +0000

    Move the pack warnings to their own file, as pointed
    out by Spider.

copied several tests into pp_pack which have nothing to do with pack.  Most of them were still in pp, and were thus redundant.  The ‘Use of uninitialized value $a in scalar dereference’ test was removed from pp, but I see now that there is a nearly identical test elsewhere in pp, added by this commit:

commit 3b434eb14b7fab4ed6941403c71b683066ab60a2
Author: Rafael Garcia-Suarez <>
Date:   Tue Sep 18 00:48:05 2001 +0200

    new tests
    Message-Id: <20010917224805.C11744@rafael>

2 years agoAvoid emitting pack("p",...) warning erroneously
Father Chrysostomos [Fri, 29 Jul 2016 17:41:18 +0000 (10:41 -0700)] 
Avoid emitting pack("p",...) warning erroneously

A value may legitimately be marked SvTEMP even when it is not about
to be freed.

2 years agohandy.h: Add missing parens in macro
Karl Williamson [Fri, 29 Jul 2016 19:15:57 +0000 (13:15 -0600)] 
handy.h: Add missing parens in macro

These should have been in the recent commit

2 years agoNew bug numbers in *.[ch]
Father Chrysostomos [Fri, 29 Jul 2016 15:56:37 +0000 (08:56 -0700)] 
New bug numbers in *.[ch]

perl -pi -e 'BEGIN { %map = split " ", join "", `cat pb2rt.txt` } s/(?<!\d)\d{8}\.\d{3}(?!\d)/$& (#$map{$&})/g' *.[ch]

2 years agoNew bug numbers in lib/ and dist/, too
Father Chrysostomos [Fri, 29 Jul 2016 15:55:37 +0000 (08:55 -0700)] 
New bug numbers in lib/ and dist/, too

This is my quick-and-dirty script:

find dist -print0 | xargs -0 perl -pi -e 'BEGIN { %map = split " ", join "", `cat pb2rt.txt` } s/(?<!\d)\d{8}\.\d{3}(?!\d)/$& (#$map{$&})/g'

2 years agoTired of looking up old bug numbers
Father Chrysostomos [Fri, 29 Jul 2016 15:38:11 +0000 (08:38 -0700)] 
Tired of looking up old bug numbers

Some of this is ugly, but that’s because I wrote a one-liner to do
it.  It’s good enough for practical purposes.

2 years agoUpdate Module-Load-Conditional to CPAN version 0.68
Chris 'BinGOs' Williams [Fri, 29 Jul 2016 12:10:36 +0000 (13:10 +0100)] 
Update Module-Load-Conditional to CPAN version 0.68


0.68    Fri Jul 29 08:01:12 BST 2016

* Fix unconditional @INC localisation

2 years agoprint the pop @INC to OUT instead of STDOUT
Jarkko Hietaniemi [Fri, 29 Jul 2016 11:57:06 +0000 (07:57 -0400)] 
print the pop @INC to OUT instead of STDOUT

2 years agounimplemented_op does not implement pp_mapstart
Father Chrysostomos [Fri, 29 Jul 2016 06:46:30 +0000 (23:46 -0700)] 
unimplemented_op does not implement pp_mapstart

2 years agoPOSIX.xs: Make NV_PAYLOAD_SIZEOF_ASSERT static
Father Chrysostomos [Thu, 28 Jul 2016 19:55:48 +0000 (12:55 -0700)] 

so that we get the benefit of the assertions for non-debugging builds
but without any run-time penalty.

2 years agoMake switchDx.t more forgiving about newlines.
Craig A. Berry [Thu, 28 Jul 2016 19:08:15 +0000 (14:08 -0500)] 
Make switchDx.t more forgiving about newlines.

On VMS, the test suite collapses multiple newlines into one in
order to work around a bug in the pipe implementation, so the
test needs to allow for that.

2 years agohandy.h: Consolidate some EBCDIC vs ASCII paths
Karl Williamson [Thu, 28 Jul 2016 17:47:59 +0000 (11:47 -0600)] 
handy.h: Consolidate some EBCDIC vs ASCII paths

This removes some '#ifdef EBCDIC' so as to make more code common between
the platforms.  This is at the expense of some efficiency, but the
affected code only runs when compiling utilities, so ease of maintenance
wins out.

2 years agohandy.h: Add comment
Karl Williamson [Thu, 28 Jul 2016 17:43:54 +0000 (11:43 -0600)] 
handy.h: Add comment

2 years agohandy.h: Generate compile error if macros called wrong
Karl Williamson [Thu, 28 Jul 2016 17:40:50 +0000 (11:40 -0600)] 
handy.h: Generate compile error if macros called wrong

This extends the mechanism we added in 5.24 to more macros to make sure
that a macro is called with an integer and not a pointer.  It adds a

    "| 0"

to the macro parameter, which is illegal if the parameter is a pointer.

2 years agotoke.c: White-space only
Karl Williamson [Thu, 28 Jul 2016 17:39:40 +0000 (11:39 -0600)] 
toke.c: White-space only

re-wrap a comment.

2 years agoIncrease $POSIX::VERSION to 1.71
Father Chrysostomos [Thu, 28 Jul 2016 16:56:34 +0000 (09:56 -0700)] 
Increase $POSIX::VERSION to 1.71

2 years ago[perl #128763] Fix POSIX.xs longdbl assertion
Jarkko Hietaniemi [Thu, 28 Jul 2016 16:55:07 +0000 (09:55 -0700)] 
[perl #128763] Fix POSIX.xs longdbl assertion

2 years agot/lib/ Ignore .rej files
Father Chrysostomos [Thu, 28 Jul 2016 05:18:23 +0000 (22:18 -0700)] 
t/lib/ Ignore .rej files

2 years agoUpdate Module-Load-Conditional to CPAN version 0.66
Chris 'BinGOs' Williams [Thu, 28 Jul 2016 14:43:19 +0000 (15:43 +0100)] 
Update Module-Load-Conditional to CPAN version 0.66


0.66    Wed Jul 27 08:22:53 BST 2016

* Add FORCE_SAFE_INC option to fix CVE-2016-1238

2 years agoforgot the cfgvar
H.Merijn Brand [Thu, 28 Jul 2016 15:14:30 +0000 (17:14 +0200)] 
forgot the cfgvar

2 years agoFollow-up from backporting work
H.Merijn Brand [Thu, 28 Jul 2016 15:08:20 +0000 (17:08 +0200)] 
Follow-up from backporting work

2 years agoForce inclusion of I_XLOCALE until it is actually used
H.Merijn Brand [Thu, 28 Jul 2016 14:13:50 +0000 (16:13 +0200)] 
Force inclusion of I_XLOCALE until it is actually used

2 years ago[perl #128747] Fix line number bug with s//<<END/e
Father Chrysostomos [Thu, 28 Jul 2016 05:09:42 +0000 (22:09 -0700)] 
[perl #128747] Fix line number bug with s//<<END/e

In commit 6745174b561 I changed the multi_open and multi_close
parser pastruct members (known as PL_multi_open/close in toke.c) from
char to UV.

I failed to change the localization code in S_sublex_start:


So on big-endian architectures only the most significant byte would be
localized.  That meant that effectively no localization would happen
for ASCII string delimiters.

In S_sublex_done:

if (PL_multi_close == '<')
    PL_parser->herelines += l - PL_multi_end;

That LEAVE undoes the localization.  '<' for PL_multi_close is a spe-
cial value that can only happen for here-docs.   The ->herelines line
makes sure that line numbers are correct after a here-doc.

What ended up happening was that s//<<END/e would throw off line num-
bers after the here-doc body.  PL_multi_close would end up being set
to '<', not '/', when the lexer was finishing up the s///, so it
treated it like a here-doc and screwed things up.  This resulted in
the test failures in ticket #128747.

I found that we also had a bug on little-endian machines.  But to get
the localization of the *least* sigificant byte to screw things up,
you have to try something other than s//<<END/e:

use utf8;
#line 57
qq || }
warn;  # line 59

Replace the pipes with lightning bolts:

use utf8;
#line 57
qq ϟϟ }
warn;  # line 7

and you get line 7 instead of 59.  In this case, the inner construct
has a delimiter character whose code is > 255, but only the lower
8 bits get localized.  So when the localization unwinds, you get
ord("ϟ") & 0xff | ord("<") instead of just ord("<"), resulting in the
here-doc line number handling being skipped.

This commit fixes the localization and adds the little-endian test.

2 years agoUnmathomize save_iv
Father Chrysostomos [Thu, 28 Jul 2016 01:35:22 +0000 (18:35 -0700)] 
Unmathomize save_iv

I need to call it from toke.c.

2 years ago(perl #128438) build ppport.h instead of using a dummy file
Tony Cook [Wed, 22 Jun 2016 05:43:21 +0000 (15:43 +1000)] 
(perl #128438) build ppport.h instead of using a dummy file

The changes to parallelize win32 perl builds with dmake and gmake
assumed that ppport.h only provided macros and functions that are
already provided by the latest perl.

This turns out not to be the case, preventing the building of
a new Scalar-List-Utils with dmake and gmake.

I only briefly considered changing Scalar-List-Utils - the difference
in build systems is what lead to the failure, so properly build ppport.h
so that all Win32 builds have a full ppport.h just as POSIXish builds

2 years agoConfigure: note that the infnan tests may crash.
Jarkko Hietaniemi [Wed, 27 Jul 2016 11:04:02 +0000 (07:04 -0400)] 
Configure: note that the infnan tests may crash.

(And in VAX, that is exactly what happens with the infinities.)

2 years agoVAX: VAX format H
Jarkko Hietaniemi [Wed, 27 Jul 2016 02:10:30 +0000 (22:10 -0400)] 
VAX: VAX format H

2 years agoConfigure: VAX format H
Jarkko Hietaniemi [Wed, 27 Jul 2016 02:10:42 +0000 (22:10 -0400)] 
Configure: VAX format H

2 years agoVAX: catch vax floats beyond VMS or Ultrix
Jarkko Hietaniemi [Tue, 26 Jul 2016 01:50:32 +0000 (21:50 -0400)] 
VAX: catch vax floats beyond VMS or Ultrix

2 years agoVAX: document also formats S/T/X, and hidden bits
Jarkko Hietaniemi [Mon, 25 Jul 2016 22:57:41 +0000 (18:57 -0400)] 
VAX: document also formats S/T/X, and hidden bits

Though S, T, and X are not really pure VAX formats per se.

2 years ago[perl #128630] follow-up on 6151d433
Jarkko Hietaniemi [Tue, 26 Jul 2016 01:30:34 +0000 (21:30 -0400)] 
[perl #128630] follow-up on 6151d433

- test explicitly for $^O equivalence (faster, simpler),
  as suggested in #126380
- allow also \b-/i match of archname
- however, do not explicitly anchor the archname,
  as suggested in #126380, since if the regexp needs that, it can do so
- \Q-\E-protect the $^O, for paranoia
- for skip, use skip() instead of ok(1),
  pointed out privately by Dan Collins
- drop the newly added /xxx/ functionality to simplify things

2 years agoPATCH: [perl #128734] tr/\N{...}/ failing for 128-255
Karl Williamson [Wed, 27 Jul 2016 18:44:42 +0000 (12:44 -0600)] 
PATCH: [perl #128734] tr/\N{...}/ failing for 128-255

The upper latin1 characters when expressed as \N{U+...} were failing.
This was due to trying to convert them to UTF-8 when the result isn't
UTF-8.  I added a test for \N{name} as well, though these were not
affected by this regression.

2 years agoAdd tests for runaway q«« strings
Father Chrysostomos [Tue, 26 Jul 2016 21:27:23 +0000 (14:27 -0700)] 
Add tests for runaway q«« strings

fixed by cb65013.

2 years agoHandle missing Unicode heredoc terminators correctly
Father Chrysostomos [Tue, 26 Jul 2016 17:06:46 +0000 (10:06 -0700)] 
Handle missing Unicode heredoc terminators correctly

2 years ago[perl #128701] Fix err msg for Unicode delimiters
Father Chrysostomos [Tue, 26 Jul 2016 08:46:23 +0000 (01:46 -0700)] 
[perl #128701] Fix err msg for Unicode delimiters

The output of

    perl -CS -e 'use utf8; q«'

is now correctly:

    Can't find string terminator "«" anywhere before EOF at -e line 1.

Previously, the first byte of the delimiter (as encoded in UTF-8)
would be used instead:

    Can't find string terminator "Â" anywhere before EOF at -e line 1.

2 years agoparser.h: Use UV for string delims
Father Chrysostomos [Tue, 26 Jul 2016 07:47:16 +0000 (00:47 -0700)] 
parser.h: Use UV for string delims

We will need to store characters > 255 in here.

Also, cast accordingly in toke.c.

2 years ago(perl #127384)(CVE-2016-1238) port forward changes from maint
Tony Cook [Tue, 26 Jul 2016 06:15:33 +0000 (16:15 +1000)] 
(perl #127384)(CVE-2016-1238) port forward changes from maint

Some of these changes are unnecessary if we remove the default . from
@INC for 5.26.

2 years ago(perl #127834) update CUSTOMIZED entries
Tony Cook [Tue, 26 Jul 2016 05:36:15 +0000 (15:36 +1000)] 
(perl #127834) update CUSTOMIZED entries

2 years agocpan/: bump $VERSION as needed
Tony Cook [Tue, 26 Jul 2016 05:21:25 +0000 (15:21 +1000)] 
cpan/: bump $VERSION as needed