This is a live mirror of the Perl 5 development currently hosted at
7 years agoUse sv_catpvn instead of sv_catsv in doop.c:do_join
Father Chrysostomos [Sat, 18 Oct 2014 01:14:40 +0000 (18:14 -0700)]
Use sv_catpvn instead of sv_catsv in doop.c:do_join

Bunchmarking shows that SvPV+sv_catpvn is faster that sv_catsv.  Why
exactly I don’t know, but perhaps fewer functions and flag checks
are the cause.

7 years agoUpdate Perl 5 Porter list archives.
James E Keenan [Thu, 16 Oct 2014 23:07:59 +0000 (19:07 -0400)]
Update Perl 5 Porter list archives.

For: RT # 122996

7 years agoAllow void padrange even without nextstate
Father Chrysostomos [Fri, 17 Oct 2014 20:56:52 +0000 (13:56 -0700)]
Allow void padrange even without nextstate

This allows the padrange optimisation to happen with code like this:

    my ($a, $b), our $c;

The padrange optimisation looks for:


if it is in void context.

padsv pushes an sv on to the stack, and then nextstate resets the
stack.  padrange doesn’t bother pushing in void context, which is why
this optimisation was written this way.

However, there are various ops that don’t bother touching the stack in
void context, for efficiency; conversely, there are many that do for
simplicity’s sake.  In all cases, however, things pushed in void con-
text are subsequently reset, usually by list/nextstate/leavesub,
before they can accidentally become part of a list.  So whether pad-
range pushes SVs or not in void context is irrelevant, and it does not
matter whether there is a nextstate op.

Further, this optimisation also allowed:


pushmark and list ops cancel each other out in list and void context.
padrange does not push a mark in void context, so the list is removed
from the execution chain.  That was also happening for a nulled list,
which is incorrect, as that means a lone pushmark is being removed.  I
don’t believe ex-list+pushmark ever occurs in void context, but if it
does then this code was wrong.

7 years agoop.c: Change a pushre if into assert()
Father Chrysostomos [Fri, 17 Oct 2014 20:21:59 +0000 (13:21 -0700)]
op.c: Change a pushre if into assert()

7 years agoSkip padrange optimisation for one padop
Father Chrysostomos [Fri, 17 Oct 2014 20:07:31 +0000 (13:07 -0700)]
Skip padrange optimisation for one padop

cachegrind shows that padrange is marginally slower than pushmark+padsv

7 years agoB::Concise: Dump private vars for null ops
Father Chrysostomos [Fri, 17 Oct 2014 00:53:54 +0000 (17:53 -0700)]
B::Concise: Dump private vars for null ops

This can be very helpful for debugging.  For null ops that were not
always null, output the private flags as we would for unnulled ops.

7 years agofix some recent compiler warnings
David Mitchell [Fri, 17 Oct 2014 11:16:40 +0000 (12:16 +0100)]
fix some recent compiler warnings

Currently DBVARMG_SINGLE is deffed to 0, so

    mg->mg_private >= DBVARMG_SINGLE

gives an 'always true' warning.

sv_magicext's last arg is supposed to to be I32, but ARGTARG is a U32 or

7 years agoe2a5b7204 made dVAR necessary also for unthreaded builds.
Jarkko Hietaniemi [Fri, 17 Oct 2014 10:56:34 +0000 (06:56 -0400)]
e2a5b7204 made dVAR necessary also for unthreaded builds.

