This is a live mirror of the Perl 5 development currently hosted at
6 years agogenerate_uudmap.c: Clarify comment
Karl Williamson [Wed, 10 Dec 2014 03:51:34 +0000 (20:51 -0700)]
generate_uudmap.c: Clarify comment

6 years agoStop errorneous warnings for C locale
Karl Williamson [Wed, 10 Dec 2014 20:08:41 +0000 (13:08 -0700)]
Stop errorneous warnings for C locale

HP-UX - B.11.00/64 has a problem with the C locale that's only
noticeable from newly added warnings flooding the logs.  This adds a
test to suppress them.

6 years agot/run/locale.t: Rmv duplicate closing of STDERR
Karl Williamson [Wed, 10 Dec 2014 20:08:10 +0000 (13:08 -0700)]
t/run/locale.t: Rmv duplicate closing of STDERR

STDERR is now closed during these tests, so no need to do it again.  And
if you wanted to see STDERR for some reason, you had to remember to fix
things in two places.  This also sets PERL_BADLANG to suppress some of
the things that we were closing STDERR to avoid printing.

6 years agoAdd pthread to libswanted
H.Merijn Brand [Thu, 11 Dec 2014 17:25:24 +0000 (18:25 +0100)]
Add pthread to libswanted

that comment is from another backport

6 years agomake the EXACTF_invlist only when SCF_DO_STCLASS
Hugo van der Sanden [Thu, 11 Dec 2014 15:27:07 +0000 (15:27 +0000)]
make the EXACTF_invlist only when SCF_DO_STCLASS

The data is used only for STCLASS, and it's somewhat expensive to create.

6 years agoDon’t do string overloading for numeric pack fmts
Father Chrysostomos [Thu, 11 Dec 2014 02:20:19 +0000 (18:20 -0800)]
Don’t do string overloading for numeric pack fmts

See <>.  Commit 354b74ae6f broke this.

6 years agoDon’t do string overloading for printf int formats
Father Chrysostomos [Thu, 11 Dec 2014 02:15:37 +0000 (18:15 -0800)]
Don’t do string overloading for printf int formats

See <>.  Commit 354b74ae6f broke this.

6 years agoDon’t call string overloading in chr
Father Chrysostomos [Thu, 11 Dec 2014 02:07:34 +0000 (18:07 -0800)]
Don’t call string overloading in chr

See <>.  Commit 354b74ae6f broke this.

6 years agosv.c: Note that sv_2num does not do get-magic
Father Chrysostomos [Thu, 11 Dec 2014 02:06:20 +0000 (18:06 -0800)]
sv.c: Note that sv_2num does not do get-magic

6 years agosv.c: Remove reference to bogus SvNUM macro
Father Chrysostomos [Thu, 11 Dec 2014 02:04:01 +0000 (18:04 -0800)]
sv.c: Remove reference to bogus SvNUM macro

There has never been such a macro.

6 years agoUpdate DB_File to CPAN version 1.834
Chris 'BinGOs' Williams [Wed, 10 Dec 2014 23:09:29 +0000 (23:09 +0000)]
Update DB_File to CPAN version 1.834


1.834 11 Dec 2014

   * Makefile.PL: version check is missing a zero
     RT #100844

6 years agoEscape Latin-1 chars in deparsed strings
Father Chrysostomos [Wed, 10 Dec 2014 12:51:24 +0000 (04:51 -0800)]
Escape Latin-1 chars in deparsed strings

Otherwise code like this:

        use utf8;
        my $e = qr"BöckĀ";

deparses in Latin-1 and running the output results in malforma-
tion errors.

6 years agofix spurious 'Use of reference' warning
David Mitchell [Wed, 10 Dec 2014 13:20:38 +0000 (13:20 +0000)]
fix spurious 'Use of reference' warning

My recent OP_MULTIDEREF addition introduced a bug where, when
converting a constant array index into a UV, it checked for a ref
and issued a "Use of reference "HASH(0x7fd190915ba8)" as array index"
warning *before* it had confirmed that the OP_CONST was the only op in
the index expression. So things like

    use constant HASHREF => { a => 1 };
    () = $_[HASHREF->{a} ];

would generate two spurious warnings.

The fix is easy. Only test for the warning on the second pass;
we'll already have abandoned the optimisation attempt on the first pass
if the index expression isn't a simple constant.

6 years agoConsistent spaces after docs in perlfunc.pod
Father Chrysostomos [Wed, 10 Dec 2014 12:36:56 +0000 (04:36 -0800)]
Consistent spaces after docs in perlfunc.pod

6 years agoporting/utils.t: explain what caused failures
David Mitchell [Wed, 10 Dec 2014 11:58:26 +0000 (11:58 +0000)]
porting/utils.t: explain what caused failures

On an error, include in the diagnostic output what perl command we were
running that triggered the failure.

