This is a live mirror of the Perl 5 development currently hosted at
6 years agoreadd noreturn and silence "noreturn that returns" warning on MSVC
Daniel Dragan [Sun, 16 Nov 2014 02:00:16 +0000 (21:00 -0500)]
readd noreturn and silence "noreturn that returns" warning on MSVC

Based on commit 73758d77 (by me), in commit 117af67d629 more things got
noreturn removed on MSVC. See also ML post
"(Hugmeir) Re: [perl.git] branch blead, updated. v5.21.0-377-gdc3bf40"
This caused a measurable increase in machine code size in 117af67d629 .
In commit 73758d77 , the reason there was no increase is
Perl_magic_regdatum_set is called only through a magic vtable. Optimizing
this to noreturn is forbidden unless the struct member type specifies it
(and it obviously doesn't, since this is the magic vtable).

The other not-noreturn on MSVC function, Perl_screaminstr, has no core
usage (its only reference is in the export table) or CPAN grep usage so
therefore it is being removed. It was made fatal in commit 9e3f0d16db .

before .text section of perl521.dll on VC 2003 32b, 0xc66a3 bytes, after

6 years agoperldiag: Correct ‘Can't use %s for loop variable’
Father Chrysostomos [Sun, 16 Nov 2014 01:39:08 +0000 (17:39 -0800)]
perldiag: Correct ‘Can't use %s for loop variable’

It is no longer true that the variable can only be a simple scalar.
More to the point, this message should never be reached.  If you try
to use something prohibited as your loop variable, you get a syntax
error or ‘Missing $’.

6 years agoop.c: cmmoent typo
Father Chrysostomos [Sun, 16 Nov 2014 01:26:42 +0000 (17:26 -0800)]
op.c: cmmoent typo

6 years agoop.c: Correct comment added by c427f4d2d
Father Chrysostomos [Sun, 16 Nov 2014 01:09:18 +0000 (17:09 -0800)]
op.c: Correct comment added by c427f4d2d

6 years agoFix double free with unterminated /(?{ <<END })/
Father Chrysostomos [Sat, 15 Nov 2014 21:31:40 +0000 (13:31 -0800)]
Fix double free with unterminated /(?{ <<END })/

If we are parsing from a stream (file), and we are inside a quote-like
operator, and we find a here-doc marker that tries to extract the
here-doc body from the stream (this is the last line of the quote-like
operator, or it only has one line), and the the here-doc terminator
cannot be found, then we end up trying to free a scalar twice:

$ ./miniperl -e '"${ print <<END"'
Can't find string terminator "END" anywhere before EOF at -e line 1.
Attempt to free temp prematurely: SV 0x7fcafb82fd98, Perl interpreter: 0x7fcafb803200 at -e line 1.
Attempt to free unreferenced scalar: SV 0x7fcafb82fd98, Perl interpreter: 0x7fcafb803200 at -e line 1.

I caused that in v5.17.3-187-g3328ab5.

The current line of code in the parser is usually stored in
PL_parser->linestr (aka PL_linestr) and gets freed when the parser
itself is freed.

The heredoc parser, when extracting the body from a stream, tempor-
arily sets aside PL_linestr, replacing it with another SV.  If it
doesn’t find the terminator, it frees the PL_linestr value that has
been set aside, under the assumption that parser_free will take care
of freeing the new value.

Inside quote-like operators that does not work, because PL_linestr has
been localised and set to a new value, already prospectively freed via
SAVEFREESV, in sublex_push.  So we can’t free that value again.

6 years agoUpdate Test-Simple to alpha 074
Chad Granum [Sat, 15 Nov 2014 14:39:19 +0000 (06:39 -0800)]
Update Test-Simple to alpha 074

6 years agoDon’t always skip in-memory tests is t/base/rs.t
Father Chrysostomos [Sat, 15 Nov 2014 18:31:06 +0000 (10:31 -0800)]
Don’t always skip in-memory tests is t/base/rs.t

There is no PerlIO::via::scalar, as far as I can tell.  In-memory han-
dles just use PerlIO::scalar.

The code was added by cd1a9f552.  I’m not sure it was ever cor-
rect.  It was intended to skip tests under -Uuseperlio (see <>), but
skipped them on all builds.  I’m not sure that we even support
-Uuseperlio any more.

In the mean time, 1ab48e3a screwed up the test count.

6 years agot/base/rs.t: Suppress warning
Father Chrysostomos [Sat, 15 Nov 2014 18:19:47 +0000 (10:19 -0800)]
t/base/rs.t: Suppress warning

6 years agoPut PL_cop_seqmax++ code in one spot
Father Chrysostomos [Sat, 15 Nov 2014 18:09:24 +0000 (10:09 -0800)]
Put PL_cop_seqmax++ code in one spot

6 years ago[perl #115066] Fix wrongly nested ‘use’ deparsing
Father Chrysostomos [Sat, 15 Nov 2014 17:56:50 +0000 (09:56 -0800)]
[perl #115066] Fix wrongly nested ‘use’ deparsing

B::Deparse was incorrectly putting ‘use’ statements and BEGIN blocks
inside other ‘use’ statements containing do-blocks, even if they were
originally outside.

Subroutines (except for cloned closures, which we don’t have to worry
about here) have an OUTSIDE pointer, pointing to the outer sub con-
taining the declaration of the sub in question.  So we can check that
to make sure we are putting the sub declaration in the right place.

Not only does this fix the reported case, but it also will allow
sequence numbers in inner subs to be reused by statements in outer
subs, which I may need in a future commit.

6 years agoRevert the ‘return’ part of 6edcbed6
Father Chrysostomos [Sat, 15 Nov 2014 17:31:46 +0000 (09:31 -0800)]
Revert the ‘return’ part of 6edcbed6

The gotos were jumping over initializations, causing
C+++threads+debugging to fail.

6 years agot/ try code page 1252 locales
Karl Williamson [Sat, 15 Nov 2014 16:51:28 +0000 (09:51 -0700)]
t/ try code page 1252 locales

This makes sure this common locale on Windows doesn't get overlooked.

6 years agot/ Nits in comments, white-space only
Karl Williamson [Sat, 15 Nov 2014 16:50:51 +0000 (09:50 -0700)]
t/ Nits in comments, white-space only

6 years agoSilence spurious locale warnings
Karl Williamson [Sat, 15 Nov 2014 16:48:14 +0000 (09:48 -0700)]
Silence spurious locale warnings

When testing the locales on the system, we don't want to be warned that
particular ones may not work well with Perl, as the point of the test is
to find and list the incompatibilities.

When looking for locales suitable for some purpose, we try every one
possible until we find one that matches what we're looking for.  This
may entail briefly switching into locales that aren't fully compatible
with Perl.  Again we don't want to be warned about such a locale.  We're
not using it for anything except to determine suitability anyway.

6 years agoRemove unused exit handler in vms/vms.c.
Craig A. Berry [Sat, 15 Nov 2014 16:01:52 +0000 (10:01 -0600)]
Remove unused exit handler in vms/vms.c.

This code became obsolete in ff7adb5275976 and has just been
sitting there taking up space.

6 years agoSpell behaviour consistently in perlsub
Father Chrysostomos [Sat, 15 Nov 2014 14:41:17 +0000 (06:41 -0800)]
Spell behaviour consistently in perlsub

We had six instances without U, and two with it.

6 years agomake debugging easier in memory allocator code in perl.c and util.c
Daniel Dragan [Tue, 20 May 2014 07:23:01 +0000 (03:23 -0400)]
make debugging easier in memory allocator code in perl.c and util.c

-show intermediate values to make C debugging easier
-Perl_safesysfree overwrote var where with a different value, this caused
 alot of confusion for me of trying to hunt for a pointer from a stack
 trace with conditional breakpoints, so don't change var where in an
 unoptimized build
-in Perl_safesysrealloc and Perl_safesysmalloc provide 1 exit path, so
 the returned value is easily seen and BPed on unoptimized builds

6 years agoDeparse.t: To-do test for #115066
Father Chrysostomos [Sat, 15 Nov 2014 14:34:22 +0000 (06:34 -0800)]
Deparse.t: To-do test for #115066

6 years agoHelper function for 'close enough with epsilon'.
Jarkko Hietaniemi [Sat, 15 Nov 2014 12:59:50 +0000 (07:59 -0500)]
Helper function for 'close enough with epsilon'.

6 years agoThe skip count was all wrong.
Jarkko Hietaniemi [Sat, 15 Nov 2014 12:52:12 +0000 (07:52 -0500)]
The skip count was all wrong.

Though that shows that acosh must be quite widely supported.

6 years agoThe 0d71ffa7 was quite sloppy with the sub-skips.
Jarkko Hietaniemi [Sat, 15 Nov 2014 12:46:39 +0000 (07:46 -0500)]
The 0d71ffa7 was quite sloppy with the sub-skips.

6 years agoRemove vmsish pragma from one-liners in Test::Simple's exit.t.
Craig A. Berry [Sat, 15 Nov 2014 03:23:19 +0000 (21:23 -0600)]
Remove vmsish pragma from one-liners in Test::Simple's exit.t.

Awaiting upstream application at:

This was broken by a recent change that added double quotes around
the double quotes that were already there.

It also hasn't been working as intended for these tests for some
time as they manipulate the exit code directly in an END block,
and that sneaks by the effects of the pragma when run at compile

This works:

  $ perl  -e "require vmsish; import vmsish 'hushed'; END {$? = 1};"

This (which is what the tests are doing) doesn't work:

  $ perl -Mvmsish=hushed -e "END {$? = 1};"
  %SYSTEM-F-ABORT, abort

So we'll just live with the noise from the exit messages.  They
don't seem to cause any trouble for the core test suite.

6 years agoMake $/=-1 warning default like other dep warnings
Father Chrysostomos [Sat, 15 Nov 2014 02:16:18 +0000 (18:16 -0800)]
Make $/=-1 warning default like other dep warnings

6 years agoFold t/lib/warnings/irs into mg
Father Chrysostomos [Sat, 15 Nov 2014 02:13:17 +0000 (18:13 -0800)]
Fold t/lib/warnings/irs into mg

It took me a while to find these tests.  Most of these tests are arranged
by which C file they occur in.  (These warning tests were originally
added to make sure all warnings in all C files get tested.)

6 years agot/lib/warnings/mg: Remove comment
Father Chrysostomos [Sat, 15 Nov 2014 02:06:38 +0000 (18:06 -0800)]
t/lib/warnings/mg: Remove comment

The warning this refers to was removed (or moved to in
commit bbdae7b29367.

6 years agoThe miniperl skip in utf8cache.t was wrong.
Jarkko Hietaniemi [Sat, 15 Nov 2014 02:03:47 +0000 (21:03 -0500)]
The miniperl skip in utf8cache.t was wrong.

But also needed fixing to be able to skip correctly.

6 years agoquadmath: try finding if only available as gcc internal library.
Jarkko Hietaniemi [Sat, 15 Nov 2014 01:48:36 +0000 (20:48 -0500)]
quadmath: try finding if only available as gcc internal library.

6 years agoC99 math: lgamma and tgamma emulations.
Jarkko Hietaniemi [Mon, 10 Nov 2014 03:09:29 +0000 (22:09 -0500)]
C99 math: lgamma and tgamma emulations.

6 years agofdim NaN guard.
Jarkko Hietaniemi [Sat, 15 Nov 2014 00:42:21 +0000 (19:42 -0500)]
fdim NaN guard.

6 years agoThese are all emulated, so can be tested.
Jarkko Hietaniemi [Thu, 13 Nov 2014 23:59:38 +0000 (18:59 -0500)]
These are all emulated, so can be tested.

6 years agoEmulate signbit() if necessary.
Jarkko Hietaniemi [Thu, 13 Nov 2014 23:49:47 +0000 (18:49 -0500)]
Emulate signbit() if necessary.

6 years agofpclassify is emulated if necessary.
Jarkko Hietaniemi [Thu, 13 Nov 2014 12:10:01 +0000 (07:10 -0500)]
fpclassify is emulated if necessary.

6 years needs autodie needs Fatal needs Scalar::Util needs lib.
Jarkko Hietaniemi [Thu, 13 Nov 2014 11:42:31 +0000 (06:42 -0500)] needs autodie needs Fatal needs Scalar::Util needs lib.

6 years agoWe no more need to guard these with HAS_ACOSH.
Jarkko Hietaniemi [Thu, 13 Nov 2014 01:41:29 +0000 (20:41 -0500)]
We no more need to guard these with HAS_ACOSH.

6 years agoRemove Cygwin cases. Case.
Jarkko Hietaniemi [Thu, 13 Nov 2014 01:33:23 +0000 (20:33 -0500)]
Remove Cygwin cases.  Case.

6 years agoRemove unneeded Win32 cases.
Jarkko Hietaniemi [Thu, 13 Nov 2014 01:33:07 +0000 (20:33 -0500)]
Remove unneeded Win32 cases.

6 years agoundef c99_foo ifndef HAS_FOO
Jarkko Hietaniemi [Thu, 13 Nov 2014 01:32:06 +0000 (20:32 -0500)]
undef c99_foo ifndef HAS_FOO

6 years agocosh and log10 are already C89.
Jarkko Hietaniemi [Thu, 13 Nov 2014 01:18:23 +0000 (20:18 -0500)]
cosh and log10 are already C89.

6 years agoRemove now empty case.
Jarkko Hietaniemi [Thu, 13 Nov 2014 00:09:04 +0000 (19:09 -0500)]
Remove now empty case.

6 years agoTru64 more undef hints.
Jarkko Hietaniemi [Thu, 13 Nov 2014 12:01:57 +0000 (07:01 -0500)]
Tru64 more undef hints.

6 years agoRemove unneeded Tru64 cases.
Jarkko Hietaniemi [Thu, 13 Nov 2014 00:07:35 +0000 (19:07 -0500)]
Remove unneeded Tru64 cases.

6 years agoVMS should now be handled.
Jarkko Hietaniemi [Thu, 13 Nov 2014 00:05:50 +0000 (19:05 -0500)]
VMS should now be handled.

6 years agoWe now have symbols for llrint and llround.
Jarkko Hietaniemi [Thu, 13 Nov 2014 00:04:47 +0000 (19:04 -0500)]
We now have symbols for llrint and llround.

6 years agoAndroid should be doing the Configure scans.
Jarkko Hietaniemi [Thu, 13 Nov 2014 00:03:25 +0000 (19:03 -0500)]
Android should be doing the Configure scans.

6 years agoRemove trivial unneeded cases of not having C99 math.
Jarkko Hietaniemi [Wed, 12 Nov 2014 23:49:14 +0000 (18:49 -0500)]
Remove trivial unneeded cases of not having C99 math.

6 years agoOnly #ifndef gcc cases remain.
Jarkko Hietaniemi [Wed, 12 Nov 2014 23:47:41 +0000 (18:47 -0500)]
Only #ifndef gcc cases remain.

6 years agoRemove unneeded HP-UX cases.
Jarkko Hietaniemi [Wed, 12 Nov 2014 23:47:01 +0000 (18:47 -0500)]
Remove unneeded HP-UX cases.

6 years agoquadmath has tgammaq, not tgammal.
Jarkko Hietaniemi [Wed, 12 Nov 2014 23:35:04 +0000 (18:35 -0500)]
quadmath has tgammaq, not tgammal.

6 years agoMake the C99 *l test a little bit more accepting.
Jarkko Hietaniemi [Wed, 12 Nov 2014 12:00:56 +0000 (07:00 -0500)]
Make the C99 *l test a little bit more accepting.

6 years agoThe NO_C99_LONG_DOUBLE_MATH is no more used.
Jarkko Hietaniemi [Wed, 12 Nov 2014 11:56:15 +0000 (06:56 -0500)]
The NO_C99_LONG_DOUBLE_MATH is no more used.

6 years agoAIX: Configure now detect this, leave the comment.
Jarkko Hietaniemi [Wed, 12 Nov 2014 11:54:47 +0000 (06:54 -0500)]
AIX: Configure now detect this, leave the comment.

(Some AIX do not have long double math interfaces.)

6 years agoVMS C99 math symbols
Jarkko Hietaniemi [Thu, 13 Nov 2014 01:04:41 +0000 (20:04 -0500)]
VMS C99 math symbols

6 years --regen --default=undef; make regen
Jarkko Hietaniemi [Thu, 13 Nov 2014 00:21:31 +0000 (19:21 -0500)] --regen --default=undef; make regen

6 years agoAdd Configure symbols to all the missing C99 math APIs.
Jarkko Hietaniemi [Tue, 11 Nov 2014 02:12:33 +0000 (21:12 -0500)]
Add Configure symbols to all the missing C99 math APIs.

Almost all - e.g. isless() will stand in for the other isfoo()
order comparison macros.

Also not going for all the *l() versions of each interface.

6 years agoSort perldiag
Father Chrysostomos [Fri, 14 Nov 2014 20:52:27 +0000 (12:52 -0800)]
Sort perldiag

6 years Document COP_SEQ_RANGE_*
Father Chrysostomos [Fri, 14 Nov 2014 04:26:21 +0000 (20:26 -0800)] Document COP_SEQ_RANGE_*

6 years agolib/locale.t: Display debug information under harness
Karl Williamson [Fri, 14 Nov 2014 02:59:43 +0000 (19:59 -0700)]
lib/locale.t: Display debug information under harness

This just changes any debugging (which is by default off) goes to

6 years agoReinstate "Raise warnings for poorly supported locales"
Karl Williamson [Wed, 12 Nov 2014 17:32:47 +0000 (10:32 -0700)]
Reinstate "Raise warnings for poorly supported locales"

This reverts commit 1244bd171b8d1fd4b6179e537f7b95c38bd8f099,
thus reinstating commit 3d3a881c1b0eb9c855d257a2eea1f72666e30fbc.

6 years agohandy.h: Add missing parentheses to macro #define
Karl Williamson [Fri, 14 Nov 2014 02:48:14 +0000 (19:48 -0700)]
handy.h: Add missing parentheses to macro #define

These being missing caused 3d3a881c1b0eb9c855d257a2eea1f72666e30fbc
to have to be reverted.  It only shows up on platforms that don't have
an isblank() libc function.

6 years agoperlfunc: Fix typo
Karl Williamson [Thu, 6 Nov 2014 05:44:17 +0000 (22:44 -0700)]
perlfunc: Fix typo

6 years agoAdd warning message for locale/Unicode intermixing
Karl Williamson [Thu, 6 Nov 2014 05:43:18 +0000 (22:43 -0700)]
Add warning message for locale/Unicode intermixing

This is explained in the added perldiag entry.

6 years agotie.t: Don’t skip test unconditionally
Father Chrysostomos [Fri, 14 Nov 2014 04:08:11 +0000 (20:08 -0800)]
tie.t: Don’t skip test unconditionally

but only if we are under miniperl and base has not been built yet.

I made a mistake in 19295df3 by omitting the ?.  Thanks to Karl
Williamson for noticing it.

6 years agoStop crypt($tied,...) from calling FETCH twice
Father Chrysostomos [Fri, 14 Nov 2014 02:13:01 +0000 (18:13 -0800)]
Stop crypt($tied,...) from calling FETCH twice

It was doing so if FETCH returned a UTF8 string the first time.  It
then turned on the UTF8 flag on the result of the second FETCH, even
if it wasn’t UTF8:

$ ./miniperl -e 'sub TIESCALAR{bless[substr(chr 256,0,0), chr 255]} sub FETCH{shift @{$_[0]}}tie $t, ""; crypt $t, ""'
Wide character in crypt at -e line 1.

(There are no wide characters fed to crypt() there.)

6 years agoTurn off UTF8 flag on crypt ret val
Father Chrysostomos [Fri, 14 Nov 2014 02:00:46 +0000 (18:00 -0800)]
Turn off UTF8 flag on crypt ret val

crypt was not turning off the UTF8 flag on its return value.  On some
systems, such as VMS, it returns a string of random bytes, not neces-
sarily ASCII.  If the UTF8 flag is already turned on on its target
(the SV used to return the value), then the return value is scrambled.

Normally crypt’s target is its own, and never gets the UTF8 flag
turned on.  However, $lexical = crypt(...) gets optimised, such that
$lexical becomes the target of crypt, and crypt writes to it directly.
So it very well may have the UTF8 flag on already.

There are already tests in lex_assign.t that fail
on VMS because of this (see the thread that includes
<CA+vYcVyvq=j-vdWcODSfCjzM9-cYFYfY4hE-B1aWRRP4-=3KNA@mail.gom>), but
those tests are fragile, and this should be tested more explicitly.

6 years agoRevert "t/TEST: add -w to shebang, fix a used-once warning"
Father Chrysostomos [Fri, 14 Nov 2014 00:08:49 +0000 (16:08 -0800)]
Revert "t/TEST: add -w to shebang, fix a used-once warning"

This reverts commit da6e3e61d3d3194e7f769b7ddf7e6d16904c24d3.

This causes problems for deparse mode, which emits pages of warnings.
If we are going to add -w, we ought first to fix deparse testing to
work with it.

6 years ago‘%s found where op expected’ under fatal warnings
Father Chrysostomos [Thu, 13 Nov 2014 13:34:15 +0000 (05:34 -0800)]
‘%s found where op expected’ under fatal warnings

This is related to ticket #123195.

This code:

use warnings FATAL => 'all';
use strict;
myfunc 1,2,3

was giving this:

Global symbol "$foo" requires explicit package name (did you forget to declare "my $foo"?) at - line 3.
(Do you need to predeclare myfunc?)
syntax error at - line 4, near "myfunc 1"
Execution of - aborted due to compilation errors.

How can we have ‘Do you need to predeclare myfunc?’ without any prior
mention of myfunc in the diagnostics?  Fatal warnings were modified in
594b6fac to queue compile-time warning and emit them as part of the
error message.  But the logic was not quite right for yywarn, which is
used for ‘foo found where operator expected’.  The warning was just
disappearing outside of an eval.  qerror was treating PL_in_eval as
a boolean, so we need to clear the flag we have just set, before
we call it.

6 years agoperldelta for 890b5089ee
Steve Hay [Thu, 13 Nov 2014 13:14:42 +0000 (13:14 +0000)]
perldelta for 890b5089ee

6 years agoAlphabetise perldiag
Father Chrysostomos [Thu, 13 Nov 2014 12:46:30 +0000 (04:46 -0800)]
Alphabetise perldiag

6 years ago[Merge] Constant inlining clean-up
Father Chrysostomos [Thu, 13 Nov 2014 12:52:55 +0000 (04:52 -0800)]
[Merge] Constant inlining clean-up

This branch makes perl more consistent in how it turns sub(){...} into
a constant.

Previously, it did not behave as documented, or at least not all the
time.  And whether an anonymous sub was clonable made a difference to
the behaviour.  Clonable subs are usually closures, but they could
also be anonymous subs containing state declarations or string evals,
or any anonymous subs under the debugger.  ‘Closures’ below includes
any clonable subs.

• Explicit return never makes a constant (as promised in the docs).
• Statements optimised away are ignored (not just with closures).
• Lvalue and custom attributes now prevent constants with closures,
  as they have already done for non-closures.
• Method attributes no longer prevent constants with non-closures.
• Closing over a variable potentially modified elsewhere will con-
  tinue to make a constant as before, but is detected and deprecated.
• More complex cases than sub(){$x}, such as sub(){foo() if 0; $x}
  just follow the new behaviour, which is not to make a constant if
  $x is modifiable elsewhere.

And a few other bug fixes.

6 years agoDocument sub inlining changes
Father Chrysostomos [Thu, 13 Nov 2014 06:29:27 +0000 (22:29 -0800)]
Document sub inlining changes

Most of the changes do not need to be documented, because the previous
behaviour did not match the documentation or was just plain buggy.

6 years agopad.c:cv_clone_pad: Avoid copying sv
Father Chrysostomos [Tue, 4 Nov 2014 21:25:49 +0000 (13:25 -0800)]
pad.c:cv_clone_pad: Avoid copying sv

When we capture the lexical variable in order to make sub () {$x}
constant, we don’t have to copy it if it is not modified or referenced

6 years agoAccount for state vars when const-izing sub(){$x}
Father Chrysostomos [Tue, 4 Nov 2014 06:28:08 +0000 (22:28 -0800)]
Account for state vars when const-izing sub(){$x}

If the only lvalue use of a lexical ‘my’ variable is its declaration,
then it is fine to turn a sub that closes over it into a constant.

But with state variables we have to be a little more careful.

This is fine:

    state $x = something();
    sub () { $x }

because the variable is only assigned to once.  But this modifies the
same variable every time the enclosing sub is called:

    state $x++;
    sub () { $x }

So that closure must remain a closure, and not become a constant.

(However, for a simple lexical scalar in the sub like that, we still
make it a constant, but deprecate the usage.)

6 years agoAccount for string eval when const-izing sub(){$x}
Father Chrysostomos [Tue, 4 Nov 2014 06:18:11 +0000 (22:18 -0800)]
Account for string eval when const-izing sub(){$x}

If we have a string eval in the same scope as the variable, it is
potentially in value context.

6 years agoMake op.c:op_const_sv static
Father Chrysostomos [Tue, 4 Nov 2014 01:56:11 +0000 (17:56 -0800)]
Make op.c:op_const_sv static

It is no longer called from any other file.

6 years agoInline op_const_sv into cv_clone
Father Chrysostomos [Tue, 4 Nov 2014 01:53:01 +0000 (17:53 -0800)]
Inline op_const_sv into cv_clone

op_const_sv is actually two functions in one.  This particular calling
convention (CvCONST) was used only by cv_clone.

Half the code was not even necessary for cv_clone’s use (the other
half only for its use), so this reduces the total number of lines.

6 years agoMake sub () { 0; 3 } inlinable once more
Father Chrysostomos [Mon, 3 Nov 2014 06:24:32 +0000 (22:24 -0800)]
Make sub () { 0; 3 } inlinable once more

It probably stopped being inlinable in commit beab0874143b.

Following op_next pointers to see whether a sub’s execution chain con-
sists of a constant followed by sub exit does not make sense if the
op_next pointers have not been set up yet.

So call LINKLIST earlier, so that we can merge the two calls to
op_const_sv in newATTRSUB (no need to search for constants twice).
That will allow sub () { 0; 3 } to be inlined once more, as it was in
perl 5.005 (I checked) and probably in 5.6, too (I didn’t check).

This also allows us to remove initial the OP_LINESEQ check, which
was added to help this function into the block when we have no
op_next pointers.

op_const_sv is now called only before the peephole optimiser and
finalize_op, which removes the need for the special explicit return
check (it hasn’t been optimised out of the execution chain yet) and
the need to account for constants that have been relocated to the pad
by finalize_op.

6 years agoAllow sub():method{CONSTANT} to be inlined
Father Chrysostomos [Mon, 3 Nov 2014 05:54:22 +0000 (21:54 -0800)]
Allow sub():method{CONSTANT} to be inlined

This brings non-closure subs into conformity with closures.

6 years agoFirst arg to op_const_sv is never null
Father Chrysostomos [Mon, 3 Nov 2014 05:34:23 +0000 (21:34 -0800)]
First arg to op_const_sv is never null

6 years agoRemove SvREADONLY_on from op.c:op_const_sv
Father Chrysostomos [Mon, 3 Nov 2014 00:50:40 +0000 (16:50 -0800)]
Remove SvREADONLY_on from op.c:op_const_sv

If we turn on the padtmp flag, then this this SV will never be seen in
lvalue context, so whether it is read-only is irrelevant.  Don’t even
bother making it so.

6 years agoop.c:Start the search for const vars at CvSTART
Father Chrysostomos [Mon, 3 Nov 2014 00:46:57 +0000 (16:46 -0800)]
op.c:Start the search for const vars at CvSTART

When we search an op tree to see whether it could become a constant
closure, we search the op execution chain, but we don’t necessarily
start at the beginning.  We start at the outermost op of the first
statement’s contents.  That means that for sub {$a+$b} we begin the
search at the + (add), even though the full execution chain is next-
state, gvsv, gvsv, add, leavesub.

It was this oddity that led to bug #63540.  Originally (before
beab0874143b), the search through the op chain started at CvSTART
(the start of the execution chain), but was accidentally changed
in beab0874143b.  (That was also when sub(){return 2} stopped
being inlined.)

Changing this back to the way it used to be allows use to remove the
check to see whether a null op has kids, which was added to handle op
trees like

 b leavesub
 -   lineseq
 1     nextstate
 -     null ->9
 3       and
 2         padsv
 8         leave
 4           enter
 5           nextstate
 7           die
 6             pushmark
 9     nextstate
 a     const

which is the result of sub { if($x){ die }; 0 }.

If we begin the search at the null op, and if nulls are skipped, we
end up missing the entire ‘if’ block and seeing just null, nextstate,
const, leavesub, which looks constant.

6 years agoHandle multiple closures in sub(){$x} const-izing
Father Chrysostomos [Mon, 3 Nov 2014 00:31:27 +0000 (16:31 -0800)]
Handle multiple closures in sub(){$x} const-izing

Till now, we were checking the reference count of the variable that we
have just closed over, to see whether the newly-cloned sub can become
a constant.  A reference count of 2 would indicate that only the outer
pad and the pad of the newly-cloned sub held references.

Recent commits also checked whether the variable is used in lvalue
context in the outer sub in places other than its declaration.

This is insufficient to detect cases like:

    my $x = 43;
    my $const_closure = sub () { $x };
    my $other_closure = sub {$x++};

Although it does work if the $other_closure comes first (because it
holds a refcount by the time the $const_closure is created).

Extending the check for lvalue uses to inner subs as well (the changes
this commit makes to op_lvalue_flags) fixes that issue.  It does not
allows cases like

    my $x = 43;
    my $other_closure = sub { $x };
    my $const_closure = sub () { $x };

to create a constant, because the reference count check still prevents
it.  I tried removing the reference count check, but it fails for
cases like \(my $x = 1), which allows $x to be referenced elsewhere,
even though the only lvalue use of it is its declaration.

As with the commits leading up to this, we allow a simple sub(){$x} to
create constants erroneously where it would have done so before, but
with a deprecation warning.

The deprecation warning had to be moved, because it could trigger even
in those cases where the refcount check fails and we don’t create a
constant, which is just wrong.

This commit does not account for string eval within the scope of
the variable.

6 years agoconst-optree.t: Correct comment
Father Chrysostomos [Sun, 2 Nov 2014 14:20:09 +0000 (06:20 -0800)]
const-optree.t: Correct comment

6 years agoDon’t inline sub(){ 0; return $x }
Father Chrysostomos [Sun, 2 Nov 2014 14:02:18 +0000 (06:02 -0800)]
Don’t inline sub(){ 0; return $x }

If return occurs at the end of a sub, it is optimised out of the
execution, chain, so we have to look at the op tree structure to
detect it.

6 years agoDon’t inline sub(){ 0; return $x; ... }
Father Chrysostomos [Sun, 2 Nov 2014 05:17:39 +0000 (22:17 -0700)]
Don’t inline sub(){ 0; return $x; ... }

We document that explicit return prevents subs from being inlined.
But if that explicit return comes after a statement optimised away,
then it does not prevent inlining.

Originally, explicit return did not prevent inlining, and the way
constant subs were detected was to search through the op chain in
execution order, looking for padsv followed by return or leavesub.
Later, things were accidentally changed, such that the search began,
not at the beginning of the execution chain, but at the outer-
most op of the first statement’s contents.  That means that, with
sub () { $a + $b }, we begin the search at the + (add), even though
the execution order is nextstate, gvsv, gvsv, add, leavesub.  So for
sub () { return $x } we begin the search at return, and miss the padsv
that precedes it.

Even though it was accidental that ‘return’ inlining was broken, it
ended up becoming a documented feature, and has been so for over a
decade.  So I am just making things consistent with that.

This commit only affects those cases where the return is not at the
end of the sub.  At the end of the sub, the return is optimised out of
the execution chain, so it requires a little more work, which the next
commit will do.

6 years agoconst-optree.t: More tests
Father Chrysostomos [Sun, 2 Nov 2014 05:01:54 +0000 (22:01 -0700)]
const-optree.t: More tests

Test explicit return with variable (single statement) and simple scalar
not modified elsewhere.

6 years agoDon’t inline sub(){my $x; state sub z {$x} $outer}
Father Chrysostomos [Sun, 2 Nov 2014 04:52:08 +0000 (21:52 -0700)]
Don’t inline sub(){my $x; state sub z {$x} $outer}

The code that determines whether a closure prototype is potentially eligi-
ble for inlining when cloned iterates through the op chain in the order it
is executed.  It looks for padsv (or const) followed by sub exit.  Cer-
tain ops with no side effects, like nextstate and null, are skipped over.
There is a flaw in the logic handling padsv ops.  If the padsv op closes
over a variable from outside, we record that we have seen an SV, so
another padsv or const prevents inlining.  If the first padsv op does
not close over a variable from outside, but belongs to this sub itself,
then we just ignore it and skip over it as we would a null op.  So that
means sub () { my $x; $outer_var } is marked as potentially eligible
for inlining.

Now, when cloning happens (i.e., when the ‘sub’ expression is evaluated),
we search through the op chain (once more) of subs marked as potentially
inlinable and find the first padsv op, which we assume is the one that
closes over the outer sub.  So we get the value of the wrong variable.

Now, there is a reference count check that usually saves the day.  The
reference count must be exactly 2, one reference held by the newly-cloned
closure and the other by the outer sub.  Usually ‘my $x’ will have a ref-
erence count of 1 when the sub is cloned, so it does not become inlina-
ble, but behaves as expected.

With state subs, however, which are cloned when the enclosing sub is
cloned, we can make that inner lexical have a reference count of 2.
So the sub becomes inlinable, using the undefined value taken from the
wrong variable:

$ ./perl -Ilib -MO=Concise -Mfeature=:all -e 'BEGIN { my $x = 43; *foo = sub :prototype(){my $y; state sub z { $y } $x}} print foo()'
The lexical_subs feature is experimental at -e line 1.
6  <@> leave[1 ref] vKP/REFC ->(end)
1     <0> enter ->2
2     <;> nextstate(main 53 -e:1) v:%,{,469764096 ->3
5     <@> print vK ->6
3        <0> pushmark s ->4
4        <$> const[NULL ] s*/FOLD ->5
-e syntax OK

Notice the const[NULL ], which indicates undef.

At least that’s what we get if we are lucky enough not to crash in the
padname-handling code added recently to op.c:op_const_sv.  Sometimes
this results:

$ ./perl -Ilib -MO=Concise -Mfeature=:all -e 'BEGIN { my $x = 43; *foo = sub :prototype(){my $y; state sub z { $y } $x}} print foo()'
The lexical_subs feature is experimental at -e line 1.
Segmentation fault: 11

6 years agoDon’t inline sub(){0; $x} if $x changes elsewhere
Father Chrysostomos [Sun, 2 Nov 2014 02:08:46 +0000 (19:08 -0700)]
Don’t inline sub(){0; $x} if $x changes elsewhere

Some op trees will turn a sub into a constant even if they
are more than just a simple constant or lexical variable.  In
particular, a statement optimised away followed by a lexi-
cal variable is eligible for inlining.  As discussed in
<>, make these
more complex op trees follow closure rules properly.  If the outer
lexical is used in lvalue context in places other than its declara-
tion, then we should forego inlining.

6 years agoRestructure const-optree.t
Father Chrysostomos [Sun, 2 Nov 2014 01:45:37 +0000 (18:45 -0700)]
Restructure const-optree.t

This new layout (it is completely rewritten) allows endless variations
to be tested more easily.

6 years agoUse ‘behavior’ consistently in perldiag
Father Chrysostomos [Sat, 1 Nov 2014 23:41:23 +0000 (16:41 -0700)]
Use ‘behavior’ consistently in perldiag

‘Behavior’ is used many times; ‘behaviour’ only three.

6 years agoDeprecate inlining sub(){$x} if $x is changed elsewhere
Father Chrysostomos [Sat, 1 Nov 2014 14:07:36 +0000 (07:07 -0700)]
Deprecate inlining sub(){$x} if $x is changed elsewhere

With the new PadnameLVALUE flag, we can detect cases where an outer
lexical is used multiple times in lvalue context.  If the subroutine
contains just a lexical variable and nothing else, deprecate this
behaviour, so we can change it not to break the closure pattern at
some future date.

Future commits will fix those cases where the subroutine contains more
than just a lexical variable, without a deprecation cycle.

Adding this code to op_const_sv doesn’t really make sense.  More to
the point, having S_cv_clone_pad call op_const_sv doesn’t make sense,
but changing that (moving this code directly to S_cv_clone_pad) will
require other refactorings to avoid breaking some cases of constant
(real constant)  inlining, such as sub(){$x++ if 0; 3}, which cur-
rently gets inlined.

6 years agoPut sub(){ ... } constant tests in a new file
Father Chrysostomos [Sat, 1 Nov 2014 21:33:35 +0000 (14:33 -0700)]
Put sub(){ ... } constant tests in a new file

6 years agopad.c: Move constant closure code
Father Chrysostomos [Sat, 1 Nov 2014 05:08:52 +0000 (22:08 -0700)]
pad.c: Move constant closure code

S_cv_clone normally calls S_cv_clone_pad, which takes care of cloning
the pad, surprisingly enough.  Then S_cv_clone checks whether it can
turn a closure into a constant.  That code needs to be moved into
S_cv_clone_pad, because, not only is it pad-related, but to work cor-
rectly it needs to access the outer sub (which S_cv_clone_pad already
fetches for its own use), which future commits will make it do.

6 years agopad.c: Have S_cv_clone_pad return the CV
Father Chrysostomos [Sat, 1 Nov 2014 05:04:21 +0000 (22:04 -0700)]
pad.c: Have S_cv_clone_pad return the CV

Currently it is a void function, because it modifies the CV in place.
Shortly it will sometimes return a different CV from the one it was

6 years agopad.c:S_cv_clone: Add assertion
Father Chrysostomos [Sat, 1 Nov 2014 04:59:39 +0000 (21:59 -0700)]
pad.c:S_cv_clone: Add assertion

This code cannot handle the case where cloning uses an existing
stub, because it creates a new CV via newCONSTSUB.  Cloning into
an existing stub only happens for lexical subs, and the previous
commit prevented them from reaching this code.  Before that we
would have had assertion failures in pp_padcv.

6 years agoDon’t attempt to inline my sub (){$outer_var}
Father Chrysostomos [Sat, 1 Nov 2014 04:57:28 +0000 (21:57 -0700)]
Don’t attempt to inline my sub (){$outer_var}

$ perl5.18.2 -Ilib  -Mfeature=lexical_subs -e ' my $x; my sub a(){$x}; print a'
The lexical_subs feature is experimental at -e line 1.
Segmentation fault: 11

Same in blead.

When calls to the sub are compiled (the ‘a’ in ‘print a’) the value
of the lexical variable cannot possibly known, because the sub hasn’t
been cloned yet, and all we have is the closure prototype.

A potentially constant closure prototype is marked CvCONST and
cv_const_sv_or_av (called by the code in toke.c that handles bare-
words) thinks that CvCONST means we have a constant XSUB.  Only lexi-
cal subs allow a closure prototype to reach that function.

We shouldn’t mark the closure prototype as CvCONST to begin with.
Because when we do, the ‘constant’ is retrieved from CvXUBANY, which
is a union shared by CvSTART.  Then toke.c does SvREFCNT_inc on
CvSTART, and screws up the op tree.

6 years agoop.c: Record lvalue use of lexicals
Father Chrysostomos [Fri, 31 Oct 2014 22:54:39 +0000 (15:54 -0700)]
op.c: Record lvalue use of lexicals

other than where the variable is declared.

This will be used to determine whether my $x; sub(){$x} can make a
constant.  Currently, this becomes a constant even if $x is subse-
quently modified, breaking the closure behaviour (bug #79908).

6 years agoAdd new LVALUE flag for pad names
Father Chrysostomos [Fri, 31 Oct 2014 21:54:20 +0000 (14:54 -0700)]
Add new LVALUE flag for pad names

This will be used to record whether a pad entry is used as an lvalue
multiple times.  If so, it cannot be used as a constant.

6 years agoUpdate comments about sub(){$x} consting
Father Chrysostomos [Thu, 30 Oct 2014 15:56:44 +0000 (08:56 -0700)]
Update comments about sub(){$x} consting

It no longer has anything to do with

6 years agoDon’t turn sub:CustomAttr(){$outer_lex} into a const
Father Chrysostomos [Thu, 30 Oct 2014 15:52:56 +0000 (08:52 -0700)]
Don’t turn sub:CustomAttr(){$outer_lex} into a const

We can’t know what the attributes are for, and turning it into a con-
stant discards the attributes.

6 years agoPreserve :method in sub:method(){$outer_lex}
Father Chrysostomos [Thu, 30 Oct 2014 15:46:00 +0000 (08:46 -0700)]
Preserve :method in sub:method(){$outer_lex}

When we turn such a sub into a constant, we need to preserve the
attribute, since it changes behaviour.