fix change description has incorrect proto

The incompatible change deals with the (*) proto
Make repeat op tree more consistent

Formerly, ck_repeat would sometimes make the right-hand argument of
list repetition accessible via cBINOPo->op_last and sometimes via
cLISTOPx(cBINOP->op_first)->op_last.

In the case of ($x)x1,

  repeat
    rv2sv
      gv
    const

would become

  repeat
    ex-list
      pushmark
      rv2sv
        gv
      const

while in the case of ($x,$y)x1,

  repeat
    list
      pushmark
      rv2sv
        gv
      rv2sv
        gv
    const

would just have the list changed to an ex-list.

Having the right-hand argument accessible from two different places
makes things more complicated elsewhere in op.c, so keep the second
kid where it was.

The old approach was to detach all kids, and then wrap them in a list
op if the first kid was not a list already.  Instead, just detach the
first kid.
Deparse list repetition assignment properly

This only applies to the almost useless case of nothing but a repetition
on the lhs of list assignment:  ((undef)x3) = foo();

Other cases where the repetition is part of a larger list already
deparsed correctly.

Checking whether the lhs begins with a parenthesis is not sufficient
to determine whether the lhs is parenthesized.  I believe repetition
is the only binary op other than the comma that is allowed on the
lhs, so we can just check for that in the op tree.
Optimise ($foo)x1 and ($foo)x0 in list cx

If the repeat count is 1, then we simply remove the repetition operator
and have the ops of the lhs evaluated, regardless of what they are.

If the repeat count is 0, then we only optimise if the lhs is a simple
scalar or constant.  We optimise the whole thing down to the empty
list.

This only happens currently for integer constants on the right-
hand side.

In the 0 case it could be extended to multiple scalars/constants, but
that would be more work.
toke.c: Report the proper type for assign ops

For combined assignment operators like *= and +=, the lexer passes an
ASSIGNOP token to the parser, but the -DT output said MULOP or ADDOP;
i.e., it was reporting the type *before* the check for a following
‘=’, instead of after it.
Import Test-More 1.301001 alpha 63
add t/perf/, t/perf/opcount.t

Add a new directory designed to hold performance / optimising tests
and infrastructure, and add the first test file, opcount.t, that
checks that a sub has the right numbers of particular op types
rename t/op/opt.t -> t/perf/optree.t

Now that we have a directory, t/perf/, for perfomance /optimsation
tests, move this test file there, and rename to something slightly
clearer.
t/perf/optree.t: expand blurb

explain (kind of) why this file is called optree.t
add t/perf/speed.t

This test file is similar to /re/speed.t, but to test general-purpose
optimisations.

The idea is to run snippets of code that are 100s or 1000s times slower
if a particular optimisation is broken. We are not so much interested
in the individual tests passing, as in the whole file failing with a
watchdog timeout (or just observing that it running more slowly)
add t/perf/benchmarks, t/perf/benchmarks.t

t/perf/benchmarks is a file intended to contain snippets of code
that can be usefully benchmarked or otherwise profiled.

The basic idea is that any time you add an optimisation that is intended
to make a particular construct faster, then you should add that construct
to this file.

Under the normal test suite, the test file benchmarks.t does a basic
compile and run of each of these snippets; not to test performance,
but just to ensure that the code doesn't have errors.

Over time, it is intended that various measurement and profiling tools
will be written that can run selected (or all) snippets in various
environments. These will not be run as part of a normal test suite run.
add note about t/perf/ to t/README
fix 't/TEST -benchmark'

This has never worked, as it would look for t/benchmark/*.t files in
the wrong place.
[MERGE] add t/perf/ hierarchy

Add some new files that help with testing and measuring
performance-related issues.
rename convert to op_convert_list and APIfy
fix type incompatibilities between format strings/args

Building a debugging perl triggered warnings such as

warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘U32’
warning: field width specifier ‘*’ expects argument of type ‘int’, but argument 5 has type ‘long unsigned int’
warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 3 has type ‘wchar_t’
Test file fails to compile.

For: RT #123057
[perl #123057] Allow split-to-array in lvalue context

In some cases @a=split gets optimised to something akin to split(\@a,
...) or split(..., \@a), so lvalue context applied to it sees a split
op instead of a list assignment.  And split can’t be assigned to.  So (@a=split//,"foo")=bar() fails.  This bug probably goes back to perl
3, when this optimisation was added.

(Actually, the array is usually stowed away in the pushre op that
holds the regular expression, though sometimes it becomes the last
argument.)

Recent commits such as ef7999f have extended this optimisation, so
it happens in more places, and ended up breaking chomp(my @array =
split...).

This commits checks specifically for split-to-array when lvalue con-
text is applied.
PerlIO_list_push() accepts a non-const PerlIO_funcs pointer

but under -DPERL_GLOBAL_STRUCT_PRIVATE, most PerlIO_funcs objects
and pointers are const, so cast to match the function parameter.

This was broken by f814d560e84f which changed from looking up the
layer by the name in tab (or osLayer) to adding those directly.
Update experimental to CPAN version 0.013

  [DELTA]

0.013     2014-10-25 21:54:47+02:00 Europe/Amsterdam
          Rename lvalue_refs to refaliasing