7 years ago[perl #122995] Hang with while(1) in a sub-list
Father Chrysostomos [Fri, 17 Oct 2014 00:44:56 +0000 (17:44 -0700)]
[perl #122995] Hang with while(1) in a sub-list

It was hanging at compile time in some cases, e.g.:

sub foo { () = ($a, my $b, ($c, do { while(1) {} })) }

The optimisation added in 5.20 to turn list+pushmark into null ops
when they are in list context (effectively making ($a,($b,$c)) equiva-
lent to ($a,$b,$c) with regard to which ops are executed) followed
op_next pointers to find the last op that was a kid of the sublist.

You can’t just follow op_next pointers like that, because it will loop
at compile time on infinite loops like while (1){}.

In this case, the last kid was being found in order to elide the erst-
while list op from the op_next chain, but that is not necessary, since
later OP_NULL handling takes care of it anyway.

7 years agoImprove void varop optimisation
Father Chrysostomos [Thu, 16 Oct 2014 23:18:59 +0000 (16:18 -0700)]
Improve void varop optimisation

After eliding the varop, the optimisation added in 5afbd733 repro-
cesses the previous op if it is a nextstate op.  But it was doing this
by setting the current op to the one before the nextstate, so that the
o=o->op_next in the loop header would cause it to reprocess the next-
state in the next iteration.  So, if that nextstate op were at the
beginning of a subroutine, the optimisation would be skipped, and this
would still execute two nextstate ops in a row:

sub foo {
    our($a, $b);

So, instead, just use ‘goto’ to reprocess the op, and we can do it
even if there is no op before the nextstate.

7 years agosv.c:sv_catsv: Remove null check
Father Chrysostomos [Thu, 16 Oct 2014 15:28:29 +0000 (08:28 -0700)]
sv.c:sv_catsv: Remove null check

SvPV always returns something.  If it didn’t, we’d be crashing all
over the place, since most other code assumes it does.

7 years agopodcheck.t: Make pod name check less sensitive
Father Chrysostomos [Thu, 16 Oct 2014 15:25:20 +0000 (08:25 -0700)]
podcheck.t: Make pod name check less sensitive

I regularly find myself ignoring the pod name failure after tweaking
the pod or rebasing and not re-running make.  ‘Known’ test failures
are not a good thing.

7 years agoperldelta: reword an entry
Father Chrysostomos [Thu, 16 Oct 2014 12:49:13 +0000 (05:49 -0700)]
perldelta: reword an entry

It was not completely correct, and trying to get it correct is too

7 years agoperldelta for our declarations
Father Chrysostomos [Thu, 16 Oct 2014 12:48:18 +0000 (05:48 -0700)]
perldelta for our declarations

f5b5c2a Simplify double-nextstate optimisation
5afbd73 Elide our($foo) from execution order in void cx
8717a76 op.c: Null list and pushmark in void cx

7 years agoUpdate Test-Simple to CPAN version 1.001008
Chris 'BinGOs' Williams [Thu, 16 Oct 2014 12:15:02 +0000 (13:15 +0100)]
Update Test-Simple to CPAN version 1.001008


1.001008     Wed Oct 15 20:10:22:00 PST 2014
    * Updated Changes file

1.001007     Wed Oct 15 16:37:11:00 PST 2014
    * Fix subtest name when skip_all is used

7 years agoUpdate B-Debug to CPAN version 1.22
Chris 'BinGOs' Williams [Thu, 16 Oct 2014 11:29:13 +0000 (12:29 +0100)]
Update B-Debug to CPAN version 1.22


1.22 2014-10-12 rurban
  * add 5.21.5 support: changed test, from blead for split optim.,
    added METHOP
  * print 0x00000000 as 0x0
  * add -d -MOd=Debug support
  * README: fixed copyright date

7 years agoUpdate experimental to CPAN version 0.012
Chris 'BinGOs' Williams [Thu, 16 Oct 2014 11:27:15 +0000 (12:27 +0100)]
Update experimental to CPAN version 0.012


0.012     2014-10-12 12:10:06+02:00 Europe/Amsterdam
          Added lvalue references feature

7 years agoop.c: Null list and pushmark in void cx
Father Chrysostomos [Thu, 16 Oct 2014 03:37:30 +0000 (20:37 -0700)]
op.c: Null list and pushmark in void cx

See 7d3c8a6837 for the explanation.

‘our($foo,$bar);’ is one example of the legitimate use of list+push-
mark in void context.

Here, we can null them and remove them from the execution order, since
they are not necessary.

We only do this if this is an op sequence that padrange would not
optimise, since padrange needs a pushmark, and we don’t want to
disable it.

This combined with other recent optimisations makes code like this:

    our ($foo,@bar,%baz);
    our $a;
    our ($b,$c);

skip straight over all those variable declarations at run time, going
straight to the ‘die’.

7 years agoElide our($foo) from execution order in void cx
Father Chrysostomos [Wed, 15 Oct 2014 19:58:18 +0000 (12:58 -0700)]
Elide our($foo) from execution order in void cx

our($foo) in void context has a compile-time affect but no run-item
effect, except to execute ops needlessly.  There is no need to execute
those ops.  We can simply remove them from the execution order.

‘our($foo,$fit,$far);’ still leaves a list and a pushmark, which I
plan to eliminate in the next commit.

‘our $foo; our $bar; our $baz;’ has no run-time cost now, because,
once the variables are eliminated, the nextstate ops in betwen them,
now adjacent, are also eliminated by another optimisation.

7 years agort122747.t needs Unicode tables.
Jarkko Hietaniemi [Wed, 15 Oct 2014 02:52:28 +0000 (22:52 -0400)]
rt122747.t needs Unicode tables.

7 years agoeintr.t needs Fcntl.
Jarkko Hietaniemi [Wed, 15 Oct 2014 02:50:34 +0000 (22:50 -0400)]
eintr.t needs Fcntl.

7 years agoIrix: note that prctl comes in different incompatible flavors.
Jarkko Hietaniemi [Mon, 13 Oct 2014 00:44:02 +0000 (20:44 -0400)]
Irix: note that prctl comes in different incompatible flavors.

7 years agoIrix: <float.h> thinks double-double has 107 bits of mantissa.
Jarkko Hietaniemi [Wed, 15 Oct 2014 22:26:41 +0000 (18:26 -0400)]
Irix: <float.h> thinks double-double has 107 bits of mantissa.

As opposed to 106.

Also add comment about the sizeof 12 versus 16 for x86 80-bit format.

7 years agoIrix: MIPSpro 7.4 compiler has broken memcmp.
Jarkko Hietaniemi [Wed, 15 Oct 2014 02:47:33 +0000 (22:47 -0400)]
Irix: MIPSpro 7.4 compiler has broken memcmp.

(Supposedly 7.4.1m is okay in this regard, and there is also 7.5.)

The commit that 'broke' Perl build on IRIX was 57620943
which of course wasn't to blame, the IRIX compiler was.
(Symptom: miniperl crashing, can be narrowed to just /[[:alpha:]]/)

Furthermore: IRIX build was also earlier broken for a long time by
another problem (in the preprocessor), see for example perl #33849.
(Symptom: compile failing in gv.c RvDEEPCP)

Summary: building Perls on IRIX needs either this very commit,
or undoing the 57620943 (for the memcmp brokenness), and possibly
applying both the c297d531 and 08c5d564 (for the cpp brokenness).
(The latter were applied between 5.10.0 and 5.10.1.)

7 years agoModernized an example in perlipc.pod.
Shlomi Fish [Fri, 10 Oct 2014 07:12:09 +0000 (10:12 +0300)]
Modernized an example in perlipc.pod.

1. Convert to use strict + use warnings.

2. Changed a while(++ loop) to while(1) { ++ }.

Committer revised patch per suggestions in RT # 122938.

7 years agoFix typo in 4cad5dc8's perldelta for 157fb5a
Dagfinn Ilmari Mannsåker [Wed, 15 Oct 2014 10:15:53 +0000 (11:15 +0100)]
Fix typo in 4cad5dc8's perldelta for 157fb5a

For: RT # 122981

7 years agoDeparse join("", pos) correctly
Father Chrysostomos [Wed, 15 Oct 2014 05:52:29 +0000 (22:52 -0700)]
Deparse join("", pos) correctly

I optimised join into stringify if it had a list of one scalar-
returning op.

$ ./perl -Ilib -MO=Deparse -e '$_ = join $foo, $bar'
$_ = "$bar";
-e syntax OK

The problem, though, is that we now create op trees that didn’t happen
before,* and B::Deparse can’t handle them correctly:

$ ./perl -Ilib -MO=Deparse -e '$_ = join $foo, pos'
$_ = "pos($_)";
-e syntax OK

So we need to turn that into:

$_ = join('???', pos);

* Actually, in 5.8 it was possible to interpolate arbitrary expres-
sions after ‘$_[0]->’:

$_ = "\n,rekcah lreP rehtona tsuJ"; sub a{chop}
print "${[bless[]]}[0]->a . reverse $_";

And that, consequently, did not deparse properly.

7 years agoChange OA_DANGEROUS description in regen/opcode*
Father Chrysostomos [Wed, 15 Oct 2014 04:56:25 +0000 (21:56 -0700)]
Change OA_DANGEROUS description in regen/opcode*

‘Has side effects’ can be misleading.  The OA_DANGEROUS flag is only
used by the common-vars search that checks to see whether it is possi-
ble to skip making temporary copies.

We have to make copies in cases like this:

   ($a,$b) = func();

because func() could return ($b,$a).

If any op on either side is marked OA_DANGEROUS and not handled spe-
cially in op.c:S_aassign_scommon_vars, then it is assumed it could
return a scalar that is also elsewhere in the list, so a temp copy
is needed.

(I think some of the existing ops with this flag could drop it.)

7 years agoSimplify double-nextstate optimisation
Father Chrysostomos [Tue, 14 Oct 2014 03:37:29 +0000 (20:37 -0700)]
Simplify double-nextstate optimisation

Executing two nextstate ops in a row is equivalent to executing just
the second, so the peephole optimiser eliminates one of them.

The double-nextstate optimisation seems to have been written under
the assumption that the current op cannot be elided from the op_next
change, which is untrue, as we have oldop (the previous op in
the chain).

If the current op and the one following it are both nextstate ops,
then the contents of the second are moved over to the first and the
second is nulled.  Then current_op->op_next is adjusted to skip over
the newly-nulled op.

The the next op in the chain, the one that the first nextstate op now
points to, is processed.

The result is that every other nextstate in sequence of three or more
would be elided:

1        <;> nextstate(main 1 -e:1) v ->2
-        <0> ex-const v ->-
-        <0> null v ->-
-        <0> ex-const v ->2
2        <;> nextstate(main 1 -e:1) v:{ ->3
-        <0> ex-const v ->-
-        <0> null v ->-
-        <0> ex-const v ->3
3        <;> nextstate(main 1 -e:1) v:{ ->4
-        <0> ex-const v ->-
-        <0> null v ->-
-        <0> ex-const v ->4
4        <;> nextstate(main 1 -e:1) v:{ ->5

We don’t need to go through the complication of making the first next-
state equivalent to the second.  Just null the first one and adjust
the previous op’s pointer (oldop->op_next) to point to the second one.

Now all consecutive nextstates get nulled except the last:

-        <0> ex-nextstate v ->-
-        <0> ex-const v ->-
-        <0> ex-nextstate v ->-
-        <0> ex-const v ->-
-        <0> ex-nextstate v ->-
-        <0> ex-const v ->-
-        <0> ex-nextstate v ->-
-        <0> ex-const v ->-
-        <0> ex-nextstate v ->1
-        <0> ex-const v ->-
-        <0> ex-nextstate v ->1
-        <0> ex-const v ->1
1        <;> nextstate(main 1 -e:1) v:{ ->2

The only visible difference this makes is in B::Deparse output, but
this changed in 5.14 when the optimisation was first introduced, so I
think changing it again is acceptable:

$ perl5.12.4 -MO=Deparse -e 'use strict; 0; use warnings; 0'
use strict 'refs';
use warnings;
-e syntax OK

$ perl5.14.4 -MO=Deparse -e 'use strict; 0; use warnings; 0'
use warnings;
use strict 'refs';
-e syntax OK

$ ./perl -Ilib -MO=Deparse -e 'use strict; 0; use warnings; 0'
use warnings;
use strict;
-e syntax OK

7 years agoperldelta for 594b6face91a
Tony Cook [Wed, 15 Oct 2014 00:44:34 +0000 (11:44 +1100)]
perldelta for 594b6face91a

7 years agotreat fatal warnings after syntax errors as syntax errors
Lukas Mai [Sun, 12 Oct 2014 17:01:09 +0000 (19:01 +0200)]
treat fatal warnings after syntax errors as syntax errors

7 years agofix comment from commit f4eedc6b8c
Daniel Dragan [Tue, 14 Oct 2014 10:25:51 +0000 (06:25 -0400)]
fix comment from commit f4eedc6b8c

7 years agofix op.c under -DPERL_GLOBAL_STRUCT
David Mitchell [Tue, 14 Oct 2014 11:45:24 +0000 (12:45 +0100)]
fix op.c under -DPERL_GLOBAL_STRUCT

7 years agothreads: $#shared = N should destroy
David Mitchell [Tue, 14 Oct 2014 11:26:13 +0000 (12:26 +0100)]
threads: $#shared = N should destroy

When shrinking a shared array by setting $#shared = N,
any freed elements should trigger destructors if they are objects,
but they weren't.

This commit extends the work done by 7d585d2f3001 (which created tmp
proxys when abandoning elements of arrays and hashes) to the STORESIZE
method, which is what is triggered by $#a assignment (and indirectly by
undef @a).

7 years agothreads::shared "$#shared = N" off-by-one error
David Mitchell [Mon, 13 Oct 2014 11:45:14 +0000 (12:45 +0100)]
threads::shared "$#shared = N" off-by-one error

RT #122950

    my @a : shared;
    $#a = 3;  # actually set it to 4

There was a simple off-by-one error in the XS code that handled the
STORESIZE tie method (confusing the array size and fill, which differ
by 1).

Amazingly, there was no test for it, and no-one had noticed up until now.

Note that this commit causes three tests in object2.t to fail: this
is because fixing the $#shared bug exposed another bug that was being
masked by this one. They will be fixed in the next commit

7 years agoperldelta for cae71c5daa29
Tony Cook [Tue, 14 Oct 2014 00:48:33 +0000 (11:48 +1100)]
perldelta for cae71c5daa29

7 years agodeprecate POSIX::tmpnam
Tony Cook [Thu, 2 Oct 2014 03:40:22 +0000 (13:40 +1000)]
deprecate POSIX::tmpnam

This patch avoids repeating the deprecation warning if the same tmpnam()
call is executed multiple times.

7 years agoaelemfast_lex in aassign_common_vars_aliases_only
Father Chrysostomos [Mon, 13 Oct 2014 21:48:13 +0000 (14:48 -0700)]
aelemfast_lex in aassign_common_vars_aliases_only

S_aassign_common_vars_aliases_only needs to handle aelemfast_lex,
otherwise we miss some rare cases where we have aliased scalars and
elements on both sides of the assignment.

7 years agoHandle aelemfast_lex in S_aassign_common_vars
Father Chrysostomos [Mon, 13 Oct 2014 21:46:53 +0000 (14:46 -0700)]
Handle aelemfast_lex in S_aassign_common_vars

This was a missed opportunity for optimisation.  Prior to be9de18 it
was optimised, because S_aassign_common_vars was called earlier in
the compilation phase, before the aelemfast optimisation.

7 years agoop.c: Skip priv flags assert if ppaddr changes
Father Chrysostomos [Mon, 13 Oct 2014 19:35:49 +0000 (12:35 -0700)]
op.c: Skip priv flags assert if ppaddr changes

because an XS module is probably installing its own ppaddr, in which
case it knows more about the private flags than we do.

7 years agospeed up building with less disk IO pod moves+__END__+misc
Daniel Dragan [Sun, 12 Oct 2014 07:42:38 +0000 (03:42 -0400)]
speed up building with less disk IO pod moves+__END__+misc

In, dont search for pwd on Win32.

Also trim down the list of makefile suffixes on Win32 so it doesn't try
searching for av.pas and perl.f90 and hash.cbl on disk.

Add __END__ tokens to stop the last read() call on the handle which
returns 0 bytes at EOF.

7 years agoremove excess whitespace from
Daniel Dragan [Mon, 13 Oct 2014 02:42:15 +0000 (22:42 -0400)]
remove excess whitespace from

Some lines end with spaces, remove that, use tabs instead of spaces in code
so the perl code is less bytes to read from disk. This patch saved 183
bytes. Part of [perl #122955].

7 years agomove POD in to end of file to reduce module load I/O calls
Daniel Dragan [Mon, 13 Oct 2014 01:57:01 +0000 (21:57 -0400)]
move POD in to end of file to reduce module load I/O calls is the hottest file/takes the most read() calls of any
module during a make all. By moving POD to the end, ~40KB of OS read()
IO was reduced to ~16KB of OS read() IO calls. Also the parser doesn't need
to search for Perl code in the POD further lessining load time because of
the __END__ token. Filed as [perl #122955].

7 years agosilence warning after "Fold join to const or stringify where possible"
Daniel Dragan [Mon, 13 Oct 2014 19:20:30 +0000 (15:20 -0400)]
silence warning after "Fold join to const or stringify where possible"

VC 2003
op.c(4022) : warning C4244: '=' : conversion from 'unsigned short' to
'char', possible loss of data

7 years ago[perl #122965] aelemfast in list assignment
Father Chrysostomos [Mon, 13 Oct 2014 15:27:02 +0000 (08:27 -0700)]
[perl #122965] aelemfast in list assignment

I accidentally broke ($_[0],$_[1])=($_[1],$_[0]) in be9de18, which was
only supposed to be a refactoring.  Since it now happens later in the
compilation phase when optimisations like aelemfast have happened, the
search for common vars needs to take aelemfast into account.

7 years agoperldelta for 73f4c4f
Father Chrysostomos [Mon, 13 Oct 2014 06:22:39 +0000 (23:22 -0700)]
perldelta for 73f4c4f

7 years agoperldelta for 987c969
Father Chrysostomos [Mon, 13 Oct 2014 06:20:27 +0000 (23:20 -0700)]
perldelta for 987c969

7 years agoperldelta for afc8007
Father Chrysostomos [Mon, 13 Oct 2014 06:17:44 +0000 (23:17 -0700)]
perldelta for afc8007

7 years agoperldelta for split-to-array
Father Chrysostomos [Mon, 13 Oct 2014 06:16:35 +0000 (23:16 -0700)]
perldelta for split-to-array

4ecee20 op.c: Distangle split and common-vars
fd017c0 Optimise @lexarray = split...
ef7999f Optimise my(@array)=split
4574270 opt.t: Test split-to-array optimisation

7 years agoperldelta for 821956c
Father Chrysostomos [Mon, 13 Oct 2014 06:11:16 +0000 (23:11 -0700)]
perldelta for 821956c

7 years agoperldelta for de183bb
Father Chrysostomos [Mon, 13 Oct 2014 06:08:58 +0000 (23:08 -0700)]
perldelta for de183bb

7 years agoperldelta for bcff414
Father Chrysostomos [Mon, 13 Oct 2014 06:06:23 +0000 (23:06 -0700)]
perldelta for bcff414

7 years agoperldelta for deparsing with CORE:: prefix
Father Chrysostomos [Mon, 13 Oct 2014 06:05:47 +0000 (23:05 -0700)]
perldelta for deparsing with CORE:: prefix

3188a82 Deparse with CORE:: to avoid lex sub conflicts
e54915d Deparse sub calls quietly
7741cee Finish deparsing ‘my sub if; CORE::if...’

7 years agoperldelta for a21eb52
Father Chrysostomos [Mon, 13 Oct 2014 06:02:05 +0000 (23:02 -0700)]
perldelta for a21eb52

7 years agoperldelta for 4c62787/#122771
Father Chrysostomos [Mon, 13 Oct 2014 06:00:40 +0000 (23:00 -0700)]
perldelta for 4c62787/#122771

7 years agoperldelta for f8a7cce and 88a758b
Father Chrysostomos [Mon, 13 Oct 2014 05:57:50 +0000 (22:57 -0700)]
perldelta for f8a7cce and 88a758b

7 years agoperldelta for 2258401
Father Chrysostomos [Mon, 13 Oct 2014 05:56:11 +0000 (22:56 -0700)]
perldelta for 2258401

7 years agoperldelta for f351564 and 5f4d849
Father Chrysostomos [Mon, 13 Oct 2014 02:39:36 +0000 (19:39 -0700)]
perldelta for f351564 and 5f4d849

7 years agoperldelta for c8ec376
Father Chrysostomos [Mon, 13 Oct 2014 02:39:09 +0000 (19:39 -0700)]
perldelta for c8ec376

7 years agoperldelta for c997e36 and 6bd144e0f
Father Chrysostomos [Mon, 13 Oct 2014 02:28:52 +0000 (19:28 -0700)]
perldelta for c997e36 and 6bd144e0f

7 years agoperldelta for 157fb5a
Father Chrysostomos [Mon, 13 Oct 2014 01:11:48 +0000 (18:11 -0700)]
perldelta for 157fb5a

7 years agoperldelta for 1e9a122
Father Chrysostomos [Mon, 13 Oct 2014 01:09:10 +0000 (18:09 -0700)]
perldelta for 1e9a122

7 years agoperldelta for 8fb0127
Father Chrysostomos [Mon, 13 Oct 2014 01:07:12 +0000 (18:07 -0700)]
perldelta for 8fb0127

7 years agoUpdate perlguts for PADMY changes
Father Chrysostomos [Mon, 13 Oct 2014 01:05:45 +0000 (18:05 -0700)]
Update perlguts for PADMY changes

7 years agoperlguts typo
Father Chrysostomos [Mon, 13 Oct 2014 01:04:38 +0000 (18:04 -0700)]
perlguts typo

7 years agoperldelta for PADMY changes
Father Chrysostomos [Mon, 13 Oct 2014 01:02:44 +0000 (18:02 -0700)]
perldelta for PADMY changes

145bf8e Remove most uses of PADMY
a9f1090 Peek.t should not expect PADMY under 5.21.5
c068384 Stop setting PADMY; renumber PADSTALE

7 years agoperldelta for ecf05a5
Father Chrysostomos [Mon, 13 Oct 2014 01:01:19 +0000 (18:01 -0700)]
perldelta for ecf05a5

7 years agoB: Document GPFLAGS
Father Chrysostomos [Mon, 13 Oct 2014 00:58:32 +0000 (17:58 -0700)]
B: Document GPFLAGS

7 years agoperldelta for 14d9114
Father Chrysostomos [Mon, 13 Oct 2014 00:56:22 +0000 (17:56 -0700)]
perldelta for 14d9114

7 years agoperldelta for 926f5fc
Father Chrysostomos [Sun, 12 Oct 2014 21:56:46 +0000 (14:56 -0700)]
perldelta for 926f5fc

7 years agoperldelta for a623f8939
Father Chrysostomos [Sun, 12 Oct 2014 21:53:29 +0000 (14:53 -0700)]
perldelta for a623f8939

7 years agoTru64: S_mulexp10 overflow help.
Jarkko Hietaniemi [Sun, 12 Oct 2014 21:43:48 +0000 (17:43 -0400)]
Tru64: S_mulexp10 overflow help.

7 years agoinfnan: if the mulexp10 value goes to zero, return it.
Jarkko Hietaniemi [Sun, 12 Oct 2014 21:11:02 +0000 (17:11 -0400)]
infnan: if the mulexp10 value goes to zero, return it.

7 years agoperldelta for e78728e52f52
Tony Cook [Sun, 12 Oct 2014 23:14:28 +0000 (10:14 +1100)]
perldelta for e78728e52f52

7 years agoAdd support for Linux pipe buffer size fcntl commands
Dagfinn Ilmari Mannsåker [Wed, 8 Oct 2014 19:58:05 +0000 (20:58 +0100)]
Add support for Linux pipe buffer size fcntl commands

This lets us make t/io/eintr.t more reliable by making sure we're
actually writing more than the buffer size.

7 years agoTest croaks inadvertently rmvd by bd2688c4c
Father Chrysostomos [Sun, 12 Oct 2014 18:23:54 +0000 (11:23 -0700)]
Test croaks inadvertently rmvd by bd2688c4c

7 years agoRevert "op.c: Don’t keep looping when we see potential common vars"
Father Chrysostomos [Sun, 12 Oct 2014 18:22:49 +0000 (11:22 -0700)]
Revert "op.c: Don’t keep looping when we see potential common vars"

This reverts commit bd2688c4c50527e5796ba4bc132c379f11e57112.

It seemed like an obvious optimisation, until it dawned on me that
this loop is doing two things, not just searching for common vars.

7 years agoOptimise "@_" to a single join
Father Chrysostomos [Sun, 12 Oct 2014 15:10:41 +0000 (08:10 -0700)]
Optimise "@_" to a single join

instead of stringify(join(...)).

7 years agoopt.t: Test split-to-array optimisation
Father Chrysostomos [Sun, 12 Oct 2014 13:58:11 +0000 (06:58 -0700)]
opt.t: Test split-to-array optimisation

7 years agoperldiag: Fix typo
Karl Williamson [Sun, 12 Oct 2014 15:53:24 +0000 (09:53 -0600)]
perldiag: Fix typo

7 years agodump.c: Dump pmop patterns without trailing )
Father Chrysostomos [Sun, 12 Oct 2014 13:48:08 +0000 (06:48 -0700)]
dump.c: Dump pmop patterns without trailing )

7 years agoUse full name for Perl_tmps_grow_p in EXTEND_MORTAL
Father Chrysostomos [Sun, 12 Oct 2014 13:36:31 +0000 (06:36 -0700)]
Use full name for Perl_tmps_grow_p in EXTEND_MORTAL

For functions only exported and not public, we can’t use the short
forms in pubic macros.

7 years agoTest that my($self)=@_ uses no-common-vars optimisation
Father Chrysostomos [Sat, 11 Oct 2014 17:40:52 +0000 (10:40 -0700)]
Test that my($self)=@_ uses no-common-vars optimisation

IIRC, this was broken in 5.10.0, but I don’t have a 5.10.0 around to
confirm (only 5.10.1).

7 years agoFold join to const or stringify where possible
Father Chrysostomos [Sat, 11 Oct 2014 08:21:12 +0000 (01:21 -0700)]
Fold join to const or stringify where possible

Due to the exigencies of the implementation, "$_->$*" ends up with a
join op (join $", $$_), which is unnecessary.  This gave me the idea
of folding it where possible (instead of trying to tackle it in
toke.c), which would also make explicit joins benefit, too.

If the arguments are a simple scalar or constant followed by a
single-item list, then the join can become a stringify, and the sepa-
rator can simply disappear.

Further (and this is unrelated to "$_->$*"), if all of join’s argu-
ments are constant, the whole thing can be folded to a const op.

7 years agoOptimise my(@array)=split
Father Chrysostomos [Sun, 12 Oct 2014 07:20:26 +0000 (00:20 -0700)]
Optimise my(@array)=split

Even though we can’t optimise away the array op for my(@array),
local(@array), and @{foo()}, we can still optimise away the assign-
ment.  Just have split pop the array off the stack and Bob’s
your Uncle.

7 years agoOptimise @lexarray = split...
Father Chrysostomos [Sun, 12 Oct 2014 06:33:40 +0000 (23:33 -0700)]
Optimise @lexarray = split...

‘@pkgary = split //, $foo’ gets optimised such that the split writes
directly to the array and the assignment doesn’t have to happen.

This commit makes it work also with lexical arrays.  It only works for
arrays declared previously; ‘my @a = split’ doesn’t get optimised,
just as ‘local @a = split’ doesn’t.

The pad offset is stored in the op_targ field of the pushre op, just
as the GV is stored in its op_pmreplrootu field.

7 years agoperlref: Document lvalue slice refs
Father Chrysostomos [Sun, 12 Oct 2014 06:24:00 +0000 (23:24 -0700)]
perlref: Document lvalue slice refs

Something I missed.

7 years agoClarify two panic perldiag entries
Father Chrysostomos [Sun, 12 Oct 2014 06:22:24 +0000 (23:22 -0700)]
Clarify two panic perldiag entries

7 years agopp.c:pp_split: Remove redundant !s
Father Chrysostomos [Sun, 12 Oct 2014 06:17:43 +0000 (23:17 -0700)]
pp.c:pp_split: Remove redundant !s

SvPV always returns something (or croaks), so s cannot be null here.

7 years agoFix ()=@a=split
Father Chrysostomos [Sun, 12 Oct 2014 00:17:32 +0000 (17:17 -0700)]
Fix ()=@a=split

@a=split//,$foo gets optimised such that split writes directly to
the array and the list assignment doesn’t happen.  In fact, the list
assignment is completetly removed from the op tree:

$ ./perl -Ilib -MO=Concise -e '@a=split//,$foo'
7  <@> leave[1 ref] vKP/REFC ->(end)
1     <0> enter ->2
2     <;> nextstate(main 1 -e:1) v:{ ->3
6     <@> split[t2] vK/IMPLIM ->7
3        </> pushre(/""/ => @a) s/RTIME ->4
-        <1> ex-rv2sv sK/1 ->5
4           <$> gvsv(*foo) s ->5
5        <$> const(IV 0) s ->6
-e syntax OK

(There would have been aassign where you see split if the optimisation
had not happened.)

($a,$b,$c) = split... optimises split by setting its limit argument
automatically so it doesn’t bother splitting into more parts than

The latter optimisation was doing the wrong thing for () = @a = split,
because the @a=split on the rhs was being optimised down to a split
op.  Then the limit optimisation would see an empty (or short) list on
the lhs and a split op on the rhs and see it as a candidate for lim-
ited split.  So too few items would be assigned to the array.

We need to check whether the split on the rhs is a split-to-array
first before doing the limit optimisation.  (If it is, then don’t

This breaks one of my JAPHs:

()=@==split" ","Just another Perl hacker,\n";
print reverse@=

7 years agoinfnan: test overflows and underflows.
Jarkko Hietaniemi [Thu, 9 Oct 2014 21:35:32 +0000 (23:35 +0200)]
infnan: test overflows and underflows.

7 years ago[Merge] Lvalue references
Father Chrysostomos [Sat, 11 Oct 2014 17:24:33 +0000 (10:24 -0700)]
[Merge] Lvalue references

• Single refgen optimisation now applies to \@ \% \& as well.
• split-to-array no longer runs the risk of clobbering its argument
  and returning junk.
• The split-to-array optimisation happens more often than before.
• foreach my $x is no longer subject to the list-assignment-after-ali-
  asing bug (#89646).

7 years agoDocument lvalue references
Father Chrysostomos [Sat, 11 Oct 2014 07:00:55 +0000 (00:00 -0700)]
Document lvalue references

7 years agoMake Deparse.t more tolerant of our @F vs our(@F)
Father Chrysostomos [Sat, 11 Oct 2014 05:16:38 +0000 (22:16 -0700)]
Make Deparse.t more tolerant of our @F vs our(@F)

Currently B::Deparse deparses ‘our @F;’ as ‘our @F;’, but ‘our @F =...’
as ‘our(@F) = ...’, adding parentheses.  For split-to-array, it just
happens to omit the parentheses, because there is no list op for it
to process, and it is when processing a list op that it decides to put
them there.  While it could be changed to omit the parentheses for the
list or add them for split-to-array, for now just make the test more
tolerant, as this is just a cosmetic difference.

7 years agoExtend lex alias detection to foreach, too
Father Chrysostomos [Sat, 11 Oct 2014 04:52:37 +0000 (21:52 -0700)]
Extend lex alias detection to foreach, too

Now that I have added a mechanism for detecting lexical aliases in
list assignments, we can extend that to foreach, too, to fix another
instance of the list-assignment-after-aliasing bug.

7 years agoSkip no-common-vars optimisation for lex aliases
Father Chrysostomos [Sat, 11 Oct 2014 04:48:48 +0000 (21:48 -0700)]
Skip no-common-vars optimisation for lex aliases

7 years agoop.c: Move common vars check into the peephole optimiser
Father Chrysostomos [Fri, 10 Oct 2014 23:44:58 +0000 (16:44 -0700)]
op.c: Move common vars check into the peephole optimiser

Putting it this late in the compilation phase will facilitate checking
for lexical aliases, too.

7 years agoUpdate B-Debug’s tests for split optimisation
Father Chrysostomos [Fri, 10 Oct 2014 23:37:00 +0000 (16:37 -0700)]
Update B-Debug’s tests for split optimisation

This will have to be submitted upstream after this branch is merged.

7 years agoop.c: Distangle split and common-vars
Father Chrysostomos [Fri, 10 Oct 2014 15:45:29 +0000 (08:45 -0700)]
op.c: Distangle split and common-vars

The split-to-array optimisation was being skipped if the assignment
referenced the same variable on both sides, or if it referenced @_
(since @_ aliases other vars).  This was to prevent split from freeing
its own argument when writing to the array.

As the previous commit shows, that didn’t actually work properly, and
so that commit used a different means to work around that problem.

So now there is no reason to skip the optimisation in such cases.

    @_ = split;
    @a = split //, $a[0];

now optimise away the assignment.

(This also allows me to move the common-vars check into the peep-
hole optimiser, where it needs to be to work correctly with lexi-
cal aliases.)

7 years agoMake split temporarily refcnt its argument
Father Chrysostomos [Fri, 10 Oct 2014 15:39:49 +0000 (08:39 -0700)]
Make split temporarily refcnt its argument

In this example, the @a=split... is optimised so that split writes to
@a directly:

*a = *b;
$a[1] = "foobarbaz";
@a = split //, $b[1];
print "@a\n";

But since @a and @b are the same, $b[1] gets freed even before the
split occurs.  This just happens to work, because copy-on-write saves
the day, since the buffer is still valid, the "foobarbaz" constant
still holding on to it.

This modified example gives me junk:

*a = *b;
$a[1] = "foobarbaz";
$a[1] .= "";
@a = split //, $b[1];
print "@a\n";

The easiest solution is to make pp_split hold a temporary reference
count on the SV.

This will also allow the split optimisation to be disentangled from
the common-vars pessimisation (which fails here anyway).  And *that*
will allow the common-vars pessimisation to take lexical aliases
into account.