This is a live mirror of the Perl 5 development currently hosted at
3 years agoNote B::Debug deprecation in perldelta and Porting/
Dagfinn Ilmari Mannsåker [Mon, 21 Aug 2017 14:58:32 +0000 (15:58 +0100)]
Note B::Debug deprecation in perldelta and Porting/

3 years agoperldelta for 5997475bc5
Dagfinn Ilmari Mannsåker [Mon, 21 Aug 2017 09:16:39 +0000 (10:16 +0100)]
perldelta for 5997475bc5

3 years agomake-rmg-checklist - Be more helpful about file open/close errors
Matthew Horsfall [Sun, 20 Aug 2017 23:28:29 +0000 (19:28 -0400)]
make-rmg-checklist - Be more helpful about file open/close errors

3 years agoperlop: fix documentation for s/// "false" return value
Lukas Mai [Sun, 20 Aug 2017 19:12:17 +0000 (21:12 +0200)]
perlop: fix documentation for s/// "false" return value

Commit a0d0e21ea6ea90a2231 ("perl-5.000") added perlop.pod, where s///
was described as returning 0 if no substitutions were made.

commit e37d713d85ec003d03d ("perl 5.003_01: pod/perlop.pod") then
"fixed" the documentation by saying it returns the empty string instead.
And that's how it's been since 1996.

What s/// actually returns on match failure is the canonical false
value, which is both "" and 0 at the same time (depending on
numeric/string context).

3 years agodocument fileno(DIRHANDLE)
Zefram [Sat, 19 Aug 2017 04:02:55 +0000 (05:02 +0100)]
document fileno(DIRHANDLE)

This has been supported since commit
67f2cc757fdda0bee562f2f5899884d09ca382ef in Perl 5.21.7.

3 years agoadd sv_string_from_errnum()
Zefram [Sun, 13 Aug 2017 00:59:43 +0000 (01:59 +0100)]
add sv_string_from_errnum()

This is a new API function, partly substituting for the my_strerror()
that was recently removed from the public API, but also incorporating
the decoding work that's done for $!.

3 years agoImprove heuristic for UTF-8 detection in "$!"
Karl Williamson [Fri, 18 Aug 2017 19:46:25 +0000 (13:46 -0600)]
Improve heuristic for UTF-8 detection in "$!"

Previously, the stringification of "$!" was considered to be UTF-8 if it
had any characters with the high bit set, and everything was
syntactically legal UTF-8.  This may to correctly guess on short strings
where there are only a few non-ASCII bytes.  This could happen in
languages based on the Latin script where many words don't use

This commit adds a check that the locale is a UTF-8 one.  That check is
a call to an already-existing subroutine which goes to some lengths to
get an accurate answer, and should be essentially completely reliable on
modern systems that have nl_langinfo() and/or mbtowc().

See the thread starting at

3 years agodocument dirhandles vs filehandles
Zefram [Fri, 18 Aug 2017 10:07:48 +0000 (11:07 +0100)]
document dirhandles vs filehandles

The statement that they are in separate namespaces was never really true.
Since the recent commit 489c16bfa14d460701bd76a4a4f0658f1200509a a
single I/O object can no longer be opened both ways at once, so the old
statement is now totally false.  Replace it with something describing
the new situation.

3 years agoAdd -Werror=pointer-arith by default
Dagfinn Ilmari Mannsåker [Tue, 8 Aug 2017 10:41:08 +0000 (11:41 +0100)]
Add -Werror=pointer-arith by default

The core is already clean for this.

3 years agoUpdate perlhacktips about default gcc warning flags
Dagfinn Ilmari Mannsåker [Tue, 8 Aug 2017 10:40:25 +0000 (11:40 +0100)]
Update perlhacktips about default gcc warning flags

3 years agoS_opdump_indent(): avoid shift overflow
David Mitchell [Thu, 17 Aug 2017 07:25:50 +0000 (08:25 +0100)]
S_opdump_indent(): avoid shift overflow

RT #131912

the (1 << i) is harmless for large i, but triggers an 'undefined-behavior'
errror in clang.

So work around it.