6 years agounop_aux_stringify(): remove redundant assignment
David Mitchell [Wed, 10 Dec 2014 10:41:33 +0000 (10:41 +0000)]
unop_aux_stringify(): remove redundant assignment

my recent OP_MULTIDEREF patch included this bizarre thinko:

    PAD *comppad = comppad = ....;

Spotted by Jarkko.

6 years agoAllow multideref with ($a[0])->[0]
Father Chrysostomos [Wed, 10 Dec 2014 06:34:25 +0000 (22:34 -0800)]
Allow multideref with ($a[0])->[0]

6 years agoFix assertion failure with our @a->{0}
Father Chrysostomos [Wed, 10 Dec 2014 06:19:51 +0000 (22:19 -0800)]
Fix assertion failure with our @a->{0}

This is nonsensical (including the wording of the error message), but
it shouldn’t fail an assertion.

6 years agoFix up OUTSIDE pointers for saved BEGIN blocks
Father Chrysostomos [Wed, 10 Dec 2014 05:46:03 +0000 (21:46 -0800)]
Fix up OUTSIDE pointers for saved BEGIN blocks

B::Deparse depends on this to get the BEGIN blocks in the right place
if they occur inside predeclared subs.

6 years agoEviscerate concise-xs.t
Father Chrysostomos [Wed, 10 Dec 2014 04:36:21 +0000 (20:36 -0800)]
Eviscerate concise-xs.t

This test script constantly fails due to unrelated changes elsewhere,
and it takes a long time to run.  If we are just testing B::Concise’s
ability to distinguish types of subs, we don’t need to test so many.

For the sake of sanity, this commit rewrites the test to use eight
known subs of various persuasions.

6 years agoLabel conditionally unused.
Jarkko Hietaniemi [Wed, 10 Dec 2014 01:45:46 +0000 (20:45 -0500)]
Label conditionally unused.

6 years agostdize_locale not used in POSIX.
Jarkko Hietaniemi [Wed, 10 Dec 2014 01:48:32 +0000 (20:48 -0500)]
stdize_locale not used in POSIX.

6 years agoPossibly uninitialized.
Jarkko Hietaniemi [Wed, 10 Dec 2014 02:36:46 +0000 (21:36 -0500)]
Possibly uninitialized.

op.c:8346:21: warning: 'start' may be used uninitialized in this function [-Wmaybe-uninitialized]
op.c:8811:21: warning: 'start' may be used uninitialized in this function [-Wmaybe-uninitialized]

6 years agoThe format is not a literal but well defined.
Jarkko Hietaniemi [Wed, 10 Dec 2014 03:15:56 +0000 (22:15 -0500)]
The format is not a literal but well defined.

6 years agoIf no strtoul, the args are unused.
Jarkko Hietaniemi [Wed, 10 Dec 2014 03:46:24 +0000 (22:46 -0500)]
If no strtoul, the args are unused.

(strtoul is defined as not_here() if not found.)

6 years agoperldelta for fcaef4dc8ca9, fb9282c3ccd3
Tony Cook [Wed, 10 Dec 2014 02:12:59 +0000 (13:12 +1100)]
perldelta for fcaef4dc8ca9fb9282c3ccd3

6 years ago[perl #123245] avoid a panic in sv_chop() in formats
Tony Cook [Wed, 10 Dec 2014 00:54:49 +0000 (11:54 +1100)]
[perl #123245] avoid a panic in sv_chop() in formats

This fixes two issues:

1) if you don't supply enough arguments to the format, pp_formline()
  uses &PL_sv_no as the sv, since we've already warned about the
  missing format argument, we don't need to produce a read only error
  for an SV the caller didn't supply

2) when the supplied string is empty for FF_LINESNGL and FF_LINEGLOB
  the case would skip most of its processing, including setting
  chophere, this meant that when the following FF_CHOP operator was
  processed it would pass a pointer into a different string, producing
  a panic.

