This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perldelta for perluniprops change
[perl5.git] / pod / perldelta.pod
index a9e0134..22cad11 100644 (file)
@@ -5,15 +5,15 @@
 [ this is a template for a new perldelta file.  Any text flagged as XXX needs
 to be processed before release. ]
 
-perldelta - what is new for perl v5.27.1
+perldelta - what is new for perl v5.27.6
 
 =head1 DESCRIPTION
 
-This document describes differences between the 5.27.0 release and the 5.27.1
+This document describes differences between the 5.27.5 release and the 5.27.6
 release.
 
-If you are upgrading from an earlier release such as 5.26.0, first read
-L<perl5270delta>, which describes differences between 5.26.0 and 5.27.0.
+If you are upgrading from an earlier release such as 5.27.4, first read
+L<perl5275delta>, which describes differences between 5.27.4 and 5.27.5.
 
 =head1 Notice
 
@@ -27,11 +27,23 @@ here, but most should go in the L</Performance Enhancements> section.
 
 [ List each enhancement as a =head2 entry ]
 
-=head2 L<C<delete>|perlfunc/delete EXPR> on key/value slices
+=head2 Initialisation of aggregate state variables
 
-L<C<delete>|perlfunc/delete EXPR> can now be used on key/value slices,
-returning the keys along with the deleted values.
-L<[perl #131328]|https://rt.perl.org/Ticket/Display.html?id=131328>
+A persistent lexical array or hash variable can now be initialized,
+by an expression such as C<state @a = qw(x y z)>.  Initialization of a
+list of persistent lexical variables is still not possible.
+
+=head2 Full-size inode numbers
+
+On platforms where inode numbers are of a type larger than perl's native
+integer numerical types, L<stat|perlfunc/stat> will preserve the full
+content of large inode numbers by returning them in the form of strings of
+decimal digits.  Exact comparison of inode numbers can thus be achieved by
+comparing with C<eq> rather than C<==>.  Comparison with C<==>, and other
+numerical operations (which are usually meaningless on inode numbers),
+work as well as they did before, which is to say they fall back to
+floating point, and ultimately operate on a fairly useless rounded inode
+number if the real inode number is too big for the floating point format.
 
 =head1 Security
 
@@ -39,35 +51,7 @@ XXX Any security-related notices go here.  In particular, any security
 vulnerabilities closed should be noted here rather than in the
 L</Selected Bug Fixes> section.
 
-=head2 Default Hash Function Change
-
-Perl 5.27.0 retires various older hash functions which are not viewed as
-sufficiently secure for use in Perl. We now support four general purpose
-hash functions, Siphash (2-4 and 1-3 variants), and  Zaphod32, and StadtX
-hash. In addition we support SBOX32 (a form of tabular hashing) for hashing
-short  strings, in conjunction with any of the other hash functions provided.
-
-By default Perl is configured to support SBOX hashing of strings up to 24
-characters, in conjunction with StadtX hashing on 64 bit builds, and
-Zaphod32 hashing for 32 bit builds.
-
-You may control these settings with the following options to Configure:
-
-    -DPERL_HASH_FUNC_SIPHASH
-    -DPERL_HASH_FUNC_SIPHASH13
-    -DPERL_HASH_FUNC_STADTX
-    -DPERL_HASH_FUNC_ZAPHOD32
-
-To disable SBOX hashing you can use
-
-    -DPERL_HASH_USE_SBOX32_ALSO=0
-
-And to set the maximum length to use SBOX32 hashing on with:
-
-    -DSBOX32_MAX_LEN=16
-
-The maximum length allowed is 256. There probably isn't much point
-in setting it higher than the default.
+[ List each security issue as a =head2 entry ]
 
 =head1 Incompatible Changes
 
@@ -79,95 +63,56 @@ XXX For a release on a stable branch, this section aspires to be:
 
 [ List each incompatible change as a =head2 entry ]
 
-=head2 Comma-less variable lists in formats are no longer allowed
-
-Omitting the commas between variables passed to formats is no longer
-allowed.  This has been deprecated since Perl 5.000.
-
-=head2 The C<:locked> and C<:unique> attributes have been removed
-
-These have been no-ops and deprecated since Perl 5.12 and 5.10,
-respectively.
-
-=head2 C<\N{}> with nothing between the braces is now illegal.
-
-This has been deprecated since Perl 5.24.
+=head2 Yada-yada is now strictly a statement
 
-=head2 Opening the same symbol as both a file and directory handle is no longer allowed
+By the time of its initial stable release in Perl 5.12, the C<...>
+(yada-yada) operator was explicitly intended to serve as a statement,
+not an expression.  However, the original implementation was confused
+on this point, leading to inconsistent parsing.  The operator was
+accidentally accepted in a few situations where it did not serve as a
+complete statement, such as
 
-Using open() and opendir() to associate both a filehandle and a dirhandle
-to the same symbol (glob or scalar) has been deprecated since Perl 5.10.
+    ... . "foo";
+    ... if $a < $b;
 
-=head2 Use of bare C<< << >> to mean C<< <<"" >> is no longer allowed
+The parsing has now been made consistent, permitting yada-yada only as
+a statement.  Affected code can use C<do{...}> to put a yada-yada into
+an arbitrary expression context.
 
-Use of a bare terminator has been deprecated since Perl 5.000.
+=head2 Subroutines no longer need typeglobs
 
-=head2 Setting $/ to a reference to a non-positive integer no longer allowed
+Perl 5.22.0 introduced an optimization allowing subroutines to be stored in
+packages as simple sub refs, not requiring a full typeglob (thus
+potentially saving large amounts of memeory).  However, the optimization
+was flawed: it only applied to the main package.
 
-This used to work like setting it to C<undef>, but has been deprecated
-since Perl 5.20.
+This optimization has now been extended to all packages.  This may break
+compatibility with introspection code that looks inside stashes and expects
+everything in them to be a typeglob.
 
-=head2 Unicode code points with values exceeding C<IV_MAX> are now fatal.
+When this optimization happens, the typeglob still notionally exists, so
+accessing it will cause the stash entry to be upgraded to a typeglob.  The
+optimization does not apply to XSUBs or exported subroutines, and calling a
+method will undo it, since method calls cache things in typeglobs.
 
-This was deprecated since Perl 5.24.
+[perl #129916] [perl #132252]
 
-=head2 C<B::OP::terse> no longer exists.
+=head2 Sort algorithm can no longer be specified
 
-Use C<B::Concise::b_terse> instead.
-
-=head2 Use of inherited AUTOLOAD for non-methods is no longer allowed.
-
-This was deprecated in Perl 5.004.
-
-=head2 Use of strings with code points over 0xFF is not allowed for
-bitwise string operators
-
-Code points over 0xFF do not make sense for bitwise operators.
-
-=head2 Setting C<${^ENCODING}> to a defined value is now illegal
-
-This has been deprecated since Perl 5.22 and a no-op since Perl 5.26.
-
-=head2 Backslash no longer escapes colon in PATH for the -S switch
-
-Previously the C<-S> switch incorrectly treated backslash ("\") as an
-escape for colon when traversing the C<PATH> environment variable.
-[perl #129183]
-
-=head2 the -DH (DEBUG_H) misfeature has been removed
-
-On a perl built with debugging support, the C<H> flag to the C<-D>
-debugging option has been removed. This was supposed to dump hash values,
-but has been broken for many years.
+Since Perl 5.8, the L<sort> pragma has had subpragmata C<_mergesort>,
+C<_quicksort>, and C<_qsort> that can be used to specify which algorithm
+perl should use to implement the L<sort|perlfunc/sort> builtin.
+This was always considered a dubious feature that might not last,
+hence the underscore spellings, and they were documented as not being
+portable beyond Perl 5.8.  These subpragmata have now been deleted,
+and any attempt to use them is an error.  The L<sort> pragma otherwise
+remains, and the algorithm-neutral C<stable> subpragma can be used to
+control sorting behaviour.
 
 =head1 Deprecations
 
 XXX Any deprecated features, syntax, modules etc. should be listed here.
 
-=head2 Use of L<C<vec>|perlfunc/vec EXPR,OFFSET,BITS> on strings with code
-points above 0xFF is deprecated.
-
-Use of these is nonsensical, as C<vec> is a bit-oriented operation,
-which operates on the underlying UTF-8 representation these strings must
-be in, and will likely give unexpected results.
-
-=head2 Some uses of unescaped C<"{"> are no longer fatal
-
-Perl 5.26.0 fatalized some uses of an unescaped left brace, but an
-exception was made at the last minute, specifically crafted to be a
-minimal change to allow GNU Autoconf to work.  This code is heavily
-depended upon, and continues to use the deprecated usage.  Its use of an
-unescaped left brace is one where we have no intention of repurposing
-C<"{"> to be something other than itself.
-
-That exception is now generalized to include various other such cases
-where the C<"{"> will not be repurposed.  This is to get real experience
-with this more complicated change now, in case we need to issue a dot
-release if we find other things like Autoconf that are important to work
-around.
-
-Note that these uses continue to raise a deprecation message.
-
 =head2 Module removals
 
 XXX Remove this section if inapplicable.
@@ -202,20 +147,49 @@ as an updated module in the L</Modules and Pragmata> section.
 XXX Changes which enhance performance without changing behaviour go here.
 There may well be none in a stable release.
 
-[ List each enhancement as a =item entry ]
+[ List each enhancement as an =item entry ]
 
 =over 4
 
 =item *
 
-File::Glob has been modified to remove unnecessary backtracking and
-recursion, thanks to Russ Cox. See L<https://research.swtch.com/glob>
-for more details.
+Many string concatenation expressions are now considerably faster, due
+to the introduction internally of a C<multiconcat> opcode which combines
+multiple concatenations, and optionally a C<=> or C<.=>, into a single
+action. For example, apart from retrieving C<$s>, C<$a> and C<$b>, this
+whole expression is now handled as a single op:
+
+    $s .= "a=$a b=$b\n"
+
+As a special case, if the LHS of an assign is a lexical variable or
+C<my $s>, the op itself handles retrieving the lexical variable, which
+is faster.
+
+In general, the more the expression includes a mix of constant strings and
+variable expressions, the longer the expression, and the more it mixes
+together non-utf8 and utf8 strings, the more marked the performance
+improvement. For example on a C<x86_64> system, this code has been
+benchmarked running four times faster:
+
+    my $s;
+    my $a = "ab\x{100}cde";
+    my $b = "fghij";
+    my $c = "\x{101}klmn";
+
+    for my $i (1..10_000_000) {
+        $s = "\x{100}wxyz";
+        $s .= "foo=$a bar=$b baz=$c";
+    }
+
+In addition, C<sprintf> expressions which have a constant format
+containing only C<%s> and C<%%> format elements, and which have a fixed
+number of arguments, are now also optimised into a C<multiconcat> op.
 
 =item *
 
-The ref() builtin is now much faster in boolean context, since it no
-longer bothers to construct a temporary string like C<Foo=ARRAY(0x134af48)>.
+Subroutines in packages no longer need to be stored in typeglobs, saving
+large amounts of memory.  See L</Subroutines no longer need typeglobs>
+under L</Incompatible Changes>, above.
 
 =back
 
@@ -227,7 +201,25 @@ following sections using F<Porting/corelist-perldelta.pl>.  A paragraph summary
 for important changes should then be added by hand.  In an ideal world,
 dual-life modules would have a F<Changes> file that could be cribbed.
 
-[ Within each section, list entries as a =item entry ]
+The list of new and updated modules is modified automatically as part of
+preparing a Perl release, so the only reason to manually add entries here is if
+you're summarising the important changes in the module update. (Also, if the
+manually-added details don't match the automatically-generated ones, the
+release manager will have to investigate the situation carefully.)
+
+[ Within each section, list entries as an =item entry ]
+
+=head2 Removal of use vars
+
+=over 4
+
+The usage of "use vars" has been discouraged since the introduction of our in
+Perl 5.6.0. Where possible the usage of this pragma has now been removed from
+the Perl source code.
+
+This had a slight effect (for the better) on the output of WARNING_BITS in B::Deparse.
+
+=back
 
 =head2 New Modules and Pragmata
 
@@ -245,16 +237,25 @@ XXX
 
 =item *
 
-L<XXX> has been upgraded from version A.xx to B.yy.
+L<Carp> has been upgraded from version 1.43 to 1.44.
+
+If a package on the call stack contains a constant named C<ISA>, Carp no
+longer throws a "Not a GLOB reference" error.
 
 =item *
 
-L<B::Deparse> has been upgraded from version 1.40 to 1.41. It includes
-many bug fixes, and in particular, it now deparses variable attributes
-correctly:
+L<File::Copy> has been upgraded from version 2.32 to 2.33.  It will now use
+Time::HiRes utime where available (RT #132401).
 
-    my $x :foo;  # used to deparse as
-                 # 'attributes'->import('main', \$x, 'foo'), my $x;
+=item *
+
+To address a security vulnerability in older versions of the 'zlib' library
+(which is bundled with Compress-Raw-Zlib), L<Compress::Raw::Zlib> has been
+upgraded to CPAN version 2.075.
+
+=item *
+
+L<Test::Simple> has been upgraded from version 1.302103 to 1.302111.
 
 =back
 
@@ -291,13 +292,43 @@ XXX Changes which significantly change existing files in F<pod/> go here.
 However, any changes to F<pod/perldiag.pod> should go in the L</Diagnostics>
 section.
 
-=head3 L<XXX>
+Additionally, the following selected changes have been made:
 
 =over 4
 
+=item * L<perldiag/Variable length lookbehind not implemented in regex m/%s/>
+
+This now gives more ideas as to workarounds to the issue that was
+introduced in Perl 5.18 (but not documented explicitly in its perldelta)
+for the fact that some Unicode C</i> rules cause a few sequences such as
+
+ (?<!st)
+
+to be considered variable length, and hence disallowed.
+
+=item *
+
+The section on reference counting in L<perlguts> has been heavily revised,
+to describe references in the way a programmer needs to think about them
+rather than in terms of the physical data structures.
+
+=item *
+
+The section "Truth and Falsehood" in L<perlsyn> has been removed from
+that document, where it didn't belong, and merged into the existing
+paragraph on the same topic in L<perldata>.
+
+=item *
+
+The description of the C<x> operator in L<perlop> has been clarified.
+
 =item *
 
-XXX Description of the change here
+L<perluniprops> has been updated to note that C<\p{Word}> now includes
+code points matching the C<\p{Join_Control}> property.  The change to
+the property was made in Perl 5.18, but not documented until now.  There
+are currently only two code points that match this property U+200C (ZERO
+WIDTH NON-JOINER) and U+200D (ZERO WIDTH JOINER).
 
 =back
 
@@ -343,6 +374,13 @@ XXX Changes (i.e. rewording) of diagnostic messages go here
 
 =item *
 
+The diagnostic C<Initialization of state variables in list context
+currently forbidden> has changed to C<Initialization of state variables
+in list currently forbidden>, because list-context initialization of
+single aggregate state variables is now permitted.
+
+=item *
+
 XXX Describe change here
 
 =back
@@ -373,33 +411,76 @@ go here.  Any other changes to the Perl build process should be listed here.
 However, any platform-specific changes should be listed in the
 L</Platform Support> section, instead.
 
-[ List changes as a =item entry ].
+[ List changes as an =item entry ].
 
 =over 4
 
-=item *
+=item C89 requirement
 
-XXX
+Perl has been documented as requiring a C89 compiler to build since October
+1998.  A variety of simplifications have now been made to Perl's internals to
+rely on the features specified by the C89 standard. We believe that this
+internal change hasn't altered the set of platforms that Perl builds on, but
+please report a bug if Perl now has new problems building on your platform.
+
+=item New probes
+
+=over 2
+
+=item HAS_BUILTIN_ADD_OVERFLOW
+
+=item HAS_BUILTIN_MUL_OVERFLOW
+
+=item HAS_BUILTIN_SUB_OVERFLOW
+
+=item HAS_THREAD_SAFE_NL_LANGINFO_L
+
+=item HAS_LOCALECONV_L
+
+=item HAS_MBRLEN
+
+=item HAS_MBRTOWC
+
+=item HAS_MEMRCHR
+
+=item HAS_NANOSLEEP
+
+=item HAS_STRNLEN
+
+=item HAS_STRTOLD_L
+
+=item I_WCHAR
+
+=back
 
 =back
 
 =head1 Testing
 
+XXX Any significant changes to the testing of a freshly built perl should be
+listed here.  Changes which create B<new> files in F<t/> go here as do any
+large changes to the testing harness (e.g. when parallel testing was added).
+Changes to existing files in F<t/> aren't worth summarizing, although the bugs
+that they represent may be covered elsewhere.
+
+XXX If there were no significant test changes, say this:
+
+Tests were added and changed to reflect the other additions and changes
+in this release.
+
+XXX If instead there were significant changes, say this:
+
 Tests were added and changed to reflect the other additions and
 changes in this release.  Furthermore, these significant changes were
 made:
 
-=over 4
-
-=item *
+[ List each test improvement as an =item entry ]
 
-Testing of the XS-APItest directory is now done in parallel, where
-applicable.
+=over 4
 
 =item *
 
-Perl now includes a default F<.travis.yml> file for Travis CI testing
-on github mirrors.  [perl #123981]
+XXX
 
 =back
 
@@ -407,7 +488,7 @@ on github mirrors.  [perl #123981]
 
 XXX Any changes to platform support should be listed in the sections below.
 
-[ Within the sections, list each platform as a =item entry with specific
+[ Within the sections, list each platform as an =item entry with specific
 changes as paragraphs below it. ]
 
 =head2 New Platforms
@@ -431,16 +512,9 @@ XXX List any platforms that this version of perl no longer compiles on.
 
 =over 4
 
-=item Windows
-
-=over 4
-
-=item *
-
-Support for compiling perl on Windows using Microsoft Visual Studio 2017
-(containing Visual C++ 14.1) has been added.
+=item XXX-some-platform
 
-=back
+XXX
 
 =back
 
@@ -453,9 +527,10 @@ L</Modules and Pragmata> section.
 
 =over 4
 
-=item XXX-some-platform
+=item Windows
 
-XXX
+Visual C++ compiler version detection has been improved to work on non-English
+language systems.
 
 =back
 
@@ -465,27 +540,41 @@ XXX Changes which affect the interface available to C<XS> code go here.  Other
 significant internal changes for future core maintainers should be noted as
 well.
 
-[ List each change as a =item entry ]
+[ List each change as an =item entry ]
 
 =over 4
 
 =item *
 
-The C<PL_statbuf> interpreter variable has been removed.
+A new optimisation phase has been added to the compiler,
+C<optimize_optree()>, which does a top-down scan of a complete optree
+just before the peephole optimiser is run. This phase is not currently
+hookable.
 
 =item *
 
-The deprecated function C<to_utf8_case()>, accessible from XS code, has
-been removed.
+An C<OP_MULTICONCAT> op has been added. At C<optimize_optree()> time, a
+chain of C<OP_CONCAT> and C<OP_CONST> ops, together optionally with an
+C<OP_STRINGIFY> and/or C<OP_SASSIGN>, are combined into a single
+C<OP_MULTICONCAT> op. The op is of type C<UNOP_AUX>, and the aux array
+contains the argument count, plus a pointer to a constant string and a set
+of segment lengths. For example with
+
+    my $x = "foo=$foo, bar=$bar\n";
+
+the constant string would be C<"foo=, bar=\n"> and the segment lengths
+would be (4,6,1). If the string contains characters such as C<\x80>, whose
+representation changes under utf8, two sets of strings plus lengths are
+precomputed and stored.
 
 =item *
 
-A new function
-L<C<is_utf8_invariant_string_loc()>|perlapi/is_utf8_invariant_string_loc>
-has been added that is like
-L<C<is_utf8_invariant_string()>|perlapi/is_utf8_invariant_string>
-but takes an extra pointer parameter into which is stored the location
-of the first variant character, if any are found.
+Direct access to L<C<PL_keyword_plugin>|perlapi/PL_keyword_plugin> is not
+safe in the presence of multithreading. A new
+L<C<wrap_keyword_plugin>|perlapi/wrap_keyword_plugin> function has been
+added to allow XS modules to safely define custom keywords even when
+loaded from a thread, analoguous to L<C<PL_check>|perlapi/PL_check> /
+L<C<wrap_op_checker>|perlapi/wrap_op_checker>.
 
 =back
 
@@ -494,32 +583,55 @@ of the first variant character, if any are found.
 XXX Important bug fixes in the core language are summarized here.  Bug fixes in
 files in F<ext/> and F<lib/> are best summarized in L</Modules and Pragmata>.
 
-[ List each fix as a =item entry ]
+[ List each fix as an =item entry ]
 
 =over 4
 
 =item *
 
-Fetching the name of a glob that was previously UTF-8 but wasn't any
-longer would return that name flagged as UTF-8.  [perl #131263]
+C<stat()>, C<lstat()>, and file test operators now fail if given a
+filename containing a nul character, in the same way that C<open()>
+already fails.
+
+=item *
+
+C<stat()>, C<lstat()>, and file test operators now reliably set C<$!> when
+failing due to being applied to a closed or otherwise invalid file handle.
 
 =item *
 
-The perl sprintf() function (via the underlying C function
-Perl_sv_vcatpvfn_flags()) has been heavily reworked to fix many minor
-bugs, including the integer wrapping of large width and precision
-specifiers and potential buffer overruns. It has also been made faster in
-many cases.
+File test operators for Unix permission bits that don't exist on a
+particular platform, such as C<-k> (sticky bit) on Windows, now check that
+the file being tested exists before returning the blanket false result,
+and yield the appropriate errors if the argument doesn't refer to a file.
 
 =item *
 
-Exiting from an C<eval>, whether normally or via an exception, now always
-frees temporary values (possibly calling destructors) I<before> setting
-C<$@>. For example:
+The in-place reverse optimisation now correctly strengthens weak
+references using the L<C<sv_rvunweaken()>|perlapi/sv_rvunweaken>
+API function.
+
+=item *
+
+Fixed a read before buffer when parsing a range starting with C<\N{}>
+at the beginning of the character set for the transliteration
+operator.  [perl #132245]
+
+=item *
+
+Fixed a leaked SV when parsing an empty C<\N{}> at compile-time.
+[perl #132245]
+
+=item *
+
+Calling C<do $path> on a directory or block device now yields a meaningful
+error code in C<$!>.  [perl #125774]
+
+=item *
 
-    sub DESTROY { eval { die "died in DESTROY"; } }
-    eval { bless []; };
-    # $@ used to be equal to "died in DESTROY" here; it's now "".
+Lexical sub declarations in C<do> blocks such as C<do { my sub lex; 123 }>
+could corrupt the stack, erasing items already on the stack in the
+enclosing statement.  This has been fixed.  [perl #132442]
 
 =back
 
@@ -529,7 +641,7 @@ XXX Descriptions of platform agnostic bugs we know we can't fix go here.  Any
 tests that had to be C<TODO>ed for the release would be noted here.  Unfixed
 platform specific bugs also go here.
 
-[ List each fix as a =item entry ]
+[ List each fix as an =item entry ]
 
 =over 4
 
@@ -559,7 +671,7 @@ here.
 
 XXX Generate this with:
 
-  perl Porting/acknowledgements.pl v5.25.5..HEAD
+  perl Porting/acknowledgements.pl v5.27.5..HEAD
 
 =head1 Reporting Bugs