3 years ago(perl #131793) sanely handle PL_linestart > PL_bufptr
Tony Cook [Wed, 26 Jul 2017 02:04:18 +0000 (12:04 +1000)]
(perl #131793) sanely handle PL_linestart > PL_bufptr

In the test case, scan_ident() ends up fetching another line
(updating PL_linestart), and since in this case we don't
successfully parse ${identifier} s (and PL_bufptr) end up being
before PL_linestart.

3 years agoFix "floating pointer" typo in perldelta
Dagfinn Ilmari Mannsåker [Mon, 14 Aug 2017 09:52:12 +0000 (10:52 +0100)]
Fix "floating pointer" typo in perldelta

3 years agoperldelta for 3cb4cde3dd4d
Tony Cook [Mon, 14 Aug 2017 06:31:24 +0000 (16:31 +1000)]
perldelta for 3cb4cde3dd4d

3 years ago(perl #124368) make /foo/o; /$null/ act consistently
Tony Cook [Tue, 4 Jul 2017 01:44:06 +0000 (11:44 +1000)]
(perl #124368) make /foo/o; /$null/ act consistently

Previously the /o would be inherited by the second match if the first
match was successful, but only on non-threaded builds.

The op-tree rewriting done on non-threaded builds could also confuse
the interpreter, possibly resulting in the match op receiving
the argument intended for the regcomp op.

3 years agoperldelta for adb0f5c46e10
Tony Cook [Mon, 14 Aug 2017 05:58:26 +0000 (15:58 +1000)]
perldelta for adb0f5c46e10

3 years ago(perl #131725) ignore the exponent on a decimal float if no digits
Tony Cook [Thu, 3 Aug 2017 02:11:56 +0000 (12:11 +1000)]
(perl #131725) ignore the exponent on a decimal float if no digits

Previously the "1e-" in "1e--5" would be treated as "1", but consumed
the "e-".

This wasn't an issue for hex floats.

I considered (and implemented) croaking instead, but this was
inconsistent with the behaviour for hex floats, which only reach this
code if a full hex float has been parsed.

3 years agolocale.c: Use strerror_l if platform has it
Karl Williamson [Sun, 16 Jul 2017 00:18:47 +0000 (18:18 -0600)]
locale.c: Use strerror_l if platform has it

strerror_l makes the my_strerror function trivial, as it doesn't have to
worry about critical sections, etc.  Even on unthreaded perls, it avoids
having to change the current locale, and then change it back.

3 years agolocale.c: Refactor some #if clauses
Karl Williamson [Mon, 24 Jul 2017 18:34:29 +0000 (12:34 -0600)]
locale.c: Refactor some #if clauses

This moves all the handling of the case where there are no locale
messages, instead of splitting it up across long stretches of
conditionally compiled code.  This code is essentially trivial, and seen
to be so when it isn't split up; this prepares for the next commit.

The final return of the function is still split off so that all branches
go through it, and the debugging code adjacent to it.

3 years agolocale.c: Move some DEBUGGING code
Karl Williamson [Mon, 24 Jul 2017 04:28:30 +0000 (22:28 -0600)]
locale.c: Move some DEBUGGING code

This is moved so it gets executed for all branches.

3 years agoInitialize locale object even in unthreaded perls
Karl Williamson [Tue, 25 Jul 2017 18:46:00 +0000 (12:46 -0600)]
Initialize locale object even in unthreaded perls

This commit will now initialize the thread-safe C locale object if the
POSIX 2008 functions are available, regardless of whether the perl is
threaded or not.  This will allow for a future commit that uses
them, and which is a win on unthreaded builds.

3 years agolocales: Add #define; change how to override
Karl Williamson [Mon, 24 Jul 2017 22:02:34 +0000 (16:02 -0600)]
locales: Add #define; change how to override

This changes the controlling #define for using the POSIX 2008 locale
functions to "USE_POSIX_2008_LOCALE".  The previous controlling name
"USE_THREAD_SAFE_LOCALE" is retained for backward compatibility.

The reason for this change is that we may add thread-safe locale
handling even on platforms that don't have Posix 2008, so the name
USE_THREAD_SAFE_LOCALE would be used for controlling things in that

In other words, the concepts may become distinct, and so prepare for

3 years agoperllocale: Rmv links to obsolete documents
Karl Williamson [Sat, 12 Aug 2017 23:42:58 +0000 (17:42 -0600)]
perllocale: Rmv links to obsolete documents

3 years agoUse temp files with extensions in rt131211.t on VMS.
Craig A. Berry [Sat, 12 Aug 2017 13:11:47 +0000 (08:11 -0500)]
Use temp files with extensions in rt131211.t on VMS.

On VMS, a file without an extension is really a file with an
explicitly specified "." indicating zero-length extension. This
was causing tests to fail with, for example, "abbbbbbbbbbbbc" not
matching "abbbbbbbbbbbbc." as returned by glob.

So add a ".tmp" extension to all the temp files on VMS only.

3 years agoFix missing break in tovmsspec.
Craig A. Berry [Sat, 12 Aug 2017 13:01:16 +0000 (08:01 -0500)]
Fix missing break in tovmsspec.

When encountering a question mark in a filespec being converted
from Unix to VMS format, we were inadvertently adding an escaped
space because of a missing break in a switch.

3 years agoperldelta for fa2e45943e2b
Tony Cook [Thu, 10 Aug 2017 01:59:52 +0000 (11:59 +1000)]
perldelta for fa2e45943e2b

3 years ago(perl #131786) avoid a duplicate symbol error on _LIB_VERSION
Tony Cook [Wed, 2 Aug 2017 06:15:06 +0000 (16:15 +1000)]
(perl #131786) avoid a duplicate symbol error on _LIB_VERSION

For -flto -mieee-fp builds, the _LIB_VERSION definition in perl.c and
in libieee conflict, causing a build failure.

The test we perform in Configure checks only that such a variable exists
(and is declared), it doesn't check that we can *define* such a variable,
which the code in pp.c tried to do.

So rather than trying to define the variable, just initialize it during
our normal interpreter initialization.

3 years agoutf8.c: EBCDIC fix
Karl Williamson [Wed, 9 Aug 2017 20:42:32 +0000 (14:42 -0600)]
utf8.c: EBCDIC fix

Commit d819dc506b9fbd0d9bb316e42ca5bbefdd5f1d77 did not fully work.  I
switched the wrong thing that should have been in native vs
Unicode/Latin1, and forgot to update the test file.

Hopefully this is correct.

3 years agoAdd Ken Brown to AUTHORS
Tony Cook [Wed, 9 Aug 2017 06:24:15 +0000 (16:24 +1000)]
Add Ken Brown to AUTHORS

3 years agoConfigure: check for GCC 6 and 7
Ken Brown [Thu, 27 Jul 2017 15:57:44 +0000 (11:57 -0400)]
Configure: check for GCC 6 and 7

3 years agotest cv_[gs]et_call_checker_flags()
Zefram [Tue, 8 Aug 2017 20:37:46 +0000 (21:37 +0100)]
test cv_[gs]et_call_checker_flags()

3 years agouse cv_set_call_checker_flags() where possible
Zefram [Tue, 8 Aug 2017 19:06:11 +0000 (20:06 +0100)]
use cv_set_call_checker_flags() where possible

Call checkers established by core code were being set through
cv_set_call_checker(), so requiring GVs to be created in some cases where
they could be avoided.  Make all the checkers non-GV-namegv capable,
and set them with cv_set_call_checker_flags().

The checkers for Devel::Peek::Dump() and
utf8::{unicode_to_native,native_to_unicode}() were already fit to handle
non-GV names, so required no changes.  The checker for CORE:: subs,
ck_entersub_args_core(), was naughtily using the name to decide which sub
it was dealing with in some cases, so move that information into the ckobj
that was already being used to identify the sub in most cases.  It also
required reformulation of some error reporting code to use cv_name().

3 years agoadd cv_get_call_checker_flags()
Zefram [Tue, 8 Aug 2017 12:30:01 +0000 (13:30 +0100)]
add cv_get_call_checker_flags()

The new cv_get_call_checker_flags() is the obvious counterpart to
the existing cv_set_call_checker_flags(), which was added without
providing any public way to retrieve the flag state.  Not only does
cv_get_call_checker_flags() return the CALL_CHECKER_REQUIRE_GV flag
state, it also takes a flags parameter as an input, to allow for
future expansion.  The gflags input can at minimum be used for the
caller to indicate which flags it understands, if more checker flags
are added in the future, in case such flags are not ignorable in
the way that CALL_CHECKER_REQUIRE_GV is.  In this commit the gflags
parameter is applied to indicate whether the caller understands the
CALL_CHECKER_REQUIRE_GV flag, or more precisely (due to the funny inverted
sense of the flag) whether it understands the flag being clear.  This use
of gflags isn't really necessary, but establishes the pattern of usage.

3 years agoBump ExtUtils::Constant version to 0.24.
Nicholas Clark [Fri, 23 Jun 2017 15:06:25 +0000 (17:06 +0200)]
Bump ExtUtils::Constant version to 0.24.

The Changes file is still horriby out of date, and the trickier-to-fix (or
test) bugs remain open in RT, but it seems better to get a release out with
the fixed bugs than delay it further whilst figuring out the cleanest way to
fix the open bugs. The perfect is the enemy of the good.

3 years agoExtUtils::Constant: Remove impediment to compiling under C++11
Karl Williamson [Sat, 19 Nov 2016 14:14:29 +0000 (07:14 -0700)]
ExtUtils::Constant: Remove impediment to compiling under C++11

C++11 changed from earlier versions to require space between the end of
a string literal and a macro, so that a feature can unambiguously be
added to the language.  Starting in g++ 6.2, the compiler emits a
deprecation warning when there isn't a space (presumably so that future
versions can support C++11).  This commit fixes ExtUtils::Constant

This patch also changes any affected lines that exceed 79 columns, as
specified by perlhack.

Code and modules included with the Perl core need to be compilable using
C++.  This is so that perl can be embedded in C++ programs. (Actually,
only the hdr files need to be so compilable, but it would be hard to
test that just the hdrs are compilable.)  So we need to accommodate
changes to the C++ language.

3 years agoEU::Constant: avoid 'uninit' warning
David Mitchell [Mon, 15 Dec 2014 16:14:13 +0000 (16:14 +0000)]
EU::Constant: avoid 'uninit' warning

The code generated by ExtUtils::Constant can look something like:

static int
constant (..., IV *iv_return) {
   switch (...) {
     case ...:
       *iv_return = ...;
       return PERL_constant_ISIV;

    int type;
    IV iv;
    type = constant(..., &iv);
    switch (type) {
        case PERL_constant_ISIV:

and the compiler isn't clever enough to realise that the value of iv
is only used in the code path where its been set.

So initialise it to zero to shut gcc up. Ditto nv and pv.

3 years agoExtUtils::Constant - better machine code on threaded perl
Daniel Dragan [Sun, 10 May 2015 22:38:29 +0000 (18:38 -0400)]
ExtUtils::Constant - better machine code on threaded perl

croak doesnt require a context param to be pushed on the c stack,
Perl_croak does, since Perl_croak/croak is very rarily called, minimize
the machine code of the error branches

don't do dTHX in thread aware XS code, this just sets up another my_perl
var for the scope of const-xs BOOT sum masking the original declared
my_perl in the outer C scope

3 years agoTypo fixes.
Nicholas Clark [Sat, 24 Jun 2017 19:08:51 +0000 (21:08 +0200)]
Typo fixes.

Spotted by, reported as CPAN #85527.
However, I think that the "to to" should be "to do", not "to".

3 years agoAvoid compiler warnings due to mismatched types in *printf format strings.
Robin Barker [Mon, 17 Dec 2012 17:20:14 +0000 (18:20 +0100)]
Avoid compiler warnings due to mismatched types in *printf format strings.

gcc (and probably others) was warning about a mismatch for between `int`
(implied by the format %d) and the actual type passed, `line_t`. Avoid this
by explicitly casting to UV, and using UVuf.

CPAN #63832

3 years agoregen/op_private: remove sassign special-casing
David Mitchell [Tue, 8 Aug 2017 11:19:53 +0000 (12:19 +0100)]
regen/op_private: remove sassign special-casing

Since v5.25.5-46-g1257c08, sassign has been correctly listed in
regen/opcodes as a binary op ('2') rather than as a base op, so there's no
need to special-case it in regen/op_private any more.

This commit makes no functional changes, because since
v5.25.5-46-g1257c08, $args2{sassign} was redundantly getting set to a true
value twice, which was harmless. Now it only gets set once.

3 years agofix parameter name in doc
Zefram [Tue, 8 Aug 2017 10:44:22 +0000 (11:44 +0100)]
fix parameter name in doc

The documentation for wrap_op_checker() had an incorrect parameter name.
This was part of the original version of this documentation in commit

3 years agoRevert "Perl_sv_vcatpvfn_flags: skip IN_LC(LC_NUMERIC)"
David Mitchell [Tue, 8 Aug 2017 08:53:13 +0000 (09:53 +0100)]
Revert "Perl_sv_vcatpvfn_flags: skip IN_LC(LC_NUMERIC)"

This reverts commit c10a72e1914795f6399890aafae13734552645cd.

I thought that if PL_numeric_radix_sv is true, then IN_LC(LC_NUMERIC) must
be true, so no need to test for both. So I replaced the expensive
IN_LC(LC_NUMERIC) test with an assert.

But in, Karl points
out that  the assert is triggering on HP-UX.

So there's something wrong with my logic something.

So revert.

3 years ago(perl #131646) make the test less fragile
Tony Cook [Tue, 8 Aug 2017 04:45:29 +0000 (14:45 +1000)]
(perl #131646) make the test less fragile

The original pattern "UXp>" with the $_ that causes the failure, 5,
so we end up packing exp(5) or 148.... with U packs:

 - U (148), producing C2 94, with the UTF8 flag set
 - X - back up a byte,
 - p> - write the address of PL_sv_no's PV in big-ending

The final p> will typically overwrite the 94 with a zero on 64-bit
systems, but with the smaller address space of 32-bit systems that
high-byte is more likely to be a valid continuation byte, causing
the comparison to fail.

Instead just pack a zero byte.

3 years agolib/locale.t: TODO some netbsd defective locales
Karl Williamson [Mon, 17 Jul 2017 21:40:42 +0000 (15:40 -0600)]
lib/locale.t: TODO some netbsd defective locales

This is part of [perl #131735]

The ISO 8859-2 locales on netbsd 7.1 tend to have the defect of thinking
an NBSP is a graphic character.  This commit tells lib/locale.t to TODO
these failures, so that they don't fail our smokes.

These are defects in the locale furnished by the vendor, and not a Perl

3 years agolib/locale.t: Add comments
Karl Williamson [Mon, 7 Aug 2017 16:36:51 +0000 (10:36 -0600)]
lib/locale.t: Add comments

This adds some general comments about the portions of the file that test
locales against what the POSIX standard specifies.

3 years agolib/locale.t: Canonicalize $^O into lowercase
Karl Williamson [Mon, 7 Aug 2017 15:57:25 +0000 (09:57 -0600)]
lib/locale.t: Canonicalize $^O into lowercase

This allows the name to be checked for without needing to worry about
case.  Some patterns used /i, but other things used 'eq'.

3 years agofix index(...) == -1 type optimisations
David Mitchell [Mon, 7 Aug 2017 15:58:11 +0000 (16:58 +0100)]
fix index(...) == -1 type optimisations

RT #131851

It was incorrectly optimising some permutations of comparison op and 0/-1
which shouldn't have been, such as

    0 < index(...);

3 years agoutf8_to_uvchr() EBCDIC fix
Karl Williamson [Sun, 6 Aug 2017 03:47:08 +0000 (21:47 -0600)]
utf8_to_uvchr() EBCDIC fix

This fixes a warning message for EBCDIC.  The native character set is
different than Unicode, and needs special handling.  I earlier tried to
save an #ifdef, but the resulting warning was hard to test right, and
that helped convince me that it would be confusing to anyone trying to
make sense of the message.  So, in goes the #ifdef.

3 years agot/perf/opcount.t typo
David Mitchell [Sat, 5 Aug 2017 18:40:27 +0000 (19:40 +0100)]
t/perf/opcount.t typo

fix typo from my recent commit. Spotted by Jarkko.

3 years agoConsider magic %ENV as tied in hv_pushkv.
Craig A. Berry [Sat, 5 Aug 2017 13:00:32 +0000 (08:00 -0500)]
Consider magic %ENV as tied in hv_pushkv.

For the DYNAMIC_ENV_FETCH case, we don't know the number of keys
until the first iteration triggers a call to prime_env_iter(), so
piggyback on the tied magic case, which already handles extending
the stack for each iteration rather than all at once beforehand.

3 years agoextend index(...) == -1 optimisation
David Mitchell [Sat, 5 Aug 2017 11:12:42 +0000 (12:12 +0100)]
extend index(...) == -1 optimisation

Recently I made it so that in expression like index(...) == -1, the
const and eq ops are optimised away and a BOOL flag is set on the index

This commit expands this to various permutations of relational ops too,
such as

    index(...) >=  0
    index(...) <   0
    index(...) <= -1

3 years agot/op/index.t: automate a block of tests
David Mitchell [Sat, 5 Aug 2017 07:28:22 +0000 (08:28 +0100)]
t/op/index.t: automate a block of tests

A block of tests I added recently tests that (index(...) == -1) style
optimisations don't break things.

Each test was hard-coded. Instead, use some nested loops and eval
to test all the combinations.

This commit does just the same tests as before, but it will allow us to
easily add more tests without lots of duplication.

3 years agomerge Perl_ck_cmp() and Perl_ck_eq()
David Mitchell [Fri, 4 Aug 2017 15:40:15 +0000 (16:40 +0100)]
merge Perl_ck_cmp() and Perl_ck_eq()

I added ck_eq() recently; it's used for the EQ and NE ops, while ck_cmp()
is used for LT, GT, LE, GE.

This commit eliminates the ck_eq() function and makes ck_cmp() handle
EQ/NE too.

This will will make it easier to extend the index() == -1 optimisation
to handle index() >= 0 etc too.

At the moment there should be no functional differences.

3 years agoset SVs_PADTMP flag on PL_sv_zero
David Mitchell [Fri, 4 Aug 2017 14:17:44 +0000 (15:17 +0100)]
set SVs_PADTMP flag on PL_sv_zero

Where an op in scalar but not boolean context returns &PL_sv_zero as a
more efficient way of doing sv_2mortal(newSViv(0)), the returned value
must be mutable. For example

    my @a = ();
    my $r = \ scalar grep $_ == 1, @a;
    $$r += 10;

By setting the SVs_PADTMP flag, this forces pp_srefgen() and similar to
make a mortal copy of &PL_sv_zero.

This kind of defeats the original optimisation, but the copy only kicks
in under certain circumstances, whereas the newSViv(0) approach would
create a new mortal every time.

See RT #78288 for where FC suggested the problem and the solution.

3 years agoPVLV-as-REGEXP: avoid PVX double free
David Mitchell [Fri, 4 Aug 2017 13:28:15 +0000 (14:28 +0100)]
PVLV-as-REGEXP: avoid PVX double free

With v5.27.2-30-gdf6b4bd, I changed the way that PVLVs store a regexp
value (by making the xpv_len field point to a regexp struct). There was a
bug in this, which caused the PVX buffer to be double freed.

Several REGEXP SVs can share a PVX buffer. Only one of them will have a
non-zero xpv_len field, and that SV gets to free the buffer.

After the commit above, the non-zero xpv_len was triggering an extra free.

This was showing up in smokes as failures in re/recompile.t when invoked
with PERL_DESTRUCT_LEVEL=2 (which t/TEST does).

3 years agosv_dump(): display regex LEN and LV-as-RX regexp
David Mitchell [Fri, 4 Aug 2017 13:00:26 +0000 (14:00 +0100)]
sv_dump(): display regex LEN and LV-as-RX regexp

When the len field of a REGEXP isn't usurped, display it (it used to
always be skipped for REGEXPs).

When it's usurped by a PVLV to point to a 'struct regexp', display it as
a pointer.

3 years agoPerl_reg_temp_copy(): rename args.
David Mitchell [Fri, 4 Aug 2017 12:12:55 +0000 (13:12 +0100)]
Perl_reg_temp_copy(): rename args.

This function copies a regexp SV. Rename its args to ssv and dsv to
match a usual convention in other functions such as sv_catsv().

Similarly rename the two local vars holding ReANY(ssv/dsv) to srx, drx.

This is less confusing than having four vars called rx, ret_x, r, ret.

Also update the comments explaining what the function does.

3 years agopod/perltie.pod: mention SCALAR() for boolean keys
David Mitchell [Fri, 4 Aug 2017 10:50:07 +0000 (11:50 +0100)]
pod/perltie.pod: mention SCALAR() for boolean keys

After a recent commit of mine, SCALAR() is now called by 'keys' in boolean
context, e.g.

    if (keys %tied) { ... }

update the docs to reflect this. See the thread

3 years agoSvTRUE(): add code comment
David Mitchell [Fri, 4 Aug 2017 08:48:06 +0000 (09:48 +0100)]
SvTRUE(): add code comment

explain that the '!= 0' is acting as a bool cast (since SvTRUE() is
supposed to return a bool value rather than an int value).

3 years agomake utf8::upgrade() of a REGEXP a NOOP
David Mitchell [Fri, 4 Aug 2017 07:51:49 +0000 (08:51 +0100)]
make utf8::upgrade() of a REGEXP a NOOP

RT #131821

After my recent commit

    v5.27.2-30-gdf6b4bd, "give REGEXP SVs the POK flag again",

    $r = qr/.../; utf8::upgrade($$r);

was setting the utf8 flag on the compiled REGEXP SV, which made no sense,
as the regex was already compiled and individual nodes would remain

The POK flag was removed from REGEXPs in 5.18.0, but before then it didn't
seem to matter if the utf8 flag got set later, but it does now - it broke
a Tk test.

3 years agofix RX_MATCH_UTF8_on() macro
David Mitchell [Tue, 1 Aug 2017 09:18:47 +0000 (10:18 +0100)]
fix RX_MATCH_UTF8_on() macro

v5.27.2-34-g196a02a reorganised the RX_FOO() macros, mostly redefining
them in terms of the RXp_FOO() macros. A cut-an-paste error screwed up
the definition of RX_MATCH_UTF8_on(), which is isn't used in core.

3 years agoData::Dumper: Prevent XS deparse being used on old perls
Steffen Mueller [Fri, 4 Aug 2017 07:47:01 +0000 (09:47 +0200)]
Data::Dumper: Prevent XS deparse being used on old perls

Aaron's improvement mysteriously breaks on old perls. Instead of
investing hours into investigation of what will likely turn out to be
old perl bugs, we simply don't use XS deparse on ancient perls.  This
simply restores long standing behaviour, so it is no regression to any
released version of Data::Dumper.

Tested, still fails on 5.12 and earlier, works on 5.18, not sure about

Could somebody who needs old perls to work please step up to

Includes necessary version bump.

3 years agoperlop: use <<~FOO construct in example of indented here-docs
Lukas Mai [Thu, 3 Aug 2017 21:39:07 +0000 (23:39 +0200)]
perlop: use <<~FOO construct in example of indented here-docs

3 years agoFilter::Simple: Version bump to align with CPAN release
Steffen Mueller [Thu, 3 Aug 2017 14:29:15 +0000 (16:29 +0200)]
Filter::Simple: Version bump to align with CPAN release

3 years agoSelfLoader: Version bump for CPAN sync
Steffen Mueller [Thu, 3 Aug 2017 14:09:16 +0000 (16:09 +0200)]
SelfLoader: Version bump for CPAN sync

3 years agofix ($lex = index(....)) == -1
David Mitchell [Tue, 1 Aug 2017 07:19:42 +0000 (08:19 +0100)]
fix ($lex = index(....)) == -1

RT #131823

My recent commit v5.27.2-56-g7e8d786 optimised index() == -1 and similar.
It asserted that in such an expression, the index op's OPpTARGET_MY
flag couldn't be set. This was an incorrect assumption, obvious in

    ($lex = index(....)) == -1

gets compiled as

    <@> index[$r:2,3] sKP/TARGMY,2 ->c
       <0> ex-pushmark s ->9
       <0> padsv[$s:1,3] s ->a
       <$> const[PVMG "a"] s ->b
    <$> const[IV -1] s/FOLD ->d

The fix is simple: skip the optimisation if OPpTARGET_MY is present,
rather than assert failing.

3 years agofix SvTRUE() cast (broke xor)
David Mitchell [Mon, 31 Jul 2017 22:32:23 +0000 (23:32 +0100)]
fix SvTRUE() cast (broke xor)

RT #131820

It turns out that the 'xor' operator is almost completely untested in
core. A recent change of mine to the SvTRUE() macros made it sometimes
return an int (SvIVX(sv)) rather than a boolean (SvIVX(sv)!=0), while its
documented to return a boolean.

pp_xor() tests for (SvTRUE(left) != SvTRUE(right)) which subsequently
broke, e.g. (1 xor 5) started returning true rather than false.

Fix SvTRUE() and add some basic xor tests.

3 years agoEU::ParseXS: Version bump and changelog for CPAN release
Steffen Mueller [Mon, 31 Jul 2017 15:46:51 +0000 (17:46 +0200)]
EU::ParseXS: Version bump and changelog for CPAN release

3 years agoAdd SvPVCLEAR fallback definiton to Data::Dumper
Steffen Mueller [Mon, 31 Jul 2017 15:18:20 +0000 (17:18 +0200)]
Add SvPVCLEAR fallback definiton to Data::Dumper

See also: 40c7720facf5e6944805c593ad6a5604ad88c9ce

Also includes changelog entry for DD dev release to CPAN.

3 years ago... And now for something completely different
Chris 'BinGOs' Williams [Mon, 31 Jul 2017 14:15:42 +0000 (15:15 +0100)]
... And now for something completely different

3 years agofix example code in wrap_op_checker() doc
Zefram [Mon, 31 Jul 2017 10:10:16 +0000 (11:10 +0100)]
fix example code in wrap_op_checker() doc

Commit b93e7f0e1e15a1bbbcd9031bc4b66a5c60686eca added some code fragments
to the documentation of this function in order to explain it, but
got part of it wrong, confusing a pointer with the thing it points to.
Correct that, and reformulate the fragments of code into a more coherent
single example.

3 years agoAPItest/t/ Fix broken tests
Karl Williamson [Mon, 31 Jul 2017 03:47:17 +0000 (21:47 -0600)]
APItest/t/ Fix broken tests

There was a typo in one test, and in the other, the code point is output
as Unicode, not native.

3 years agoAPItest/t/utf8.t: Fix broken test on EBCDIC
Karl Williamson [Mon, 31 Jul 2017 03:45:44 +0000 (21:45 -0600)]
APItest/t/utf8.t: Fix broken test on EBCDIC

Perl-extended UTF-8 begins at a different code point on EBCDIC

3 years agoperlsub: don't recommend leaky code for recursive "my" subs
Lukas Mai [Sun, 30 Jul 2017 15:17:13 +0000 (17:17 +0200)]
perlsub: don't recommend leaky code for recursive "my" subs

3 years agomake _GNU-ish function declarations visible on cygwin
Tony Cook [Fri, 28 Jul 2017 05:19:46 +0000 (15:19 +1000)]
make _GNU-ish function declarations visible on cygwin

The lack of this caused several test failures on cygwin64, the one case
I tracked down involved memmem() which is a GNU extension that cygwin

Since the compiler couldn't see the memmem() prototype it treated it's
return value as int, which was then cast to (char *) preventing any
type-mismatch warning, but since int is 32-bits and (char *) on
cygwin64, the upper 32-bits of the pointer was cleared, resulting in a

After adding this a test cygwin64 build went from 30 or so test failures
to one.

3 years agofix RX_MATCH_COPY_FREE() on win32
David Mitchell [Thu, 27 Jul 2017 19:17:43 +0000 (20:17 +0100)]
fix RX_MATCH_COPY_FREE() on win32

My recent commit made RX_MATCH_COPY_FREE() a wrapper for
RXp_MATCH_COPY_FREE() but it didn't build on VC 2003.

Spotted by bulk88.

3 years ago[perl #131726] [Win32] perl.h remaps 'strtoll' and 'strtoull' incorrectly
Steve Hay [Thu, 27 Jul 2017 17:13:13 +0000 (18:13 +0100)]
[perl #131726] [Win32] perl.h remaps 'strtoll' and 'strtoull' incorrectly

Fix by Kai-Uwe Eckhardt <kuehro [...]> taken from
as suggested by Sisyphus on perl#131726.

3 years ago[MERGE] various boolean-related optimisations
David Mitchell [Thu, 27 Jul 2017 10:30:50 +0000 (11:30 +0100)]
[MERGE] various boolean-related optimisations

This branch contains about 50 commits, which collectively optimise
various aspects of perl's behaviour when detailing with boolean values
or ops that are called in boolean context.

The main changes are:

* A &PL_sv_zero variable has been added. This is a new per-interpreter
immortal SV, very similar to &PL_sv_no, except that it has a string value
of "0" rather than "". As well as being directly usable in cases where
code might otherwise need to do newSViv(0), it has a more subtle use in
ops that handle boolean context directly. For example in

    sub f {
        if (%h) { .... }

the 'if' statement is compiled using OP_AND, so is equivalent to

        %h && do { .... }

If %h is empty, then the result of the boolean expression should be 0
rather than &PL_sv_no, and this value gets returned to the caller, which
may expect a scalar result: and what it expects won't be known until run
time.  So by returning &PL_sv_yes and &PL_sv_zero rather than yes and no,
we increase the number of places where it is safe to return a boolean

A downside of &PL_sv_zero is that if assigned to a variable, that variable
gets int, num and string values rather than just an int value.

* SvTRUE() is now more efficient.

This macro is called in places like pp_and, pp_not etc. It has a long list
of conditions which it goes through to determine the truthiness of an SV,
such as whether it has a string value, and if so whether the length is
zero, or the length is 1 and the string's value is "0". It turns out that
the immortals like &PL_sv_yes fare really badly here: they have to go
through nearly every check to finally determine their value. To get round
this, I have made it very quick to check whether an SV is one of the
immortals, and if so whether it is true. This has been done by ensuring
that PL_sv_undef, PL_sv_no, PL_sv_zero and PL_sv_yes are all contiguous in
memory, so that a quick single address comparison is enough to determine
immortality, and then comparing the address against &PL_sv_yes is enough
to determine whether its true.

In particular in non-multiplicity builds, PL_sv_undef etc have been
replaced with the array PL_sv_immortals[4], with PL_sv_undef #defed to
PL_sv_immortals[0] etc.

Also, the SvOK() macro has been made more efficient by restoring the POK
flag on REGEXP svs and and PVLVs which hold a regex. This removes the two
extra checks that SvOK() had to do each time. This has been done by
changing the way that PVLV's-holding-a-regex are implemented. The downside
of this change is that ReANY() now includes a single conditional. To
ameliorate that, places like pp_match() have been tweaked to only fetch
ReANY() once where possible.

* the OP_KEYS op is now optimised away in void and scalar context.
Since a hash in scalar context was changed so that it no longer returns a
bucket count but instead just a key count, '%h' and 'keys %h' in
void/boolean/scalar context are now very similar. So for 'keys %h', rather
than calling pp_padhv+pp_keys, just call pp_padhv with a OPpPADHV_ISKEYS
flag set. Similarly for pp_rv2hv. As well as skipping an extra op call,
this brings the existing boolean-context optimisations of '%h' to 'keys
%h' too. In particular, 'keys %tied' in boolean context now calls SCALAR()
if available, or FIRSTKEY() otherwise, rather than iterating through the
whole hash.

I have also given OP_RV2HV a targ so that it can return integer values
more efficiently.

* Various integer-returning ops are now flagged when in boolean context,
which means at runtime they can just return &PL_sv_yes/&PL_sv_zero rather
than setting a targ to an integer value, or for ops without targs, having
to create a new integer-valued mortal. As well as being quicker to return
a value, this works well with SvTRUE() which now recognises immortals
quickly. Also for ops like length() and pos(), it doesn't need to convert
between byte and char offsets; the fact that the offset is non-zero is

These ops are:


Also, index() doesn't return a boolean value, but for no match it returns
-1. So for code like

    if (index(...) != -1) { ... }

optimise away the OP_CONST and the OP_EQ and flag the index op to return a
boolean value.

* Speed up OP_ITER

OP_ITER is called for every iteration of a for loop or similar. Its job is
iterate the loop variable once, then return &PL_sv_yes or &PL_sv_no
depending on whether it's the last iteration. OP_ITER is always followed
by OP_AND, which examines the truth value on the stack, and returns
op_next or op_other accordingly. Now, pp_iter() just asserts that
PL_op->op_next is an OP_AND, and returns PL_op->op_next->op_next or
PL_op->op_next->op_other directly, skipping the PL_sv_yes/no push/pop and
eliminating the call to pp_and().

As part of these changes, I have moved pp_padav(), pp_padhv() from pp.c
to pp_hot.c, moved some common code into a new function
S_padhv_rv2hv_common(), created a new (non-API) function Perl_hv_pushkv()
which pushes a hash's keys or values or both onto the stack, and reduced
the number of callers of Perl_do_kv() (which was acting as both a pp
function for several ops and as a general-purpose function too).

Of the 360 or so tests in t/perf/benchmarks, the following number of
tests had their COND field changed from 100% to the following ranges:

   36 @  96.55% ..  99.99%
  245 @ 100.00% .. 100.99%
   28 @ 101.00% .. 109.99%
    7 @ 110.00% .. 119.99%
   10 @ 120.00% .. 129.99%
   29 @ 130.00% .. 199.99%
    4 @ 200.00% .. 299.99%
    1 @ 314.29%

so about 10% of tests became marginally slower - usually due to one extra
conditional in an op to test for a private BOOL flag or ReANY(); about 70%
of tests were almost unaffected, while 20% of tests showed improvement,
most with considerable improvement, and a few with spectacular improvement.
(The 314% is for an empty @lexical tested in boolean context).

3 years agot/perf/benchmarks: rename some keys() entries
David Mitchell [Tue, 25 Jul 2017 14:10:53 +0000 (15:10 +0100)]
t/perf/benchmarks: rename some keys() entries

move and rename

and add

since its really testing the keys() function in boolean context rather
than a hash in boolean context.

3 years agomake scalar(keys(%lexical)) less slow.
David Mitchell [Sun, 23 Jul 2017 15:31:38 +0000 (16:31 +0100)]
make scalar(keys(%lexical)) less slow.

A recent commit in this branch made OP_PADHV / OP_RV2HV in void/scalar
context, followed by OP_KEYS, optimise away the OP_KEYS op and set the

However, in scalar but non-boolean context with OP_PADHV, this actually
makes it slower, because the OP_KEYS op has a target, while the OP_PADHV
op doesn't, thus it has to create a new mortal each time to return the
integer value.

This commit fixes that by, in the case of scalar padhv, retaining the
OP_KEYS node (although still not keeping it in the execution path), then
at runtime using that op's otherwise unused target.

This only works on PERL_OP_PARENT builds (now the default) as the OP_KEYS
is the parent of the OP_PADHV, so would be hard to find at runtime

This commit also fixes pp_padhv/pp_rv2hv in void context - formerly it
was needlessly pushing a scalar-valued count like scalar context.

3 years agohv_pushkv(): handle keys() and values() too
David Mitchell [Fri, 21 Jul 2017 13:32:57 +0000 (14:32 +0100)]
hv_pushkv(): handle keys() and values() too

The newish function hv_pushkv() currently just pushes all key/value pairs on
the stack. i.e. it does the equivalent of the perl code '() = %h'.
Extend it so that it can handle 'keys %h' and values %h' too.

This is basically moving the remaining list-context functionality out of
do_kv() and into hv_pushkv().

The rationale for this is that hv_pushkv() is a pure HV-related function,
while do_kv() is a pp function for several ops including OP_KEYS/VALUES,
and expects PL_op->op_flags/op_private to be valid.

3 years agot/op/tie.t: add tests for scalar(keys(%tied))
David Mitchell [Thu, 20 Jul 2017 07:58:02 +0000 (08:58 +0100)]
t/op/tie.t: add tests for scalar(keys(%tied))

Test what methods it calls. Currently it calls FIRSTKEY() and then
NEXTKEY() x n, regardless of whether SCALAR() is present, although that
might change. This test codifies the current behaviour for now.

3 years agoS_padhv_rv2hv_common(): reorganise code
David Mitchell [Wed, 19 Jul 2017 16:48:03 +0000 (17:48 +0100)]
S_padhv_rv2hv_common(): reorganise code

There are three main booleans in play here:

    * whether the hash is tied;
    * whether we're in boolean context;
    * whether we're implementing 'keys %h'

Reorganise the if-tree logic for these up to 8 permutations to make the
code simpler. In particular, make it so that all these are done in only
one place:

    * call HvUSEDKEYS();
    * call magic_scalarpack();
    * push an integer return value, either as TARG or mortal

The functionality should be unchanged, except that now 'scalar(%h)',
where %h isn't tied, will return an integer value using the targ if
available rather than always creating a new mortal.

3 years agoS_padhv_rv2hv_common(): unroll hv_scalar() calls
David Mitchell [Wed, 19 Jul 2017 16:06:28 +0000 (17:06 +0100)]
S_padhv_rv2hv_common(): unroll hv_scalar() calls

This function makes a couple of calls to hv_scalar(), which does
one of two things depending on whether hash is tied or not.
Since in S_padhv_rv2hv_common() we've already determined whether the
hash is tied, just include the relevant part(s) of hv_scalar() directly.

The code will be reorganised shortly.

3 years agosimplify keys(%tied_hash) in boolean context.
David Mitchell [Wed, 19 Jul 2017 15:50:14 +0000 (16:50 +0100)]
simplify keys(%tied_hash) in boolean context.

Previously something like

    if (keys %tied_hash) { ... }

would have called FIRSTKEY(), followed by NEXTKEY() x N.

Now, it just calls SCALAR() once if present, and if not, falls
back to calling just FIRSTKEY() once.

i.e. it only needs to determine whether at least one key is present.

The behaviour of of 'keys(%tied) in boolean context now matches that of
'(%tied) in boolean context.


3 years agoS_pushav(): tail call optimise
David Mitchell [Wed, 19 Jul 2017 13:31:27 +0000 (14:31 +0100)]
S_pushav(): tail call optimise

Make it return PL_op->op_next so that (some of) its callers can be
tail-call optimised, if the compiler supports such a thing.

3 years agopp_padav(): use S_pushav()
David Mitchell [Wed, 19 Jul 2017 13:21:28 +0000 (14:21 +0100)]
pp_padav(): use S_pushav()

The previous commit harmonised the two functions, so its ok to use
S_pushav() now.

3 years agoharmonise S_pushav() and pp_padav()
David Mitchell [Wed, 19 Jul 2017 13:04:36 +0000 (14:04 +0100)]
harmonise S_pushav() and pp_padav()

These two functions contain a similar block of code to push an array
onto the stack. However they have some slight differences, which this
commit removes. This will allow padav() to call S_pushav() in the next

The two differences are:

1) S_pushav() when pushing elements of a magical array, calls mg_get()
on each element. This is to ensure that e.g. in

    sub f { /..../; @+ }

when the elements of @+ are returned, they are set *before* the current
pattern goes out of scope.

However, since probably v5.11.5-132-gfd69380 and v5.13.0-22-g2d961f6,
the mg_get is no longer required.

2) S_pushav() uses the SvRMAGICAL() test to decide whether its unsafe
to access AvARRAY directly; pp_padav() uses SvMAGICAL(). The latter
seems too severe, so I've changed it to SvRMAGICAL().

3 years agoPerl_hv_pushkv(): unroll hv_iterkeysv()
David Mitchell [Wed, 19 Jul 2017 08:11:33 +0000 (09:11 +0100)]
Perl_hv_pushkv(): unroll hv_iterkeysv()

Do our own mortal stack extending and handling.

3 years agocreate Perl_hv_pushkv() function
David Mitchell [Mon, 17 Jul 2017 16:51:57 +0000 (17:51 +0100)]
create Perl_hv_pushkv() function

...and make pp_padhv(), pp_rv2hv() use it rather than using Perl_do_kv()

Both pp_padhv() and pp_rv2hv() (via S_padhv_rv2hv_common()), outsource to
Perl_do_kv(), the list-context pushing/flattening of a hash onto the

Perl_do_kv() is a big function that handles all the actions of
keys, values etc. Instead, create a new function which does just the
pushing of a hash onto the stack.

At the same time, split it out into two loops, one for tied, one for
normal: the untied one can skip extending the stack on each iteration,
and use a cheaper HeVAL() instead of calling hv_iterval().

3 years agoGive OP_RV2HV a targ
David Mitchell [Mon, 17 Jul 2017 15:33:38 +0000 (16:33 +0100)]
Give OP_RV2HV a targ

OP_RV2AV already has one; its not clear why OP_RV2HV didn't.
Having one means that in scalar context it can return an int value
without having to create a mortal. Ditto when its doing 'keys %h' via

3 years agoadd S_padhv_rv2hv_common() function
David Mitchell [Mon, 17 Jul 2017 14:52:38 +0000 (15:52 +0100)]
add S_padhv_rv2hv_common() function

This STATIC INLINE function extracts out a chunk of common code from
pp_padhv() and pp_rv2hv() (well, from pp_rv2av() actually, since that
handles OP_RV2HV too).

Should be no functional changes, except that now in void context,
'keys %h' doesn't leave any rubbish on the stack.

3 years agomove pp_padav(), pp_padhv() from pp.c to pp_hot.c
David Mitchell [Mon, 17 Jul 2017 12:47:12 +0000 (13:47 +0100)]
move pp_padav(), pp_padhv() from pp.c to pp_hot.c

Just a cut+paste; no code or functional changes.

As well as being hot code, pp_padav() and pp_padhv() also have a lot of
code in common with pp_rv2av() (which also implements pp_rv2hv()). Having
all three functions in the same file will allow the next few commits to
move some of that common code into static inline functions.

3 years agopp_grepwhile: no need to extend the stack
David Mitchell [Sat, 15 Jul 2017 21:26:04 +0000 (22:26 +0100)]
pp_grepwhile: no need to extend the stack

when returning from grep in scalar context, no need to extend the stack by
one when pushing the result count, since the last grep iteration will have
pushed its result which we've just popped.

3 years agochange sv_setsv(sv,NULL) to sv_set_undef(sv)
David Mitchell [Sat, 15 Jul 2017 21:12:41 +0000 (22:12 +0100)]
change sv_setsv(sv,NULL) to sv_set_undef(sv)

There are still a few core occurrences of

    sv_setsv(sv, NULL);

which is equivalent to

    sv_setsv(sv, &PL_sv_undef);

but which can now be done more efficiently with


3 years agopp_iter(): jump directly to op after OP_AND
David Mitchell [Sat, 15 Jul 2017 12:27:09 +0000 (13:27 +0100)]
pp_iter(): jump directly to op after OP_AND

AN OP_ITER's op_next field always points to an OP_AND node. Rather than
pushing &PL_sv_yes or &PL_sv_no and then passing control to the OP_AND,
make pp_iter() return the OP_AND's op_next or op_other directly, depending
on whether this is the last iteration or not.

For an empty body, this cuts about 20% off the time of an iteration.

It's possible that some weird optree-munging XS module may break this
assumption. For now I've just added asserts that the next op is OP_AND
with an op_ppaddr of Perl_pp_and; if that assertion fails, it may be
necessary to convert pp_iter()s' asserts into conditional statements.

In the longer term it might be worthwhile converting OP_ITER from a
BASEOP into a LOGOP and eliminate the OP_AND from the optree altogether.

Alternatively, perhaps pp_iter could just tail call Perl_op_leavesub
directly after the last iteration?

3 years agooptimise (index() == -1)
David Mitchell [Fri, 14 Jul 2017 16:29:43 +0000 (17:29 +0100)]
optimise (index() == -1)

Unusually, index() and rindex() return -1 on failure.

So it's reasonably common to see code like

    if (index(...) != -1) { ... }

and variants.

For such code, this commit optimises away to OP_EQ and OP_CONST,
and sets a couple of private flags on the index op instead, indicating:

    OPpTRUEBOOL        return a boolean which is a comparison of
                       what the return would have been, against -1

    OPpINDEX_BOOLNEG   negate the boolean result

Its also supports OPpTRUEBOOL in conjunction with the existing
OPpTARGET_MY flag, so for example in

    $lexical = (index(...) == -1)

the padmy, sassign, eq and const ops are all optimised away.

3 years agopp_readline,close,getc: explain NULL stack arg
David Mitchell [Fri, 14 Jul 2017 14:23:29 +0000 (15:23 +0100)]
pp_readline,close,getc: explain NULL stack arg

add code comments to explain why these functions can sometimes be called
with a NULL pointer on the stack.

(feature introduced by v5.15.2-112-g30901a8)

3 years agot/perf/optree.t: reformat a table
David Mitchell [Fri, 14 Jul 2017 13:56:03 +0000 (14:56 +0100)]
t/perf/optree.t: reformat a table

whitespace-only change, plus alphabetically sort the lines of ops being

3 years agoregen/opcodes: move 'method' entry next to others
David Mitchell [Fri, 14 Jul 2017 13:50:19 +0000 (14:50 +0100)]
regen/opcodes: move 'method' entry next to others

there's a block of method_foo ops, and method was apart from them.

No functional difference and part from auto-allocated op numbers.