6 years ago[perl #123245] tests for format crashes
Tony Cook [Wed, 10 Dec 2014 00:51:39 +0000 (11:51 +1100)]
[perl #123245] tests for format crashes

6 years agoperlpolicy: Be explicit wrt crashing bug policy
Father Chrysostomos [Tue, 9 Dec 2014 20:33:37 +0000 (12:33 -0800)]
perlpolicy: Be explicit wrt crashing bug policy

This new wording states explicitly what has been the de facto under-
standing of this policy of late.

6 years agoUpdate DB_File to CPAN version 1.833
Chris 'BinGOs' Williams [Tue, 9 Dec 2014 23:27:38 +0000 (23:27 +0000)]
Update DB_File to CPAN version 1.833


1.833 9 Dec 2014

   * More Silence compiler warnings

   * 1.832 breaks bleadperl C89 build
     RT #100812

6 years agoExtend read-only ops to most special blocks
Father Chrysostomos [Tue, 9 Dec 2014 16:55:42 +0000 (08:55 -0800)]
Extend read-only ops to most special blocks

We can’t do BEGIN blocks easily because they are freed by the time
we make the ops read-only, but there is no reason to skip other spec-
ial blocks.

6 years agoDon’t deparse BEGIN blocks as __ANON__
Father Chrysostomos [Tue, 9 Dec 2014 16:46:20 +0000 (08:46 -0800)]
Don’t deparse BEGIN blocks as __ANON__

There are various ways in which the *BEGIN glob could be freed, caus-
ing the BEGIN block to become anonymised.  E.g., it can happen if a
*BEGIN rv2gv op is created and freed at compile time.  (This commit
deletes it more explicitly in Deparse.t, to make the test robust.)
And the BEGIN block’s relationship to the typeglob it started out in
is only incidental once it has been detached.  So for special blocks
we should be deciding the name based on which array (beginav, etc.) we
got it from, and not using the name of the glob the sub points to.

6 years agoDB_File.xs: Fix strict C89 compilation failure
Father Chrysostomos [Tue, 9 Dec 2014 20:33:07 +0000 (12:33 -0800)]
DB_File.xs: Fix strict C89 compilation failure

I still need to post this upstream....

6 years agoperly.c: Fix EBCDIC bug
Karl Williamson [Mon, 8 Dec 2014 04:53:37 +0000 (21:53 -0700)]
perly.c: Fix EBCDIC bug

The code was changing the value in a structure on EBCDIC platforms.  It
turns out that that structure element is used later under quite limited
circumstances.  The changed value is actually only needed during an
array look-up, so we no longer store the change.

6 years agotoke.c: Generalize trace for non-ASCII platform
Karl Williamson [Sat, 6 Dec 2014 23:06:49 +0000 (16:06 -0700)]
toke.c: Generalize trace for non-ASCII platform

This was very ASCII-specific.  The newer is clearer and saves a test.

6 years ago-Dp does work on EBCDIC.
Karl Williamson [Thu, 27 Nov 2014 02:51:23 +0000 (19:51 -0700)]
-Dp does work on EBCDIC.

6 years agoUpdate IO-Compress to CPAN version 2.067
Chris 'BinGOs' Williams [Tue, 9 Dec 2014 15:26:53 +0000 (15:26 +0000)]
Update IO-Compress to CPAN version 2.067


  2.067 8 Dec 2014

      * RT #100257: IO::Compress::RawDeflate unnecessarily loads IO::Seekable

6 years agoUpdate Compress-Raw-Zlib to CPAN version 2.067
Chris 'BinGOs' Williams [Tue, 9 Dec 2014 15:25:46 +0000 (15:25 +0000)]
Update Compress-Raw-Zlib to CPAN version 2.067


  2.067 8 Dec 2014

      * Silence Compiler Warnings

6 years agoUpdate Compress-Raw-Bzip2 to CPAN version 2.067
Chris 'BinGOs' Williams [Tue, 9 Dec 2014 15:24:29 +0000 (15:24 +0000)]
Update Compress-Raw-Bzip2 to CPAN version 2.067


  2.067 8 Dec 2014

      * Silence compiler warnings

6 years agoUpdate DB_File to CPAN version 1.832
Chris 'BinGOs' Williams [Tue, 9 Dec 2014 14:50:17 +0000 (14:50 +0000)]
Update DB_File to CPAN version 1.832


1.832 8 Dec 2014

   * Silence compiler warnings

   * C++ change from blead

6 years agoop.c: Temporary fix for bad read
Father Chrysostomos [Tue, 9 Dec 2014 14:24:21 +0000 (06:24 -0800)]
op.c: Temporary fix for bad read

We can’t read *name at this point, because the
SAVEFREEOP(o)/LEAVE_SCOPE above will have freed the SV owning the
string buffer.

We can’t do pad_add_weakref before LEAVE_SCOPE, because it will add
the entry to the wrong pad.

This fix is only temporary, because one more behaviour change (ena-
bling read-only ops for special blocks other than BEGIN) will allow be
to simplify it.

6 years agoUnify format and named-sub pad weakref code
Father Chrysostomos [Tue, 9 Dec 2014 06:16:05 +0000 (22:16 -0800)]
Unify format and named-sub pad weakref code

6 years agoFix OUTSIDE for named subs inside predeclared subs
Father Chrysostomos [Tue, 9 Dec 2014 05:59:22 +0000 (21:59 -0800)]
Fix OUTSIDE for named subs inside predeclared subs

This prints 42 as expected (foo initialises $x and bar reads it
via eval):

use 5.01;
sub foo {
    state $x = 42;
    sub bar {
        eval 'print $x // "u", "\n"';

If you predeclare foo and vivify its glob,

use 5.01;
*foo; # vivifies the glob at compile time
sub foo;
sub foo {
    state $x = 42;
    sub bar {
        eval 'print $x // "u", "\n"';

then the output is ‘u’, because $x is now undefined.

What’s happening is that ‘eval’ follows CvOUTSIDE pointers (each sub
points to its outer sub), searching each pad to find a lexical $x.  In
the former case it succeeds.  In the latter, bar’s CvOUTSIDE pointer
is pointing to the wrong thing, so the search fails and $x is treated
as global.  You can see it’s global with this example, which prints

use 5.01;
*foo; # vivifies the glob at compile time
sub foo;
sub foo {
    state $x = 42;
    sub bar {
        eval 'print $x // "u", "\n"';
$main::x = "globular";

When a sub is compiled, a new CV is created at the outset and put in
PL_compcv.  When the sub finishes compiling, the CV in PL_compcv is
installed in the sub’s typeglob (or as a subref in the stash if pos-
sible).  If there is already a stub in a typeglob, since that stub
could be referenced elsewhere, we have to reuse that stub and transfer
the contents of PL_compcv to that stub.

If we have any subs inside it, those will now have CvOUTSIDE point-
ers pointing to the old PL_compcv that has been eviscerated.  So
we go through the pad and fix up the outside pointers for any subs
found there.

Named subs don’t get stored in the pad like that, so the CvOUTSIDE
fix-up never happens.  Hence the bug above.

The bug does not occur if the glob is not vivified before the sub def-
inition, because a stub declaration will skip creating a real CV if it
can.  It can’t if there is a typeglob.

The solution, of course, is to store named subs in the outer sub’s
pad.  We can skip this if the outer ‘sub’ is an eval or the main pro-
gram.  These two types of CVs obviously don’t reuse existing stubs,
since they never get installed in the symbol table.  Since named subs
have strong outside pointers, we have to store weak refs in the pad,
just as we do for formats.

6 years agomake xs_version_bootcheck() appear only in util.c
David Mitchell [Tue, 9 Dec 2014 10:19:53 +0000 (10:19 +0000)]
make xs_version_bootcheck() appear only in util.c

672cbd159cb9 converted xs_version_bootcheck() into a static function,
but forgot to wrap the embed.fnc entry with "#if defined(PERL_IN_UTIL_C)",
so it was generating a compiler warning in every file that proto.h was
included in.

6 years agoFix assertion failure with ($_[0])->{$_}
Father Chrysostomos [Tue, 9 Dec 2014 00:32:34 +0000 (16:32 -0800)]
Fix assertion failure with ($_[0])->{$_}

Type::Tiny was triggering this.  The Type::Tiny failure was mention in
ticket #123213.

6 years agoFix gv_fetchmeth_sv: it might stringify SV more than once.
syber [Mon, 8 Dec 2014 22:36:23 +0000 (01:36 +0300)]
Fix gv_fetchmeth_sv: it might stringify SV more than once.

6 years agoz/OS has nan() in math lib but seemingly broken.
Jarkko Hietaniemi [Fri, 5 Dec 2014 12:08:14 +0000 (07:08 -0500)]
z/OS has nan() in math lib but seemingly broken.

6 years agoTurn 9**9**9 skips into todos, and add os390 (z/OS).
Jarkko Hietaniemi [Sun, 26 Oct 2014 13:32:42 +0000 (09:32 -0400)]
Turn 9**9**9 skips into todos, and add os390 (z/OS).

Not that OS/libmath fixes are likely, but one can always hope.

6 years agomake xs_version_bootcheck a static func since not used as export anymore
Daniel Dragan [Mon, 8 Dec 2014 06:55:47 +0000 (01:55 -0500)]
make xs_version_bootcheck a static func since not used as export anymore

Since commit db6e00bd00 the function has not been used by XS modules. Now
remove it from export table since it has never been public API (the macro
is), and it saves its symbol name string name, symbol table pointer,
and allows for inlining and/or random calling convention optimization
by the CC.

6 years agoadd const to every table in win32/fcrypt.c
Daniel Dragan [Mon, 8 Dec 2014 05:58:24 +0000 (00:58 -0500)]
add const to every table in win32/fcrypt.c

See [perl #123386] for details.

6 years agoavoid 'jobserver unavailable:' warnings
David Mitchell [Mon, 8 Dec 2014 20:26:04 +0000 (20:26 +0000)]
avoid 'jobserver unavailable:' warnings

Under GNU make, an interaction between the top-level 'make -j N harness'
and a make invoked by cpan/ExtUtils-Constant/t/Constant.t
causes warnings like:
    warning: jobserver unavailable: using -j1.  Add `+' to parent make rule.

Fix this by stopping MAKEFLAGS being inherited by the children.
The other option, of prefixing all the '$(RUN_TESTS) choose' lines
in Makefile.SH with '+' is, I suspect, not portable.

6 years agoUpdate Unicode-Collate to CPAN version 1.08
Chris 'BinGOs' Williams [Mon, 8 Dec 2014 11:56:21 +0000 (11:56 +0000)]
Update Unicode-Collate to CPAN version 1.08


1.08  Sat Dec  6 20:12:55 2014
    - DUCET is updated (for Unicode 7.0.0) as Collate/allkeys.txt.
    ! Please notice that allkeys.txt will be overwritten if you have had
      other allkeys.txt already.
    - The default UCA_Version is 30.
    - *.pl and *.pm are updated so that they have same the version number.

6 years agodeparse-skips.txt: Note bug number for re/overload.t
Father Chrysostomos [Mon, 8 Dec 2014 04:19:01 +0000 (20:19 -0800)]
deparse-skips.txt: Note bug number for re/overload.t

6 years agodeparse-skips.txt: More passing tests
Father Chrysostomos [Mon, 8 Dec 2014 02:20:24 +0000 (18:20 -0800)]
deparse-skips.txt: More passing tests

6 years agoMissing semicolon in e6dae479.
Jarkko Hietaniemi [Mon, 8 Dec 2014 02:04:53 +0000 (21:04 -0500)]
Missing semicolon in e6dae479.

6 years agoIncrease $Devel::Peek::VERSION to 1.20
Father Chrysostomos [Mon, 8 Dec 2014 01:32:20 +0000 (17:32 -0800)]
Increase $Devel::Peek::VERSION to 1.20

6 years agoIncrease $IO::VERSION to 1.35
Father Chrysostomos [Mon, 8 Dec 2014 01:31:55 +0000 (17:31 -0800)]
Increase $IO::VERSION to 1.35

6 years agoChange OP_SIBLING to OpSIBLING
Father Chrysostomos [Mon, 8 Dec 2014 01:11:21 +0000 (17:11 -0800)]

to match the existing convention (OpREFCNT, OpSLAB).

Dave Mitchell asked me to wait until after his multideref work
was merged.

Unfortunately, there are now CPAN modules using OP_SIBLING.

6 years ago[perl #94484] Custom ops trip assertions in new*OP
Father Chrysostomos [Mon, 8 Dec 2014 00:27:23 +0000 (16:27 -0800)]
[perl #94484] Custom ops trip assertions in new*OP

Without allowing OP_CUSTOM in these functions, there is no way to cre-
ate a custom op while sticking to the API.

6 years agoApply scalar context to state var init
Father Chrysostomos [Sun, 7 Dec 2014 22:22:01 +0000 (14:22 -0800)]
Apply scalar context to state var init

6bd9b5cf6 did apply srefgen optimisations to \($a//=3), but not to
\(state $x = 3), despite what the commit message says, because the
‘once’ op does not go through S_new_logop with OP_ONCE as the type.
So this commit applies the scalar context afterwards, allowing
\(state $x = 3) to get a srefgen op, not a refgen.

(The OP_ONCE op is created via newCONDOP, which creates an
OP_COND_EXPR, which is then converted to an OP_ONCE.  I don’t under-
stand why it needs to be so complicated.  Maybe this could be

6 years agoFix deparsing of (1,2,3) in void context
Father Chrysostomos [Mon, 8 Dec 2014 01:24:50 +0000 (17:24 -0800)]
Fix deparsing of (1,2,3) in void context

This was broken in v5.21.5-289-g12cea2f.  We were trying to check the
kid op of an ex-const, but an ex-const has no children.

6 years agodeparse-skips.txt: run/switches.t passes
Father Chrysostomos [Mon, 8 Dec 2014 00:38:42 +0000 (16:38 -0800)]
deparse-skips.txt: run/switches.t passes

6 years agodeparse-skips.txt: Note skip reason for switchd-78586.t
Father Chrysostomos [Mon, 8 Dec 2014 00:37:30 +0000 (16:37 -0800)]
deparse-skips.txt: Note skip reason for switchd-78586.t

6 years agoFix deparsing of newline and tab with (?x)
Father Chrysostomos [Mon, 8 Dec 2014 00:33:49 +0000 (16:33 -0800)]
Fix deparsing of newline and tab with (?x)

B::Deparse was taking special care to preserve whitespace for /x pat-
terns, and avoid changing newlines to \n, etc.  But it was not tak-
ing (?x) into account.  Parsing regular expressions to apply the
right escapes to different parts of the regexp is too compli-
cated, so this commit changes it to treat all regular expres-
sions the way it was treating /x expressions.  This causes
‘cd t; ./perl TEST -deparse run/switchM.t’ to pass.

6 years agoDetypo.
Jarkko Hietaniemi [Mon, 8 Dec 2014 01:10:09 +0000 (20:10 -0500)]

6 years agoUse cBOOL.
Jarkko Hietaniemi [Sun, 7 Dec 2014 18:13:20 +0000 (13:13 -0500)]
Use cBOOL.

6 years agoMake it explicit that truncation is fine.
Jarkko Hietaniemi [Sun, 7 Dec 2014 18:11:56 +0000 (13:11 -0500)]
Make it explicit that truncation is fine.

6 years agoDon’t deparse for(foo()) as for(local(foo()))
Father Chrysostomos [Sun, 7 Dec 2014 21:56:15 +0000 (13:56 -0800)]
Don’t deparse for(foo()) as for(local(foo()))

Entersub gets the LVINTRO flag, but it does *not* represent local().
It’s an exception to the general rule.

This was probably broken in 12cea2fa65.

6 years agodeparse-skips.txt: Note why switchI.t is skipped
Father Chrysostomos [Sun, 7 Dec 2014 21:46:17 +0000 (13:46 -0800)]
deparse-skips.txt: Note why switchI.t is skipped

6 years agoApply scalar cx to logops if OA_RETSCALAR
Father Chrysostomos [Sun, 7 Dec 2014 21:34:30 +0000 (13:34 -0800)]
Apply scalar cx to logops if OA_RETSCALAR

Logops always have a null-op parent, and that is what callers of
S_new_logop see.  If we flag it with scalar context when the logop
type has the OA_RETSCALAR flag (which means we know it will return
exactly one item), then \(state $x = 3) and \($x //= 4) will be opti-
mised to srefgen, instead of refgen.  (srefgen is a faster version of
refgen; it only handles one item.)

6 years agoperlfunc: Correct retval for get*/set*/end*
Father Chrysostomos [Sun, 7 Dec 2014 15:00:12 +0000 (07:00 -0800)]
perlfunc: Correct retval for get*/set*/end*

6 years agodeparse-skips.txt: switchC.t passes
Father Chrysostomos [Sun, 7 Dec 2014 21:41:33 +0000 (13:41 -0800)]
deparse-skips.txt: switchC.t passes

6 years agooptree_varinit.t fix-ups
Father Chrysostomos [Sun, 7 Dec 2014 21:19:29 +0000 (13:19 -0800)]
optree_varinit.t fix-ups

6 years agooptree_check.t fix-ups
Father Chrysostomos [Sun, 7 Dec 2014 21:17:54 +0000 (13:17 -0800)]
optree_check.t fix-ups

6 years agooptree_misc.t fixups
Father Chrysostomos [Sun, 7 Dec 2014 21:11:20 +0000 (13:11 -0800)]
optree_misc.t fixups

6 years agogelem and refassign can have OA_RETSCALAR
Father Chrysostomos [Sun, 7 Dec 2014 20:35:47 +0000 (12:35 -0800)]
gelem and refassign can have OA_RETSCALAR

They only ever return scalars, but were not flagged that way.

This change allows \*foo{THING} and \(\$x=\$y) to use srefgen, a
faster version of refgen that handles only one item.

6 years agoop.c: Use scalar cx, not OA_RETSCALAR, for optimisations
Father Chrysostomos [Sun, 7 Dec 2014 20:30:54 +0000 (12:30 -0800)]
op.c: Use scalar cx, not OA_RETSCALAR, for optimisations

OA_RETSCALAR causes the op to have scalar context applied.  If we use
the context on the op, rather than the flag on the op type, for opti-
misations, then future commits can extend these optimisations to other
cases, too.

This requires applying scalar context in newSVREF to keep \my $x
optimised (and functional, because for \my $x looks for srefgen,
not refgen).

6 years agoGive require the OA_RETSCALAR flag
Father Chrysostomos [Sun, 7 Dec 2014 20:26:59 +0000 (12:26 -0800)]
Give require the OA_RETSCALAR flag

This way there is no need to call scalar() on the op separately.

6 years agoop.c:newPMOP: Apply scalar cx if OA_RETSCALAR
Father Chrysostomos [Sun, 7 Dec 2014 19:48:09 +0000 (11:48 -0800)]
op.c:newPMOP: Apply scalar cx if OA_RETSCALAR

This makes all qr// ops have the scalar context flag, even when called
in list context.  It makes no difference to the run-time behaviour.

There are currently two optimisations that occur if an op’s type has
the OA_RETSCALAR flag (refgen --> srefgen and join --> stringify).  If
we base them on the context applied to the op, then these optimisations
can happen in more cases.  Applying scalar context to qr will allow
\qr// to continue to undergo the optimisation if that changes.  (qr
is the only op I found with OA_RETSCALAR that does not get scalar con-
text applied on its account.)

6 years agoop.c:newMETHOP: Remove fold_constants, etc.
Father Chrysostomos [Sun, 7 Dec 2014 19:36:36 +0000 (11:36 -0800)]
op.c:newMETHOP: Remove fold_constants, etc.

This function is only called for OP_METHOD*.  It could conceivably be
called for OP_CUSTOM.

These operators are not eligible for constant folding, do not have
integer equivalents, do not have targets, and do not always return
scalars.  So none of the three function calls on the last line of
S_newMETHOP_internal apply.

6 years agoop.c:newMETHOP: Remove op_next check
Father Chrysostomos [Sun, 7 Dec 2014 19:34:24 +0000 (11:34 -0800)]
op.c:newMETHOP: Remove op_next check

This function is only called for OP_METHOD*.  It could conceivably be
called for OP_CUSTOM.

The only check functions in this case are ck_method, which does not
touch op_next, and ck_null, which does nothing.  So op_next could not
have been set.

6 years agoop.c:newUNOP_AUX: Rmv fold_constants/op_integerize
Father Chrysostomos [Sun, 7 Dec 2014 19:30:41 +0000 (11:30 -0800)]
op.c:newUNOP_AUX: Rmv fold_constants/op_integerize

This function is only called for OP_MULTIDEREF, which has no check
function.  It could conceivably be called for OP_CUSTOM.

Neither multideref nor custom ops have constant folding or integer

6 years agoop.c:newUNOP_AUX: Remove op_next check
Father Chrysostomos [Sun, 7 Dec 2014 19:29:00 +0000 (11:29 -0800)]
op.c:newUNOP_AUX: Remove op_next check

This function is only called for OP_MULTIDEREF, which has no check
function.  It could conceivably be called for OP_CUSTOM, but that also
has no check function.  So this op_next check is redundant, as nothing
could possibly have set op_next at this point.  (In fact, I think it‘s
redundant for newUNOP, too, but I’ll have to look into that.)

6 years agoop.c: Typo in docs for op_convert_list
Father Chrysostomos [Sun, 7 Dec 2014 18:58:07 +0000 (10:58 -0800)]
op.c: Typo in docs for op_convert_list

6 years agoop.c: Clarify newLISTOP docs
Father Chrysostomos [Sun, 7 Dec 2014 18:57:30 +0000 (10:57 -0800)]
op.c: Clarify newLISTOP docs

They seem to imply that you can call newLISTOP(OP_ANY_TYPE), but
almost all the time you want newLISTOP(OP_LIST) followed by

6 years agoConvert tabs to spaces and remove trailing space.
Shlomi Fish [Sat, 6 Dec 2014 17:17:36 +0000 (19:17 +0200)]
Convert tabs to spaces and remove trailing space.

For: RT #123377

6 years agoFix method assertion failures
Father Chrysostomos [Sun, 7 Dec 2014 18:37:50 +0000 (10:37 -0800)]
Fix method assertion failures

6 years agoTweak Deparse-core.t after the last two commits
Father Chrysostomos [Sun, 7 Dec 2014 14:52:23 +0000 (06:52 -0800)]
Tweak Deparse-core.t after the last two commits

6 years agoDeparse goto foo() correctly
Father Chrysostomos [Sun, 7 Dec 2014 06:41:43 +0000 (22:41 -0800)]
Deparse goto foo() correctly

See the previous commit.  The same applies to loop controls and similar

6 years agoDeparse require(foo()) correctly
Father Chrysostomos [Sun, 7 Dec 2014 06:37:25 +0000 (22:37 -0800)]
Deparse require(foo()) correctly

require(foo()) deparses as require foo().  But require’s parsing is
eccentric, and does not allow require foo(), because ‘foo’ is treated
as a bareword there, and ‘require WORD’ does not allow () fol-
lowing it.

The same problem happens with do-file, which is fixed also by this
commit, since it follows the same code path.

6 years Redundant func call
Father Chrysostomos [Sun, 7 Dec 2014 06:29:33 +0000 (22:29 -0800)] Redundant func call

unop calls $self->keyword, so we don’t need to.

6 years agoMake fileno() builtin work on directory handles
Aaron Crane [Fri, 17 Oct 2014 15:59:22 +0000 (16:59 +0100)]
Make fileno() builtin work on directory handles

This requires OS support in the form of either the dirfd() function, or a
dd_fd member in the DIR struct. POSIX.1-2008 specifies the former. If
neither is available, fileno() on a directory handle will return undef and
set errno.

6 years agoAdd OP_MULTIDEREF
David Mitchell [Fri, 24 Oct 2014 15:26:38 +0000 (16:26 +0100)]

This op is an optimisation for any series of one or more array or hash
lookups and dereferences, where the key/index is a simple constant or
package/lexical variable. If the first-level lookup is of a simple
array/hash variable or scalar ref, then that is included in the op too.

So all of the following are replaced with a single op:

    local $a[0][$i]
    exists $a[$i]{$k}
    delete $h{foo}

while these aren't:

    $a[0]       already handled by OP_AELEMFAST
    $a[$x+1]    not a simple index

and these are partially replaced:

    (expr)->[0]{$k}   the bit following (expr) is replaced
    $h{foo}[$x+1][0]  the first and third lookups are each done with
                      a multideref op, while the $x+1 expression and
                      middle lookup are done by existing add, aelem etc

Up until now, aggregate dereferencing has been very heavyweight in ops; for
example, $r->[0]{$x} is compiled as:

    gv[*r] s
    rv2sv sKM/DREFAV,1
    rv2av[t2] sKR/1
    const[IV 0] s
    aelem sKM/DREFHV,2
    rv2hv sKR/1
    gvsv[*x] s
    helem vK/2

When executing this, in addition to the actual calls to av_fetch() and
hv_fetch(), there is a lot of overhead of pushing SVs on and off the
stack, and calling lots of little pp() functions from the runops loop
(each with its potential indirect branch miss).

The multideref op avoids that by running all the code in a loop in a
switch statement. It makes use of the new UNOP_AUX type to hold an array

    typedef union  {
        PADOFFSET pad_offset;
        SV        *sv;
        IV        iv;
        UV        uv;
    } UNOP_AUX_item;

In something like $a[7][$i]{foo}, the GVs or pad offsets for @a and $i are
stored as items in the array, along with a pointer to a const SV holding
'foo', and the UV 7 is stored directly. Along with this, some UVs are used
to store a sequence of actions (several actions are squeezed into a single

Then the main body of pp_multideref is a big while loop round a switch,
which reads actions and values from the AUX array. The two big branches in
the switch are ones that are affectively unrolled (/DREFAV, rv2av, aelem)
and (/DREFHV, rv2hv, helem) triplets. The other branches are various entry
points that handle retrieving the different types of initial value; for
example 'my %h; $h{foo}' needs to get %h from the pad, while '(expr)->{foo}'
needs to pop expr off the stack.

Note that there is a slight complication with /DEREF; in the example above
of $r->[0]{$x}, the aelem op is actually

    aelem sKM/DREFHV,2

which means that the aelem, after having retrieved a (possibly undef)
value from the array, is responsible for autovivifying it into a hash,
ready for the next op. Similarly, the rv2sv that retrieves $r from the
typeglob is responsible for autovivifying it into an AV. This action
of doing the next op's work for it complicates matters somewhat. Within
pp_multideref, the autovivification action is instead included as the
first step of the current action.

In terms of benchmarking with Porting/, a simple lexical
$a[$i][$j] shows a reduction of approx 40% in numbers of instructions
executed, while $r->[0][0][0] uses 54% fewer. The speed-up for hash
accesses is relatively more modest, since the actual hash lookup (i.e.
hv_fetch()) is more expensive than an array lookup. A lexical $h{foo}
uses 10% fewer, while $r->{foo}{bar}{baz} uses 34% fewer instructions.

Overall, --tests='/expr::(array|hash)/' ...
              PRE   POST
           ------ ------

        Ir 100.00 145.00
        Dr 100.00 165.30
        Dw 100.00 175.74
      COND 100.00 132.02
       IND 100.00 171.11

    COND_m 100.00 127.65
     IND_m 100.00 203.90

with cache misses unchanged at 100%.

In general, the more lookups done, the bigger the proportionate saving.

6 years agoadd UNOP_AUX OP class
David Mitchell [Mon, 27 Oct 2014 17:33:32 +0000 (17:33 +0000)]
add UNOP_AUX OP class

This is the same as a UNOP, but with the addition of an op_aux field,
which points to an array of UNOP_AUX_item unions.

It is intended as a general escape mechanism for adding per-op-type extra
fields (or arrays of items) to UNOPs.

Its class character (for regen/opcodes etc) is '+'.

Currently there are no ops of this type; but shortly, OP_MULTIDEREF will
be added, which is the original motivation for this new op type.

6 years agoext/B/Makefile.PL: spot hex defines
David Mitchell [Sun, 2 Nov 2014 16:01:00 +0000 (16:01 +0000)]
ext/B/Makefile.PL: spot hex defines

The regex in ext/B/Makefile.PL was failing to find C constants of the

    #define FOO 0xNNN

where NNN contained one or more [a-fA-F] chars

With this change it imports a few more constants:


6 years agoPerl_op_sibling_splice(): update OPf_KIDS
David Mitchell [Thu, 30 Oct 2014 10:28:06 +0000 (10:28 +0000)]
Perl_op_sibling_splice(): update OPf_KIDS

Previously this function didn't update OPf_KIDS when altering the
children. This was only safe as long as the count of kids didn't transition
between 0 and !0.

6 years agoadd S_deb_padvar() to dump.c
David Mitchell [Fri, 24 Oct 2014 15:23:38 +0000 (16:23 +0100)]
add S_deb_padvar() to dump.c

factor out the code that prints a pad var name in -Dt output

6 years agoadd S_op_clear_gv() to op.c
David Mitchell [Thu, 7 Aug 2014 15:34:23 +0000 (16:34 +0100)]
add S_op_clear_gv() to op.c

Abstract out the code that clear an GV attached to an op,
since we will shortly need to do this in more than one place

6 years agocreate S_check_hash_fields() function
David Mitchell [Sun, 27 Jul 2014 19:59:48 +0000 (20:59 +0100)]
create S_check_hash_fields() function

factor out the code in S_finalize_op() that performs checks on hash keys
into a separate function, since we'll shortly need to call this code from
more than one place.

6 years agoIncrease $arybase::VERSION to 0.09
Father Chrysostomos [Sun, 7 Dec 2014 05:48:27 +0000 (21:48 -0800)]
Increase $arybase::VERSION to 0.09