Imported Upstream version 5.31.2 upstream/5.31.2
authorDongHun Kwak <dh0128.kwak@samsung.com>
Thu, 17 Dec 2020 02:24:09 +0000 (11:24 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Thu, 17 Dec 2020 02:24:09 +0000 (11:24 +0900)
188 files changed:
AUTHORS
Configure
Cross/config.sh-arm-linux
Cross/config.sh-arm-linux-n770
INSTALL
MANIFEST
META.json
META.yml
Makefile.SH
NetWare/Makefile
NetWare/config_H.wc
Porting/Maintainers.pl
Porting/config.sh
Porting/config_H
Porting/epigraphs.pod
Porting/perldelta_template.pod
Porting/release_announcement_template.txt
Porting/release_managers_guide.pod
Porting/release_schedule.pod
README.haiku
README.macosx
README.os2
README.vms
XSUB.h
autodoc.pl
av.c
av.h
charclass_invlists.h
config_h.SH
configure.com
cop.h
cpan/IPC-Cmd/lib/IPC/Cmd.pm
cpan/JSON-PP/bin/json_pp
cpan/JSON-PP/lib/JSON/PP.pm
cpan/JSON-PP/lib/JSON/PP/Boolean.pm
cpan/Pod-Simple/lib/Pod/Simple.pm
cpan/Pod-Simple/lib/Pod/Simple.pod
cpan/Pod-Simple/lib/Pod/Simple/BlackBox.pm
cpan/Pod-Simple/lib/Pod/Simple/Checker.pm
cpan/Pod-Simple/lib/Pod/Simple/Debug.pm
cpan/Pod-Simple/lib/Pod/Simple/DumpAsText.pm
cpan/Pod-Simple/lib/Pod/Simple/DumpAsXML.pm
cpan/Pod-Simple/lib/Pod/Simple/HTML.pm
cpan/Pod-Simple/lib/Pod/Simple/HTMLBatch.pm
cpan/Pod-Simple/lib/Pod/Simple/LinkSection.pm
cpan/Pod-Simple/lib/Pod/Simple/Methody.pm
cpan/Pod-Simple/lib/Pod/Simple/Progress.pm
cpan/Pod-Simple/lib/Pod/Simple/PullParser.pm
cpan/Pod-Simple/lib/Pod/Simple/PullParserEndToken.pm
cpan/Pod-Simple/lib/Pod/Simple/PullParserStartToken.pm
cpan/Pod-Simple/lib/Pod/Simple/PullParserTextToken.pm
cpan/Pod-Simple/lib/Pod/Simple/PullParserToken.pm
cpan/Pod-Simple/lib/Pod/Simple/RTF.pm
cpan/Pod-Simple/lib/Pod/Simple/Search.pm
cpan/Pod-Simple/lib/Pod/Simple/SimpleTree.pm
cpan/Pod-Simple/lib/Pod/Simple/Text.pm
cpan/Pod-Simple/lib/Pod/Simple/TextContent.pm
cpan/Pod-Simple/lib/Pod/Simple/TiedOutFH.pm
cpan/Pod-Simple/lib/Pod/Simple/Transcode.pm
cpan/Pod-Simple/lib/Pod/Simple/TranscodeDumb.pm
cpan/Pod-Simple/lib/Pod/Simple/TranscodeSmart.pm
cpan/Pod-Simple/lib/Pod/Simple/XHTML.pm
cpan/Pod-Simple/lib/Pod/Simple/XMLOutStream.pm
cpan/Pod-Simple/t/JustPod_corpus.t
cv.h
dist/Devel-PPPort/Makefile.PL
dist/Devel-PPPort/PPPort_pm.PL
dist/Devel-PPPort/devel/mkapidoc.sh
dist/Devel-PPPort/parts/apicheck.pl
dist/Devel-PPPort/parts/apidoc.fnc
dist/Devel-PPPort/parts/embed.fnc
dist/Devel-PPPort/parts/inc/01_test [new file with mode: 0644]
dist/Devel-PPPort/parts/inc/SvPV
dist/Devel-PPPort/parts/inc/Sv_set
dist/Devel-PPPort/parts/inc/call
dist/Devel-PPPort/parts/inc/gv
dist/Devel-PPPort/parts/inc/mess
dist/Devel-PPPort/parts/inc/misc
dist/Devel-PPPort/parts/inc/newRV
dist/Devel-PPPort/parts/inc/newSV_type
dist/Devel-PPPort/parts/inc/newSVpv
dist/Devel-PPPort/parts/inc/ppphtest
dist/Devel-PPPort/parts/inc/sv_xpvf
dist/Devel-PPPort/parts/inc/uv
dist/Devel-PPPort/parts/inc/warn
dist/Devel-PPPort/parts/ppptools.pl
dist/Devel-PPPort/parts/todo/5015009
dist/Devel-PPPort/t/01_test.t [new file with mode: 0644]
dist/Devel-PPPort/t/Sv_set.t
dist/Devel-PPPort/t/mess.t
dist/Devel-PPPort/t/ppphtest.t
dist/Devel-PPPort/t/uv.t
dist/Exporter/lib/Exporter.pm
dist/Exporter/lib/Exporter/Heavy.pm
dist/Exporter/t/Exporter.t
dist/Module-CoreList/Changes
dist/Module-CoreList/lib/Module/CoreList.pm
dist/Module-CoreList/lib/Module/CoreList/Utils.pm
dist/Net-Ping/t/001_new.t
dist/Net-Ping/t/010_pingecho.t
dist/threads-shared/lib/threads/shared.pm
dist/threads-shared/shared.xs
doio.c
embed.fnc
embed.h
ext/Opcode/Opcode.pm
ext/POSIX/lib/POSIX.pod
ext/PerlIO-encoding/encoding.pm
ext/PerlIO-encoding/encoding.xs
ext/PerlIO-encoding/t/encoding.t
ext/XS-APItest/Makefile.PL
ext/XS-APItest/t/call.t
handy.h
hints/catamount.sh
hints/linux-android.sh
hints/linux.sh
hv.h
inline.h
lib/B/Op_private.pm
lib/unicore/mktables
lib/unicore/uni_keywords.pl
locale.c
op.c
pad.c
patchlevel.h
perl.c
perl.h
perlio.c
perlio.h
perlvars.h
perly.act
perly.h
perly.tab
plan9/config.plan9
plan9/config_sh.sample
pod/perl.pod
pod/perl5311delta.pod [new file with mode: 0644]
pod/perldebguts.pod
pod/perldelta.pod
pod/perldiag.pod
pod/perlhist.pod
pod/perlintro.pod
pod/perllocale.pod
pp.h
pp_sys.c
proto.h
regcharclass.h
regcomp.c
regcomp.h
regcomp.sym
regen/unicode_constants.pl
regen_perly.pl
regexec.c
regnodes.h
sv.c
sv.h
t/io/perlio_open.t
t/io/pipe.t
t/lib/croak/toke
t/lib/warnings/9uninit
t/lib/warnings/op
t/op/blocks.t
t/op/cond.t
t/op/hexfp.t
t/op/list.t
t/porting/customized.dat
t/porting/known_pod_issues.dat
t/re/anyof.t
t/re/reg_mesg.t
toke.c
uconfig.h
uni_keywords.h
unicode_constants.h
utf8.c
utf8.h
util.c
util.h
vms/descrip_mms.template
vms/gen_shrfls.pl
win32/GNUmakefile
win32/Makefile
win32/config_H.gc
win32/config_H.vc
win32/makefile.mk
win32/pod.mak
win32/win32.c
win32/win32.h
win32/win32iop.h

diff --git a/AUTHORS b/AUTHORS
index da9ff89..a2b6d8c 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -1190,6 +1190,7 @@ Steven Parkes                     <parkes@sierravista.com>
 Steven Schubiger               <schubiger@cpan.org>
 Stian Seeberg                  <sseeberg@nimsoft.no>
 Sullivan Beck                  <sbeck@cpan.org>
+Svyatoslav                     <razmyslov@viva64.com>
 Sven Strickroth                        <sven.strickroth@tu-clausthal.de>
 Sven Verdoolaege               <skimo@breughel.ufsia.ac.be>
 syber                          <syber@crazypanda.ru>
index 0edf516..5c02255 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -8110,6 +8110,10 @@ while $test 1 ; do
        $define|true|[yY]*)
                dflt='y'
                ;;
+       $undef|false|[nN]*)
+               dflt='n'
+               dflt_dtrace=""
+               ;;
        ?*)
                dflt='y'
                dflt_dtrace=$usedtrace
index 39e3529..1965d6b 100644 (file)
@@ -31,12 +31,12 @@ afsroot='/afs'
 alignbytes='4'
 aphostname='/bin/hostname'
 api_revision='5'
-api_subversion='1'
+api_subversion='2'
 api_version='31'
-api_versionstring='5.31.1'
+api_versionstring='5.31.2'
 ar='ar'
-archlib='/usr/lib/perl5/5.31.1/armv4l-linux'
-archlibexp='/usr/lib/perl5/5.31.1/armv4l-linux'
+archlib='/usr/lib/perl5/5.31.2/armv4l-linux'
+archlibexp='/usr/lib/perl5/5.31.2/armv4l-linux'
 archname64=''
 archname='armv4l-linux'
 archobjs=''
@@ -55,7 +55,7 @@ castflags='0'
 cat='cat'
 cc='cc'
 cccdlflags='-fpic'
-ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.31.1/armv4l-linux/CORE'
+ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.31.2/armv4l-linux/CORE'
 ccflags='-fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
 ccflags_uselargefiles='-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
 ccname='arm-linux-gcc'
@@ -821,7 +821,7 @@ inc_version_list=' '
 inc_version_list_init='0'
 incpath=''
 inews=''
-installarchlib='./install_me_here/usr/lib/perl5/5.31.1/armv4l-linux'
+installarchlib='./install_me_here/usr/lib/perl5/5.31.2/armv4l-linux'
 installbin='./install_me_here/usr/bin'
 installhtml1dir=''
 installhtml3dir=''
@@ -829,13 +829,13 @@ installman1dir='./install_me_here/usr/share/man/man1'
 installman3dir='./install_me_here/usr/share/man/man3'
 installprefix='./install_me_here/usr'
 installprefixexp='./install_me_here/usr'
-installprivlib='./install_me_here/usr/lib/perl5/5.31.1'
+installprivlib='./install_me_here/usr/lib/perl5/5.31.2'
 installscript='./install_me_here/usr/bin'
-installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.31.1/armv4l-linux'
+installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.31.2/armv4l-linux'
 installsitebin='./install_me_here/usr/bin'
 installsitehtml1dir=''
 installsitehtml3dir=''
-installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.31.1'
+installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.31.2'
 installsiteman1dir='./install_me_here/usr/share/man/man1'
 installsiteman3dir='./install_me_here/usr/share/man/man3'
 installsitescript='./install_me_here/usr/bin'
@@ -969,8 +969,8 @@ pmake=''
 pr=''
 prefix='/usr'
 prefixexp='/usr'
-privlib='/usr/lib/perl5/5.31.1'
-privlibexp='/usr/lib/perl5/5.31.1'
+privlib='/usr/lib/perl5/5.31.2'
+privlibexp='/usr/lib/perl5/5.31.2'
 procselfexe='"/proc/self/exe"'
 prototype='define'
 ptrsize='4'
@@ -1035,17 +1035,17 @@ sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 6, 17, 29, 31, 0'
 sig_size='68'
 signal_t='void'
-sitearch='/usr/lib/perl5/site_perl/5.31.1/armv4l-linux'
-sitearchexp='/usr/lib/perl5/site_perl/5.31.1/armv4l-linux'
+sitearch='/usr/lib/perl5/site_perl/5.31.2/armv4l-linux'
+sitearchexp='/usr/lib/perl5/site_perl/5.31.2/armv4l-linux'
 sitebin='/usr/bin'
 sitebinexp='/usr/bin'
 sitehtml1dir=''
 sitehtml1direxp=''
 sitehtml3dir=''
 sitehtml3direxp=''
-sitelib='/usr/lib/perl5/site_perl/5.31.1'
+sitelib='/usr/lib/perl5/site_perl/5.31.2'
 sitelib_stem='/usr/lib/perl5/site_perl'
-sitelibexp='/usr/lib/perl5/site_perl/5.31.1'
+sitelibexp='/usr/lib/perl5/site_perl/5.31.2'
 siteman1dir='/usr/share/man/man1'
 siteman1direxp='/usr/share/man/man1'
 siteman3dir='/usr/share/man/man3'
@@ -1084,7 +1084,7 @@ stdio_stream_array=''
 strerror_r_proto='0'
 strings='/usr/include/string.h'
 submit=''
-subversion='1'
+subversion='2'
 sysman='/usr/share/man/man1'
 tail=''
 tar=''
@@ -1175,8 +1175,8 @@ vendorprefix=''
 vendorprefixexp=''
 vendorscript=''
 vendorscriptexp=''
-version='5.31.1'
-version_patchlevel_string='version 31 subversion 1'
+version='5.31.2'
+version_patchlevel_string='version 31 subversion 2'
 versiononly='undef'
 vi=''
 xlibpth='/usr/lib/386 /lib/386'
@@ -1190,9 +1190,9 @@ config_args=''
 config_argc=0
 PERL_REVISION=5
 PERL_VERSION=31
-PERL_SUBVERSION=1
+PERL_SUBVERSION=2
 PERL_API_REVISION=5
 PERL_API_VERSION=31
-PERL_API_SUBVERSION=1
+PERL_API_SUBVERSION=2
 PERL_PATCHLEVEL=
 PERL_CONFIG_SH=true
index a3c6d0e..73f1370 100644 (file)
@@ -31,12 +31,12 @@ afsroot='/afs'
 alignbytes='4'
 aphostname='/bin/hostname'
 api_revision='5'
-api_subversion='1'
+api_subversion='2'
 api_version='31'
-api_versionstring='5.31.1'
+api_versionstring='5.31.2'
 ar='ar'
-archlib='/usr/lib/perl5/5.31.1/armv4l-linux'
-archlibexp='/usr/lib/perl5/5.31.1/armv4l-linux'
+archlib='/usr/lib/perl5/5.31.2/armv4l-linux'
+archlibexp='/usr/lib/perl5/5.31.2/armv4l-linux'
 archname64=''
 archname='armv4l-linux'
 archobjs=''
@@ -54,7 +54,7 @@ castflags='0'
 cat='cat'
 cc='arm-none-linux-gnueabi-gcc'
 cccdlflags='-fpic'
-ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.31.1/armv4l-linux/CORE'
+ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.31.2/armv4l-linux/CORE'
 ccflags='-fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
 ccflags_uselargefiles='-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
 ccname='arm-linux-gcc'
@@ -819,7 +819,7 @@ inc_version_list=' '
 inc_version_list_init='0'
 incpath=''
 inews=''
-installarchlib='./install_me_here/usr/lib/perl5/5.31.1/armv4l-linux'
+installarchlib='./install_me_here/usr/lib/perl5/5.31.2/armv4l-linux'
 installbin='./install_me_here/usr/bin'
 installhtml1dir=''
 installhtml3dir=''
@@ -827,13 +827,13 @@ installman1dir='./install_me_here/usr/share/man/man1'
 installman3dir='./install_me_here/usr/share/man/man3'
 installprefix='./install_me_here/usr'
 installprefixexp='./install_me_here/usr'
-installprivlib='./install_me_here/usr/lib/perl5/5.31.1'
+installprivlib='./install_me_here/usr/lib/perl5/5.31.2'
 installscript='./install_me_here/usr/bin'
-installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.31.1/armv4l-linux'
+installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.31.2/armv4l-linux'
 installsitebin='./install_me_here/usr/bin'
 installsitehtml1dir=''
 installsitehtml3dir=''
-installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.31.1'
+installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.31.2'
 installsiteman1dir='./install_me_here/usr/share/man/man1'
 installsiteman3dir='./install_me_here/usr/share/man/man3'
 installsitescript='./install_me_here/usr/bin'
@@ -967,8 +967,8 @@ pmake=''
 pr=''
 prefix='/usr'
 prefixexp='/usr'
-privlib='/usr/lib/perl5/5.31.1'
-privlibexp='/usr/lib/perl5/5.31.1'
+privlib='/usr/lib/perl5/5.31.2'
+privlibexp='/usr/lib/perl5/5.31.2'
 procselfexe='"/proc/self/exe"'
 prototype='define'
 ptrsize='4'
@@ -1033,17 +1033,17 @@ sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 6, 17, 29, 31, 0'
 sig_size='68'
 signal_t='void'
-sitearch='/usr/lib/perl5/site_perl/5.31.1/armv4l-linux'
-sitearchexp='/usr/lib/perl5/site_perl/5.31.1/armv4l-linux'
+sitearch='/usr/lib/perl5/site_perl/5.31.2/armv4l-linux'
+sitearchexp='/usr/lib/perl5/site_perl/5.31.2/armv4l-linux'
 sitebin='/usr/bin'
 sitebinexp='/usr/bin'
 sitehtml1dir=''
 sitehtml1direxp=''
 sitehtml3dir=''
 sitehtml3direxp=''
-sitelib='/usr/lib/perl5/site_perl/5.31.1'
+sitelib='/usr/lib/perl5/site_perl/5.31.2'
 sitelib_stem='/usr/lib/perl5/site_perl'
-sitelibexp='/usr/lib/perl5/site_perl/5.31.1'
+sitelibexp='/usr/lib/perl5/site_perl/5.31.2'
 siteman1dir='/usr/share/man/man1'
 siteman1direxp='/usr/share/man/man1'
 siteman3dir='/usr/share/man/man3'
@@ -1082,7 +1082,7 @@ stdio_stream_array=''
 strerror_r_proto='0'
 strings='/usr/include/string.h'
 submit=''
-subversion='1'
+subversion='2'
 sysman='/usr/share/man/man1'
 tail=''
 tar=''
@@ -1173,8 +1173,8 @@ vendorprefix=''
 vendorprefixexp=''
 vendorscript=''
 vendorscriptexp=''
-version='5.31.1'
-version_patchlevel_string='version 31 subversion 1'
+version='5.31.2'
+version_patchlevel_string='version 31 subversion 2'
 versiononly='undef'
 vi=''
 xlibpth='/usr/lib/386 /lib/386'
@@ -1188,9 +1188,9 @@ config_args=''
 config_argc=0
 PERL_REVISION=5
 PERL_VERSION=31
-PERL_SUBVERSION=1
+PERL_SUBVERSION=2
 PERL_API_REVISION=5
 PERL_API_VERSION=31
-PERL_API_SUBVERSION=1
+PERL_API_SUBVERSION=2
 PERL_PATCHLEVEL=
 PERL_CONFIG_SH=true
diff --git a/INSTALL b/INSTALL
index 5fb9636..abec8e4 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -609,7 +609,7 @@ The directories set up by Configure fall into three broad categories.
 
 =item Directories for the perl distribution
 
-By default, Configure will use the following directories for 5.31.1.
+By default, Configure will use the following directories for 5.31.2.
 $version is the full perl version number, including subversion, e.g.
 5.12.3, and $archname is a string like sun4-sunos,
 determined by Configure.  The full definitions of all Configure
@@ -2436,7 +2436,7 @@ L<http://www.chiark.greenend.org.uk/~sgtatham/bugs.html>
 
 =head1 Coexistence with earlier versions of perl 5
 
-Perl 5.31.1 is not binary compatible with earlier versions of Perl.
+Perl 5.31.2 is not binary compatible with earlier versions of Perl.
 In other words, you will have to recompile your XS modules.
 
 In general, you can usually safely upgrade from one version of Perl
@@ -2511,9 +2511,9 @@ won't interfere with another version.  (The defaults guarantee this for
 libraries after 5.6.0, but not for executables. TODO?)  One convenient
 way to do this is by using a separate prefix for each version, such as
 
-       sh Configure -Dprefix=/opt/perl5.31.1
+       sh Configure -Dprefix=/opt/perl5.31.2
 
-and adding /opt/perl5.31.1/bin to the shell PATH variable.  Such users
+and adding /opt/perl5.31.2/bin to the shell PATH variable.  Such users
 may also wish to add a symbolic link /usr/local/bin/perl so that
 scripts can still start with #!/usr/local/bin/perl.
 
@@ -2526,13 +2526,13 @@ seriously consider using a separate directory, since development
 subversions may not have all the compatibility wrinkles ironed out
 yet.
 
-=head2 Upgrading from 5.28.0 or earlier
+=head2 Upgrading from 5.31.1 or earlier
 
-B<Perl 5.31.1 may not be binary compatible with Perl 5.28.0 or
+B<Perl 5.31.2 may not be binary compatible with Perl 5.31.1 or
 earlier Perl releases.>  Perl modules having binary parts
 (meaning that a C compiler is used) will have to be recompiled to be
-used with 5.31.1.  If you find you do need to rebuild an extension with
-5.31.1, you may safely do so without disturbing the older
+used with 5.31.2.  If you find you do need to rebuild an extension with
+5.31.2, you may safely do so without disturbing the older
 installations.  (See L<"Coexistence with earlier versions of perl 5">
 above.)
 
@@ -2565,15 +2565,15 @@ Firstly, the bare minimum to run this script
      print("$f\n");
   }
 
-in Linux with perl-5.31.1 is as follows (under $Config{prefix}):
+in Linux with perl-5.31.2 is as follows (under $Config{prefix}):
 
   ./bin/perl
-  ./lib/perl5/5.31.1/strict.pm
-  ./lib/perl5/5.31.1/warnings.pm
-  ./lib/perl5/5.31.1/i686-linux/File/Glob.pm
-  ./lib/perl5/5.31.1/feature.pm
-  ./lib/perl5/5.31.1/XSLoader.pm
-  ./lib/perl5/5.31.1/i686-linux/auto/File/Glob/Glob.so
+  ./lib/perl5/5.31.2/strict.pm
+  ./lib/perl5/5.31.2/warnings.pm
+  ./lib/perl5/5.31.2/i686-linux/File/Glob.pm
+  ./lib/perl5/5.31.2/feature.pm
+  ./lib/perl5/5.31.2/XSLoader.pm
+  ./lib/perl5/5.31.2/i686-linux/auto/File/Glob/Glob.so
 
 Secondly, for perl-5.10.1, the Debian perl-base package contains 591
 files, (of which 510 are for lib/unicore) totaling about 3.5MB in its
index d0300c8..882d8f7 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -3111,6 +3111,7 @@ dist/Devel-PPPort/parts/base/5023008      Devel::PPPort baseline todo file
 dist/Devel-PPPort/parts/base/5023009   Devel::PPPort baseline todo file
 dist/Devel-PPPort/parts/base/5024000   Devel::PPPort baseline todo file
 dist/Devel-PPPort/parts/embed.fnc      Devel::PPPort Perl API listing
+dist/Devel-PPPort/parts/inc/01_test    Devel::PPPort include
 dist/Devel-PPPort/parts/inc/call       Devel::PPPort include
 dist/Devel-PPPort/parts/inc/cop                Devel::PPPort include
 dist/Devel-PPPort/parts/inc/exception  Devel::PPPort include
@@ -3293,6 +3294,7 @@ dist/Devel-PPPort/ppport_h.PL             Devel::PPPort ppport.h writer
 dist/Devel-PPPort/PPPort_pm.PL         Devel::PPPort PPPort.pm writer
 dist/Devel-PPPort/RealPPPort_xs.PL             Devel::PPPort RealPPPort.xs writer
 dist/Devel-PPPort/soak                 Devel::PPPort Test Harness to run under various Perls
+dist/Devel-PPPort/t/01_test.t          Devel::PPPort test file
 dist/Devel-PPPort/t/call.t             Devel::PPPort test file
 dist/Devel-PPPort/t/cop.t              Devel::PPPort test file
 dist/Devel-PPPort/t/exception.t                Devel::PPPort test file
@@ -4996,6 +4998,7 @@ pod/perl5281delta.pod             Perl changes in version 5.28.1
 pod/perl5282delta.pod          Perl changes in version 5.28.2
 pod/perl5300delta.pod          Perl changes in version 5.30.0
 pod/perl5310delta.pod          Perl changes in version 5.31.0
+pod/perl5311delta.pod          Perl changes in version 5.31.1
 pod/perl561delta.pod           Perl changes in version 5.6.1
 pod/perl56delta.pod            Perl changes in version 5.6
 pod/perl581delta.pod           Perl changes in version 5.8.1
index 6cf03cc..534a8dc 100644 (file)
--- a/META.json
+++ b/META.json
          "url" : "http://perl5.git.perl.org/"
       }
    },
-   "version" : "5.031001",
-   "x_serialization_backend" : "JSON::PP version 4.02"
+   "version" : "5.031002",
+   "x_serialization_backend" : "JSON::PP version 4.04"
 }
index 36aee09..7492ed4 100644 (file)
--- a/META.yml
+++ b/META.yml
@@ -114,5 +114,5 @@ resources:
   homepage: http://www.perl.org/
   license: http://dev.perl.org/licenses/
   repository: http://perl5.git.perl.org/
-version: '5.031001'
+version: '5.031002'
 x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
index 73c9d81..63dff1d 100755 (executable)
@@ -281,6 +281,7 @@ LNS = $lns
 CPS = $cp
 RMS = rm -f
 ranlib = $ranlib
+ECHO = $echo
 
 # The following are mentioned only to make metaconfig include the
 # appropriate questions in Configure.  If you want to change these,
@@ -588,7 +589,7 @@ esac
 
 $spitshell >>$Makefile <<'!NO!SUBS!'
 
-perltoc_pod_prereqs = extra.pods pod/perl5311delta.pod pod/perlapi.pod pod/perlintern.pod pod/perlmodlib.pod pod/perluniprops.pod
+perltoc_pod_prereqs = extra.pods pod/perl5312delta.pod pod/perlapi.pod pod/perlintern.pod pod/perlmodlib.pod pod/perluniprops.pod
 generated_pods = pod/perltoc.pod $(perltoc_pod_prereqs)
 generated_headers = uudmap.h bitcount.h mg_data.h
 
@@ -1152,9 +1153,9 @@ pod/perlintern.pod: $(MINIPERL_EXE) autodoc.pl embed.fnc
 pod/perlmodlib.pod: $(MINIPERL_EXE) pod/perlmodlib.PL MANIFEST
        $(MINIPERL) pod/perlmodlib.PL -q
 
-pod/perl5311delta.pod: pod/perldelta.pod
-       $(RMS) pod/perl5311delta.pod
-       $(LNS) perldelta.pod pod/perl5311delta.pod
+pod/perl5312delta.pod: pod/perldelta.pod
+       $(RMS) pod/perl5312delta.pod
+       $(LNS) perldelta.pod pod/perl5312delta.pod
 
 extra.pods: $(MINIPERL_EXE)
        -@test ! -f extra.pods || rm -f `cat extra.pods`
index 716004b..fcab932 100644 (file)
@@ -86,7 +86,7 @@ NLM_VERSION    = 3,20,0
 
 
 # Here comes the CW tools - TO BE FILLED TO BUILD WITH CW -
-MODULE_DESC     = "Perl 5.31.1 for NetWare"
+MODULE_DESC     = "Perl 5.31.2 for NetWare"
 CCTYPE          = CodeWarrior
 C_COMPILER             = mwccnlm -c
 CPP_COMPILER   = mwccnlm
@@ -462,7 +462,7 @@ INST_NW_TOP2 = $(INST_NW_DRV)\perl
 # versioned installation can be obtained by setting INST_TOP above to a
 # path that includes an arbitrary version string.
 #
-INST_VER       = \5.31.1
+INST_VER       = \5.31.2
 
 #
 # Comment this out if you DON'T want your perl installation to have
index 406d8da..238f43f 100644 (file)
  *     This symbol contains the ~name expanded version of ARCHLIB, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#define ARCHLIB "c:\\perl\\5.31.1\\lib\\NetWare-x86-multi-thread"              /**/
+#define ARCHLIB "c:\\perl\\5.31.2\\lib\\NetWare-x86-multi-thread"              /**/
 /*#define ARCHLIB_EXP ""       /**/
 
 /* ARCHNAME:
  *     This symbol is the filename expanded version of the BIN symbol, for
  *     programs that do not want to deal with that at run-time.
  */
-#define BIN "c:\\perl\\5.31.1\\bin\\NetWare-x86-multi-thread"  /**/
-#define BIN_EXP "c:\\perl\\5.31.1\\bin\\NetWare-x86-multi-thread"      /**/
+#define BIN "c:\\perl\\5.31.2\\bin\\NetWare-x86-multi-thread"  /**/
+#define BIN_EXP "c:\\perl\\5.31.2\\bin\\NetWare-x86-multi-thread"      /**/
 
 /* BYTEORDER:
  *     This symbol holds the hexadecimal constant defined in byteorder,
  *     This symbol contains the ~name expanded version of SITEARCH, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#define SITEARCH "c:\\perl\\site\\5.31.1\\lib\\NetWare-x86-multi-thread"               /**/
+#define SITEARCH "c:\\perl\\site\\5.31.2\\lib\\NetWare-x86-multi-thread"               /**/
 /*#define SITEARCH_EXP ""      /**/
 
 /* SITELIB:
  *     removed.  The elements in inc_version_list (inc_version_list.U) can
  *     be tacked onto this variable to generate a list of directories to search.
  */
-#define SITELIB "c:\\perl\\site\\5.31.1\\lib"          /**/
+#define SITELIB "c:\\perl\\site\\5.31.2\\lib"          /**/
 /*#define SITELIB_EXP ""       /**/
 #define SITELIB_STEM ""                /**/
 
index c3d11dd..d5d710d 100755 (executable)
@@ -237,6 +237,7 @@ use File::Glob qw(:case);
         'EXCLUDED'     => [qw(
                examples/show-v.pl
                )],
+        'CUSTOMIZED'   => [ qw(V.pm) ],
     },
 
     'constant' => {
@@ -643,7 +644,7 @@ use File::Glob qw(:case);
     },
 
     'IPC::Cmd' => {
-        'DISTRIBUTION' => 'BINGOS/IPC-Cmd-1.02.tar.gz',
+        'DISTRIBUTION' => 'BINGOS/IPC-Cmd-1.04.tar.gz',
         'FILES'        => q[cpan/IPC-Cmd],
     },
 
@@ -658,7 +659,7 @@ use File::Glob qw(:case);
     },
 
     'JSON::PP' => {
-        'DISTRIBUTION' => 'ISHIGAKI/JSON-PP-4.02.tar.gz',
+        'DISTRIBUTION' => 'ISHIGAKI/JSON-PP-4.04.tar.gz',
         'FILES'        => q[cpan/JSON-PP],
     },
 
@@ -788,7 +789,7 @@ use File::Glob qw(:case);
     },
 
     'Module::CoreList' => {
-        'DISTRIBUTION' => 'BINGOS/Module-CoreList-5.20190524.tar.gz',
+        'DISTRIBUTION' => 'BINGOS/Module-CoreList-5.20190620.tar.gz',
         'FILES'        => q[dist/Module-CoreList],
     },
 
@@ -827,15 +828,6 @@ use File::Glob qw(:case);
             qw(t/600_pod.t),
             qw(t/601_pod-coverage.t),
         ],
-        'CUSTOMIZED'   => [
-            qw(
-                lib/Net/Ping.pm
-                t/000_load.t
-                t/500_ping_icmp.t
-                t/501_ping_icmpv6.t
-                ),
-        ],
-
     },
 
     'NEXT' => {
@@ -925,7 +917,7 @@ use File::Glob qw(:case);
     },
 
     'Pod::Simple' => {
-        'DISTRIBUTION' => 'KHW/Pod-Simple-3.38.tar.gz',
+        'DISTRIBUTION' => 'KHW/Pod-Simple-3.39.tar.gz',
         'FILES'        => q[cpan/Pod-Simple],
     },
 
index 6d6a5b0..5daacdc 100644 (file)
@@ -44,12 +44,12 @@ afsroot='/afs'
 alignbytes='8'
 aphostname=''
 api_revision='5'
-api_subversion='1'
+api_subversion='2'
 api_version='31'
-api_versionstring='5.31.1'
+api_versionstring='5.31.2'
 ar='ar'
-archlib='/opt/perl/lib/5.31.1/x86_64-linux'
-archlibexp='/opt/perl/lib/5.31.1/x86_64-linux'
+archlib='/opt/perl/lib/5.31.2/x86_64-linux'
+archlibexp='/opt/perl/lib/5.31.2/x86_64-linux'
 archname64=''
 archname='x86_64-linux'
 archobjs=''
@@ -845,7 +845,7 @@ incpath=''
 incpth='/usr/lib/gcc/x86_64-linux-gnu/4.9/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/4.9/include-fixed /usr/include/x86_64-linux-gnu /usr/include'
 inews=''
 initialinstalllocation='/opt/perl/bin'
-installarchlib='/opt/perl/lib/5.31.1/x86_64-linux'
+installarchlib='/opt/perl/lib/5.31.2/x86_64-linux'
 installbin='/opt/perl/bin'
 installhtml1dir=''
 installhtml3dir=''
@@ -853,13 +853,13 @@ installman1dir='/opt/perl/man/man1'
 installman3dir='/opt/perl/man/man3'
 installprefix='/opt/perl'
 installprefixexp='/opt/perl'
-installprivlib='/opt/perl/lib/5.31.1'
+installprivlib='/opt/perl/lib/5.31.2'
 installscript='/opt/perl/bin'
-installsitearch='/opt/perl/lib/site_perl/5.31.1/x86_64-linux'
+installsitearch='/opt/perl/lib/site_perl/5.31.2/x86_64-linux'
 installsitebin='/opt/perl/bin'
 installsitehtml1dir=''
 installsitehtml3dir=''
-installsitelib='/opt/perl/lib/site_perl/5.31.1'
+installsitelib='/opt/perl/lib/site_perl/5.31.2'
 installsiteman1dir='/opt/perl/man/man1'
 installsiteman3dir='/opt/perl/man/man3'
 installsitescript='/opt/perl/bin'
@@ -984,7 +984,7 @@ perl_patchlevel=''
 perl_static_inline='static __inline__'
 perladmin='yourname@yourhost.yourplace.com'
 perllibs='-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc'
-perlpath='/opt/perl/bin/perl5.31.1'
+perlpath='/opt/perl/bin/perl5.31.2'
 pg='pg'
 phostname=''
 pidtype='pid_t'
@@ -993,8 +993,8 @@ pmake=''
 pr=''
 prefix='/opt/perl'
 prefixexp='/opt/perl'
-privlib='/opt/perl/lib/5.31.1'
-privlibexp='/opt/perl/lib/5.31.1'
+privlib='/opt/perl/lib/5.31.2'
+privlibexp='/opt/perl/lib/5.31.2'
 procselfexe='"/proc/self/exe"'
 ptrsize='8'
 quadkind='2'
@@ -1059,17 +1059,17 @@ sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 6, 17, 29, 31, 0'
 sig_size='69'
 signal_t='void'
-sitearch='/opt/perl/lib/site_perl/5.31.1/x86_64-linux'
-sitearchexp='/opt/perl/lib/site_perl/5.31.1/x86_64-linux'
+sitearch='/opt/perl/lib/site_perl/5.31.2/x86_64-linux'
+sitearchexp='/opt/perl/lib/site_perl/5.31.2/x86_64-linux'
 sitebin='/opt/perl/bin'
 sitebinexp='/opt/perl/bin'
 sitehtml1dir=''
 sitehtml1direxp=''
 sitehtml3dir=''
 sitehtml3direxp=''
-sitelib='/opt/perl/lib/site_perl/5.31.1'
+sitelib='/opt/perl/lib/site_perl/5.31.2'
 sitelib_stem='/opt/perl/lib/site_perl'
-sitelibexp='/opt/perl/lib/site_perl/5.31.1'
+sitelibexp='/opt/perl/lib/site_perl/5.31.2'
 siteman1dir='/opt/perl/man/man1'
 siteman1direxp='/opt/perl/man/man1'
 siteman3dir='/opt/perl/man/man3'
@@ -1095,7 +1095,7 @@ src='.'
 ssizetype='ssize_t'
 st_ino_sign='1'
 st_ino_size='8'
-startperl='#!/opt/perl/bin/perl5.31.1'
+startperl='#!/opt/perl/bin/perl5.31.2'
 startsh='#!/bin/sh'
 static_ext=' '
 stdchar='char'
@@ -1107,7 +1107,7 @@ stdio_ptr='((fp)->_IO_read_ptr)'
 stdio_stream_array=''
 strerror_r_proto='0'
 submit=''
-subversion='1'
+subversion='2'
 sysman='/usr/share/man/man1'
 sysroot=''
 tail=''
@@ -1205,8 +1205,8 @@ vendorprefix=''
 vendorprefixexp=''
 vendorscript=''
 vendorscriptexp=''
-version='5.31.1'
-version_patchlevel_string='version 31 subversion 1'
+version='5.31.2'
+version_patchlevel_string='version 31 subversion 2'
 versiononly='define'
 vi=''
 xlibpth='/usr/lib/386 /lib/386'
@@ -1216,10 +1216,10 @@ zcat=''
 zip='zip'
 PERL_REVISION=5
 PERL_VERSION=31
-PERL_SUBVERSION=1
+PERL_SUBVERSION=2
 PERL_API_REVISION=5
 PERL_API_VERSION=31
-PERL_API_SUBVERSION=1
+PERL_API_SUBVERSION=2
 PERL_PATCHLEVEL=''
 PERL_CONFIG_SH=true
 : Variables propagated from previous config.sh file.
index 5d6fdae..6a1e8dc 100644 (file)
  *     This symbol contains the ~name expanded version of ARCHLIB, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#define ARCHLIB "/opt/perl/lib/5.31.1/x86_64-linux"            /**/
-#define ARCHLIB_EXP "/opt/perl/lib/5.31.1/x86_64-linux"                /**/
+#define ARCHLIB "/opt/perl/lib/5.31.2/x86_64-linux"            /**/
+#define ARCHLIB_EXP "/opt/perl/lib/5.31.2/x86_64-linux"                /**/
 
 /* BIN:
  *     This symbol holds the path of the bin directory where the package will
  *     This symbol contains the ~name expanded version of PRIVLIB, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#define PRIVLIB "/opt/perl/lib/5.31.1"         /**/
-#define PRIVLIB_EXP "/opt/perl/lib/5.31.1"             /**/
+#define PRIVLIB "/opt/perl/lib/5.31.2"         /**/
+#define PRIVLIB_EXP "/opt/perl/lib/5.31.2"             /**/
 
 /* SITEARCH:
  *     This symbol contains the name of the private library for this package.
  *     This symbol contains the ~name expanded version of SITEARCH, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#define SITEARCH "/opt/perl/lib/site_perl/5.31.1/x86_64-linux"         /**/
-#define SITEARCH_EXP "/opt/perl/lib/site_perl/5.31.1/x86_64-linux"             /**/
+#define SITEARCH "/opt/perl/lib/site_perl/5.31.2/x86_64-linux"         /**/
+#define SITEARCH_EXP "/opt/perl/lib/site_perl/5.31.2/x86_64-linux"             /**/
 
 /* SITELIB:
  *     This symbol contains the name of the private library for this package.
  *     removed.  The elements in inc_version_list (inc_version_list.U) can
  *     be tacked onto this variable to generate a list of directories to search.
  */
-#define SITELIB "/opt/perl/lib/site_perl/5.31.1"               /**/
-#define SITELIB_EXP "/opt/perl/lib/site_perl/5.31.1"           /**/
+#define SITELIB "/opt/perl/lib/site_perl/5.31.2"               /**/
+#define SITELIB_EXP "/opt/perl/lib/site_perl/5.31.2"           /**/
 #define SITELIB_STEM "/opt/perl/lib/site_perl"         /**/
 
 /* PERL_VENDORARCH:
  *     script to make sure (one hopes) that it runs with perl and not
  *     some shell.
  */
-#define STARTPERL "#!/opt/perl/bin/perl5.31.1"         /**/
+#define STARTPERL "#!/opt/perl/bin/perl5.31.2"         /**/
 
 /* HAS_STDIO_STREAM_ARRAY:
  *     This symbol, if defined, tells that there is an array
 #define        USE_64_BIT_ALL          /**/
 #endif
 
-/* USE_CBACKTRACE:
+/* USE_C_BACKTRACE:
  *     This symbol, if defined, indicates that Perl should
  *     be built with support for backtrace.
  */
-/*#define USE_CBACKTRACE               / **/
+/*#define USE_C_BACKTRACE              / **/
 
 /* USE_DTRACE:
  *     This symbol, if defined, indicates that Perl should
index c7eabf7..117ade5 100644 (file)
@@ -17,23 +17,71 @@ Consult your favorite dictionary for details.
 
 =head1 EPIGRAPHS
 
+=head2 v5.31.1 - Kurt Vonnegut, _A Man without a Country_
+
+L<Announced on 2019-06-20 by Karen Etheridge|https://www.nntp.perl.org/group/perl.perl5.porters/2019/06/msg255243.html>
+
+On Tuesday, January 20, 2004, I sent Joel Bleifuss, my editor at _In These
+Times_, this fax:
+
+    ON ORANGE ALERT HERE.
+    ECONOMIC TERRORIST ATTACK
+    EXPECTED AT 8 PM EST. KV
+
+Worried, he called, asking what was up. I said I would tell him when I had
+more complete information on the bombs George Bush was set to deliver in his
+State of the Union address.
+
+That night I got a call from my friend, the out-of-print-science-fiction
+writer Kilgore Trout. He asked me, "Did you watch the State of the Union
+address?"
+
+"Yes, and it certainly helped to remember what the great British socialist
+playwright George Bernard Shaw said about this planet."
+
+"Which was?"
+
+"He said, 'I don't know if there are men on the moon, but if there are, they
+must be using the earth as their lunatic asylum.' And he wasn't talking
+about the germs or the elephants. He meant we the people."
+
+"Okay."
+
+"You don't think this is the Lunatic Asylum of the Universe?"
+
+"Kurt, I don't think I expressed an opinion one way of the other."
+
+"We are killing this planet as a life-support system with the poisons from
+all the thermodynamic whoopee we're making with atomic energy and fossil
+fuels, and everybody knows it, and practically nobody cares. This is how
+crazy we are. I think the planet's immune system is trying to get rid of us
+with AIDS and new strains of flu and tuberculosis, and so on. I think the
+planet should get rid of us. We're really awful animals. I mean, that dumb
+Barbra Streisand song, 'People who need people are the luckiest people in
+the world' -- she's talking about cannibals. Lots to eat. Yes, the planet is
+trying to get rid of us, but I think it's too late."
+
+And I said good-bye to my friend, hung up the phone, sat down and wrote this
+epitaph: "The good Earth -- we could have saved it, but we were too damn
+cheap and lazy."
+
 =head2 v5.31.0 - Fumiko Enchi, Masks
 
-Announced on 2019-05-22 by Sawyer X
+L<Announced on 2019-05-24 by Sawyer X|https://www.nntp.perl.org/group/perl.perl5.porters/2019/05/msg254886.html>
 
   The secrets inside her mind are like flowers in a garden at
   nighttime, filling the darkness with perfume.
 
 =head2 v5.30.0 - Morihei Ueshiba
 
-Announced on 2019-05-22 by Sawyer X
+L<Announced on 2019-05-22 by Sawyer X|https://www.nntp.perl.org/group/perl.perl5.porters/2019/05/msg254844.html>
 
   Life is growth. If we stop growing, technically and spiritually, we
   are as good as dead.
 
 =head2 v5.30.0-RC2 - Derek Walcott
 
-Announced on 2019-05-17 by Sawyer X
+L<Announced on 2019-05-17 by Sawyer X|https://www.nntp.perl.org/group/perl.perl5.porters/2019/05/msg254824.html>
 
   The truest writers are those who see language not as linguistic process but
   as a living element.
@@ -42,7 +90,7 @@ Announced on 2019-05-17 by Sawyer X
 
 =head2 v5.30.0-RC1 - Marcel Proust
 
-L<Announced on 2019-05-11 by Sawyer X|https://www.nntp.perl.org/group/perl.perl5.porters/2019/05/msg254750.html>
+L<Announced on 2019-05-11 by Sawyer X|https://www.nntp.perl.org/group/perl.perl5.porters/2019/05/msg254748.html>
 
   If a little dreaming is dangerous, the cure for it is not to dream
   less but to dream more, to dream all the time.
index 404b620..d9da713 100644 (file)
@@ -403,7 +403,7 @@ died, add a short obituary here.
 
 XXX Generate this with:
 
-  perl Porting/acknowledgements.pl v5.31.1..HEAD
+  perl Porting/acknowledgements.pl v5.31.2..HEAD
 
 =head1 Reporting Bugs
 
index 7efbe15..55b6267 100644 (file)
@@ -23,7 +23,7 @@ https://metacpan.org/pod/release/[AUTHOR]/perl-5.[VERSION.SUBVERSION]/pod/perlde
 [ACKNOWLEDGEMENTS SECTION FROM PERLDELTA]
 
 We expect to release version [NEXT BLEAD VERSION.SUBVERSION] on [FUTURE
-DATE].  The next major stable release of Perl 5, version 30.0, should
-appear in May 2019.
+DATE].  The next major stable release of Perl 5, version 32.0, should
+appear in May 2020.
 
 [YOUR SALUTATION HERE]
index 79f8b7c..484ac68 100644 (file)
@@ -436,8 +436,8 @@ When doing a BLEAD-POINT or BLEAD-FINAL release, also make sure the
 C<PERL_API_*> constants in F<patchlevel.h> are in sync with the version
 you're releasing, unless you're absolutely sure the release you're about to
 make is 100% binary compatible to an earlier release. Note: for BLEAD-POINT
-releases the bump should have already occured at the end of the previous release
-and this is somethig you would have to do at the very end.
+releases the bump should have already occurred at the end of the previous
+release and this is something you would have to do at the very end.
 When releasing a MAINT perl version, the C<PERL_API_*> constants C<MUST NOT>
 be changed as we aim to guarantee binary compatibility in maint branches.
 
@@ -750,6 +750,10 @@ formatting, e.g.
     $ ./perl -Ilib ext/Pod-Html/bin/pod2html pod/perldelta.pod > \
         ~/perldelta.html
 
+You can add pod links for RT references thusly:
+
+    $ perl -p -i -e'BEGIN{undef $/}; s{(\[perl\s+#)(\d+)\]}{L<$1$2\]|https://rt.perl.org/Ticket/Display.html?id=$2>}mg' pod/perldelta.pod
+
 If you make changes, be sure to commit them.
 
 =for checklist skip BLEAD-POINT MAINT RC
@@ -914,7 +918,7 @@ Then delete the temporary installation.
 
 Create the tag identifying this release (e.g.):
 
-    $ git tag v5.11.0 -m "First release of the v5.11 series!"
+    $ git tag v5.11.0 -m 'First release of the v5.11 series!'
 
 It is B<VERY> important that from this point forward, you not push
 your git changes to the Perl master repository.  If anything goes
@@ -1341,7 +1345,14 @@ in theory, only contain bug fixes but never regressions.))
 
 =head3 clean build and test
 
-Run a clean build and test to make sure nothing obvious is broken.
+Run a clean build and test to make sure nothing obvious is broken. This is
+very important, as commands run after this point must be run using the perl
+executable built with the bumped version number.
+
+ $ git clean -xdf
+ $ ./Configure -des -Dusedevel
+ $ make
+ $ make test
 
 In particular, F<Porting/perldelta_template.pod> is intentionally exempted
 from podchecker tests, to avoid false positives about placeholder text.
@@ -1495,10 +1506,6 @@ F<dist/Module-CoreList/Changes>.
 
 =item *
 
-Update F<pod/perldelta.pod> to mention the upgrade to Module::CoreList.
-
-=item *
-
 Remake perl to get your changed .pm files propagated into F<lib/> and
 then run at least the F<dist/Module-CoreList/t/*.t> tests and the
 test_porting makefile target to check that they're ok.
index 3670ab4..c0b3350 100644 (file)
@@ -57,7 +57,7 @@ you should reset the version numbers to the next blead series.
 =head2 Perl 5.31
 
   2019-05-23  5.31.0 âœ“       Sawyer X
-  2019-06-20  5.31.1
+  2019-06-20  5.31.1 âœ“       Karen Etheridge
   2019-07-20  5.31.2
   2019-08-20  5.31.3
   2019-09-20  5.31.4
index fbab797..da683ca 100644 (file)
@@ -22,9 +22,9 @@ The build procedure is completely standard:
 Make perl executable and create a symlink for libperl:
 
   chmod a+x /boot/common/bin/perl
-  cd /boot/common/lib; ln -s perl5/5.31.1/BePC-haiku/CORE/libperl.so .
+  cd /boot/common/lib; ln -s perl5/5.31.2/BePC-haiku/CORE/libperl.so .
 
-Replace C<5.31.1> with your respective version of Perl.
+Replace C<5.31.2> with your respective version of Perl.
 
 =head1 KNOWN PROBLEMS
 
index 029d5e1..a13035c 100644 (file)
@@ -10,9 +10,9 @@ perlmacosx - Perl under Mac OS X
 
 This document briefly describes Perl under Mac OS X.
 
-  curl -O http://www.cpan.org/src/perl-5.31.1.tar.gz
-  tar -xzf perl-5.31.1.tar.gz
-  cd perl-5.31.1
+  curl -O http://www.cpan.org/src/perl-5.31.2.tar.gz
+  tar -xzf perl-5.31.2.tar.gz
+  cd perl-5.31.2
   ./Configure -des -Dprefix=/usr/local/
   make
   make test
@@ -20,7 +20,7 @@ This document briefly describes Perl under Mac OS X.
 
 =head1 DESCRIPTION
 
-The latest Perl release (5.31.1 as of this writing) builds without changes
+The latest Perl release (5.31.2 as of this writing) builds without changes
 under all versions of Mac OS X from 10.3 "Panther" onwards. 
 
 In order to build your own version of Perl you will need 'make',
index 5c84afc..d7b52b2 100644 (file)
@@ -619,7 +619,7 @@ C<set PERLLIB_PREFIX> in F<Config.sys>, see L</"C<PERLLIB_PREFIX>">.
 
 =item Additional Perl modules
 
-  unzip perl_ste.zip -d f:/perllib/lib/site_perl/5.31.1/
+  unzip perl_ste.zip -d f:/perllib/lib/site_perl/5.31.2/
 
 Same remark as above applies.  Additionally, if this directory is not
 one of directories on @INC (and @INC is influenced by C<PERLLIB_PREFIX>), you
index c3f29c3..752427b 100644 (file)
@@ -142,11 +142,11 @@ You may need to set up a foreign symbol for the unpacking utility of
 choice.  Once you have done so, use a command like the following to
 unpack the archive:
 
-    vmstar -xvf perl-5^.31^.1.tar
+    vmstar -xvf perl-5^.31^.2.tar
 
 Then set default to the top-level source directory like so:
 
-    set default [.perl-5^.31^.1]
+    set default [.perl-5^.31^.2]
 
 and proceed with configuration as described in the next section.
 
diff --git a/XSUB.h b/XSUB.h
index 7c0aebd..1a497c2 100644 (file)
--- a/XSUB.h
+++ b/XSUB.h
@@ -47,7 +47,7 @@ XSUB's aliases was used to invoke it.  See L<perlxs/"The ALIAS: Keyword">.
 =for apidoc Am|SV*|ST|int ix
 Used to access elements on the XSUB's stack.
 
-=for apidoc AmU||XS
+=for apidoc AmnU||XS
 Macro to declare an XSUB and its C parameter list.  This is handled by
 C<xsubpp>.  It is the same as using the more explicit C<XS_EXTERNAL> macro.
 
@@ -56,7 +56,7 @@ Macro to declare an XSUB and its C parameter list without exporting the symbols.
 This is handled by C<xsubpp> and generally preferable over exporting the XSUB
 symbols unnecessarily.
 
-=for apidoc AmU||XS_EXTERNAL
+=for apidoc AmnU||XS_EXTERNAL
 Macro to declare an XSUB and its C parameter list explicitly exporting the symbols.
 
 =for apidoc Amns||dAX
@@ -85,7 +85,7 @@ Sets up any variable needed by the C<UNDERBAR> macro.  It used to define
 C<padoff_du>, but it is currently a noop.  However, it is strongly advised
 to still use it for ensuring past and future compatibility.
 
-=for apidoc AmU||UNDERBAR
+=for apidoc AmnU||UNDERBAR
 The SV* corresponding to the C<$_> variable.  Works even if there
 is a lexical C<$_> in scope.
 
@@ -263,7 +263,7 @@ Return an empty list from an XSUB immediately.
 Used by C<xsubpp> to hook up XSUBs as Perl subs.  Adds Perl prototypes to
 the subs.
 
-=for apidoc AmU||XS_VERSION
+=for apidoc AmnU||XS_VERSION
 The version identifier for an XS module.  This is usually
 handled automatically by C<ExtUtils::MakeMaker>.  See
 C<L</XS_VERSION_BOOTCHECK>>.
@@ -283,13 +283,13 @@ matches the api version of the perl interpreter it's being loaded into.
 Set up necessary local variables for exception handling.
 See L<perlguts/"Exception Handling">.
 
-=for apidoc AmU||XCPT_TRY_START
+=for apidoc AmnU||XCPT_TRY_START
 Starts a try block.  See L<perlguts/"Exception Handling">.
 
-=for apidoc AmU||XCPT_TRY_END
+=for apidoc AmnU||XCPT_TRY_END
 Ends a try block.  See L<perlguts/"Exception Handling">.
 
-=for apidoc AmU||XCPT_CATCH
+=for apidoc AmnU||XCPT_CATCH
 Introduces a catch block.  See L<perlguts/"Exception Handling">.
 
 =for apidoc Amns||XCPT_RETHROW
index 919da5e..c72861a 100644 (file)
@@ -111,6 +111,14 @@ HDR_DOC:
             my $proto = $proto_in_file;
             $proto = "||$proto" unless $proto =~ /\|/;
             my($flags, $ret, $name, @args) = split /\s*\|\s*/, $proto;
+            $name or die <<EOS;
+Bad apidoc at $file line $.:
+  $in
+Expected:
+  =for apidoc flags|returntype|name|arg|arg|...
+  =for apidoc flags|returntype|name
+  =for apidoc name
+EOS
             warn ("'$name' not \\w+ in '$proto_in_file' in $file")
                         if $flags !~ /N/ && $name !~ / ^ [_[:alpha:]] \w* $ /x;
             my $docs = "";
diff --git a/av.c b/av.c
index 918844c..f10f124 100644 (file)
--- a/av.c
+++ b/av.c
@@ -356,8 +356,8 @@ Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val)
        }
        AvFILLp(av) = key;
     }
-    else if (AvREAL(av))
-       SvREFCNT_dec(ary[key]);
+    else if (AvREAL(av) && LIKELY(ary[key] != val))
+        SvREFCNT_dec(ary[key]);
     ary[key] = val;
     if (SvSMAGICAL(av)) {
        const MAGIC *mg = SvMAGIC(av);
diff --git a/av.h b/av.h
index 7cb63b4..72267d6 100644 (file)
--- a/av.h
+++ b/av.h
@@ -39,7 +39,7 @@ struct xpvav {
 /*
 =head1 Handy Values
 
-=for apidoc AmU||Nullav
+=for apidoc ADmnU||Nullav
 Null AV pointer.
 
 (deprecated - use C<(AV *)NULL> instead)
index 2028430..2f5feb5 100644 (file)
@@ -395301,7 +395301,7 @@ static const U8 WB_table[23][23] = {
  * 78e2600e24fa7d5ab62117de50b382f8b31b08401c37a0782c38dacb340b64e7 lib/unicore/extracted/DLineBreak.txt
  * 1bde4ad73e271c6349fbd1972e54f38bba5cc1900c28f678e79b9e8909b31793 lib/unicore/extracted/DNumType.txt
  * 6278722699123f3890e4b1cc42011e96d8960e4958a3b93484361530983d2611 lib/unicore/extracted/DNumValues.txt
- * a53648677d262457dda0b22efba8820d2a45ca6ebae01f8c73d30db380eb83b5 lib/unicore/mktables
+ * a74b5e334b78d45bfc61718c8ef302d19884bdcfe348d0f24ddcbf4fa0a17118 lib/unicore/mktables
  * a712c758275b460d18fa77a26ed3589689bb3f69dcc1ea99b913e32db92a5cd2 lib/unicore/version
  * 2680b9254eb236c5c090f11b149605043e8c8433661b96efc4a42fb4709342a5 regen/charset_translations.pl
  * 03e51b0f07beebd5da62ab943899aa4934eee1f792fa27c1fb638c33bf4ac6ea regen/mk_PL_charclass.pl
index ef135e2..e776983 100755 (executable)
@@ -4231,11 +4231,11 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
 #$use64bitall  USE_64_BIT_ALL          /**/
 #endif
 
-/* USE_CBACKTRACE:
+/* USE_C_BACKTRACE:
  *     This symbol, if defined, indicates that Perl should
  *     be built with support for backtrace.
  */
-#$usecbacktrace USE_CBACKTRACE         /**/
+#$usecbacktrace USE_C_BACKTRACE                /**/
 
 /* USE_DTRACE:
  *     This symbol, if defined, indicates that Perl should
index 1f3e73c..dc251df 100644 (file)
@@ -49,7 +49,7 @@ $ unlink_all_versions = "n"
 $ builder = "MMK"
 $ use_vmsdebug_perl = "n"
 $ use64bitall = "n"
-$ use64bitint = "n"
+$ use64bitint = "y"
 $ uselongdouble = "n"
 $ uselargefiles = "y"
 $ usestdstat = "n"
diff --git a/cop.h b/cop.h
index fca2aa7..243f700 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -922,27 +922,27 @@ struct context {
 */
 
 /*
-=for apidoc AmU||G_SCALAR
+=for apidoc AmnU||G_SCALAR
 Used to indicate scalar context.  See C<L</GIMME_V>>, C<L</GIMME>>, and
 L<perlcall>.
 
-=for apidoc AmU||G_ARRAY
+=for apidoc AmnU||G_ARRAY
 Used to indicate list context.  See C<L</GIMME_V>>, C<L</GIMME>> and
 L<perlcall>.
 
-=for apidoc AmU||G_VOID
+=for apidoc AmnU||G_VOID
 Used to indicate void context.  See C<L</GIMME_V>> and L<perlcall>.
 
-=for apidoc AmU||G_DISCARD
+=for apidoc AmnU||G_DISCARD
 Indicates that arguments returned from a callback should be discarded.  See
 L<perlcall>.
 
-=for apidoc AmU||G_EVAL
+=for apidoc AmnU||G_EVAL
 
 Used to force a Perl C<eval> wrapper around a callback.  See
 L<perlcall>.
 
-=for apidoc AmU||G_NOARGS
+=for apidoc AmnU||G_NOARGS
 
 Indicates that no arguments are being sent to a callback.  See
 L<perlcall>.
@@ -956,23 +956,24 @@ L<perlcall>.
 #define G_WANT         3
 
 /* extra flags for Perl_call_* routines */
-#define G_DISCARD      4       /* Call FREETMPS.
+#define G_DISCARD         0x4  /* Call FREETMPS.
                                   Don't change this without consulting the
                                   hash actions codes defined in hv.h */
-#define G_EVAL         8       /* Assume eval {} around subroutine call. */
-#define G_NOARGS       16      /* Don't construct a @_ array. */
-#define G_KEEPERR      32      /* Warn for errors, don't overwrite $@ */
-#define G_NODEBUG      64      /* Disable debugging at toplevel.  */
-#define G_METHOD      128       /* Calling method. */
-#define G_FAKINGEVAL  256      /* Faking an eval context for call_sv or
+#define G_EVAL           0x8   /* Assume eval {} around subroutine call. */
+#define G_NOARGS         0x10  /* Don't construct a @_ array. */
+#define G_KEEPERR        0x20  /* Warn for errors, don't overwrite $@ */
+#define G_NODEBUG        0x40  /* Disable debugging at toplevel.  */
+#define G_METHOD         0x80   /* Calling method. */
+#define G_FAKINGEVAL    0x100  /* Faking an eval context for call_sv or
                                   fold_constants. */
-#define G_UNDEF_FILL  512      /* Fill the stack with &PL_sv_undef
+#define G_UNDEF_FILL    0x200  /* Fill the stack with &PL_sv_undef
                                   A special case for UNSHIFT in
                                   Perl_magic_methcall().  */
-#define G_WRITING_TO_STDERR 1024 /* Perl_write_to_stderr() is calling
+#define G_WRITING_TO_STDERR 0x400 /* Perl_write_to_stderr() is calling
                                    Perl_magic_methcall().  */
-#define G_RE_REPARSING 0x800     /* compiling a run-time /(?{..})/ */
-#define G_METHOD_NAMED 4096    /* calling named method, eg without :: or ' */
+#define G_RE_REPARSING  0x800   /* compiling a run-time /(?{..})/ */
+#define G_METHOD_NAMED 0x1000  /* calling named method, eg without :: or ' */
+#define G_RETHROW      0x2000  /* eval_sv(): re-throw any error */
 
 /* flag bits for PL_in_eval */
 #define EVAL_NULL      0       /* not in an eval */
@@ -1101,7 +1102,7 @@ typedef struct stackinfo PERL_SI;
 =for apidoc Amns||dMULTICALL
 Declare local variables for a multicall.  See L<perlcall/LIGHTWEIGHT CALLBACKS>.
 
-=for apidoc Amns||PUSH_MULTICALL
+=for apidoc Ams||PUSH_MULTICALL|CV* the_cv
 Opening bracket for a lightweight callback.
 See L<perlcall/LIGHTWEIGHT CALLBACKS>.
 
index 42cdd59..88ed295 100644 (file)
@@ -19,7 +19,7 @@ BEGIN {
                         $HAVE_MONOTONIC
                     ];
 
-    $VERSION        = '1.02';
+    $VERSION        = '1.04';
     $VERBOSE        = 0;
     $DEBUG          = 0;
     $WARN           = 1;
@@ -1204,7 +1204,7 @@ sub run_forked {
       # which do setsid theirselves -- can't do anything
       # with those)
 
-      POSIX::setsid() || Carp::confess("Error running setsid: " . $!);
+      POSIX::setsid() == -1 and Carp::confess("Error running setsid: " . $!);
 
       if ($opts->{'child_BEGIN'} && ref($opts->{'child_BEGIN'}) eq 'CODE') {
         $opts->{'child_BEGIN'}->();
index 5f956b1..72b9db7 100644 (file)
@@ -3,6 +3,7 @@
 BEGIN { pop @INC if $INC[-1] eq '.' }
 use strict;
 use Getopt::Long;
+use Encode ();
 
 use JSON::PP ();
 
@@ -42,10 +43,17 @@ for my $opt (split /,/, $json_opt) {
 my %F = (
    'json' => sub {
       my $json = JSON::PP->new;
+      my $enc =
+         /^\x00\x00\x00/s  ? "utf-32be"
+       : /^\x00.\x00/s     ? "utf-16be"
+       : /^.\x00\x00\x00/s ? "utf-32le"
+       : /^.\x00.\x00/s    ? "utf-16le"
+       :                     "utf-8";
       for my $key (keys %json_opt) {
+        next if $key eq 'utf8';
         $json->$key($json_opt{$key});
       }
-      $json->decode( $_ );
+      $json->decode( Encode::decode($enc, $_) );
    },
    'eval' => sub {
         my $v = eval "no strict;\n#line 1 \"input\"\n$_";
@@ -84,8 +92,11 @@ $F{$opt_from}
 $T{$opt_to}
    or die "$opt_from: not a valid toformat\n";
 
-local $/;
-$_ = <STDIN>;
+{
+  local $/;
+  binmode STDIN;
+  $_ = <STDIN>;
+}
 
 $_ = $F{$opt_from}->();
 $_ = $T{$opt_to}->();
@@ -163,7 +174,7 @@ options to JSON::PP
 Acceptable options are:
 
     ascii latin1 utf8 pretty indent space_before space_after relaxed canonical allow_nonref
-    allow_singlequote allow_barekey allow_bignum loose escape_slash
+    allow_singlequote allow_barekey allow_bignum loose escape_slash indent_length
 
 Multiple options must be separated by commas:
 
index d8b7ab3..9f08354 100644 (file)
@@ -14,7 +14,7 @@ use JSON::PP::Boolean;
 use Carp ();
 #use Devel::Peek;
 
-$JSON::PP::VERSION = '4.02';
+$JSON::PP::VERSION = '4.04';
 
 @JSON::PP::EXPORT = qw(encode_json decode_json from_json to_json);
 
@@ -1773,7 +1773,7 @@ JSON::PP - JSON::XS compatible pure-Perl module.
 
 =head1 VERSION
 
-    4.02
+    4.04
 
 =head1 DESCRIPTION
 
index 8b98c95..8ef6949 100644 (file)
@@ -10,7 +10,7 @@ overload::import('overload',
     fallback => 1,
 );
 
-$JSON::PP::Boolean::VERSION = '4.02';
+$JSON::PP::Boolean::VERSION = '4.04';
 
 1;
 
index 8d09c25..4d75702 100644 (file)
@@ -18,7 +18,7 @@ use vars qw(
 );
 
 @ISA = ('Pod::Simple::BlackBox');
-$VERSION = '3.38';
+$VERSION = '3.39';
 
 @Known_formatting_codes = qw(I B C L E F S X Z); 
 %Known_formatting_codes = map(($_=>1), @Known_formatting_codes);
index 67a18df..6ad790f 100644 (file)
@@ -19,7 +19,11 @@ Be sure to read L</ENCODING> if your Pod contains non-ASCII characters.
 Pod formatters can use Pod::Simple to parse Pod documents and render them into
 plain text, HTML, or any number of other formats. Typically, such formatters
 will be subclasses of Pod::Simple, and so they will inherit its methods, like
-C<parse_file>.
+C<parse_file>.  But note that Pod::Simple doesn't understand and
+properly parse Perl itself, so if you have a file which contains a Perl
+program that has a multi-line quoted string which has lines that look
+like pod, Pod::Simple will treat them as pod.  This can be avoided if
+the file makes these into indented here documents instead.
 
 If you're reading this document just because you have a Pod-processing
 subclass that you want to use, this document (plus the documentation for the
@@ -390,8 +394,8 @@ This module is managed in an open GitHub repository,
 L<https://github.com/perl-pod/pod-simple/>. Feel free to fork and contribute, or
 to clone L<git://github.com/perl-pod/pod-simple.git> and send patches!
 
-Patches against Pod::Simple are welcome. Please send bug reports to
-<bug-pod-simple@rt.cpan.org>.
+Please use L<https://github.com/perl-pod/pod-simple/issues/new> to file a bug
+report.
 
 =head1 COPYRIGHT AND DISCLAIMERS
 
@@ -419,6 +423,8 @@ Pod::Simple is maintained by:
 
 =item * David E. Wheeler C<dwheeler@cpan.org>
 
+=item * Karl Williamson C<khw@cpan.org>
+
 =back
 
 Documentation has been contributed by:
index af736f8..6411cfe 100644 (file)
@@ -22,7 +22,7 @@ use integer; # vroom!
 use strict;
 use Carp ();
 use vars qw($VERSION );
-$VERSION = '3.38';
+$VERSION = '3.39';
 #use constant DEBUG => 7;
 
 sub my_qr ($$) {
@@ -100,6 +100,11 @@ if (($] ge 5.007_003)) {
   $utf8_bom = "\xEF\xBB\xBF";   # No EBCDIC BOM detection for early Perls.
 }
 
+# This is used so that the 'content_seen' method doesn't return true on a
+# file that just happens to have a line that matches /^=[a-zA-z]/.  Only if
+# there is a valid =foo line will we return that content was seen.
+my $seen_legal_directive = 0;
+
 #@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 
 sub parse_line { shift->parse_lines(@_) } # alias
@@ -859,6 +864,10 @@ sub _ponder_paragraph_buffer {
 
   my($para, $para_type);
   while(@$paras) {
+
+    # If a directive, assume it's legal; subtract below if found not to be
+    $seen_legal_directive++ if $paras->[0][0] =~ /^=/;
+
     last if      @$paras == 1
             and (    $paras->[0][0] eq '=over'
                  or  $paras->[0][0] eq '=item'
@@ -1148,6 +1157,7 @@ sub _ponder_paragraph_buffer {
         DEBUG > 1 and print STDERR " Pondering known directive ${$para}[0] as $para_type\n";
       } else {
         # An unknown directive!
+        $seen_legal_directive--;
         DEBUG > 1 and printf STDERR "Unhandled directive %s (Handled: %s)\n",
          $para->[0], join(' ', sort keys %{$self->{'accept_directives'}} )
         ;
@@ -1208,7 +1218,8 @@ sub _ponder_paragraph_buffer {
       DEBUG and print STDERR "\n", pretty($para), "\n";
 
       # traverse the treelet (which might well be just one string scalar)
-      $self->{'content_seen'} ||= 1;
+      $self->{'content_seen'} ||= 1 if   $seen_legal_directive
+                                    && ! $self->{'~tried_gen_errata'};
       $self->_traverse_treelet_bit(@$para);
     }
   }
@@ -1336,7 +1347,7 @@ sub _ponder_begin {
   if(!$dont_ignore or scalar grep $_->[1]{'~ignore'}, @$curr_open) {
     DEBUG > 1 and print STDERR "Ignoring ignorable =begin\n";
   } else {
-    $self->{'content_seen'} ||= 1;
+    $self->{'content_seen'} ||= 1 unless $self->{'~tried_gen_errata'};
     $self->_handle_element_start((my $scratch='for'), $para->[1]);
   }
 
@@ -1404,7 +1415,7 @@ sub _ponder_end {
     $curr_open->[-1][1]{'start_line'} = $para->[1]{'start_line'};
       # what's that for?
 
-    $self->{'content_seen'} ||= 1;
+    $self->{'content_seen'} ||= 1 unless $self->{'~tried_gen_errata'};
     $self->_handle_element_end( my $scratch = 'for', $para->[1]);
   }
   DEBUG > 1 and print STDERR "Popping $curr_open->[-1][0] $curr_open->[-1][1]{'target'} because of =end $content\n";
@@ -1468,7 +1479,7 @@ sub _ponder_pod {
 
   # The surrounding methods set content_seen, so let us remain consistent.
   # I do not know why it was not here before -- should it not be here?
-  # $self->{'content_seen'} ||= 1;
+  # $self->{'content_seen'} ||= 1 unless $self->{'~tried_gen_errata'};
 
   return;
 }
@@ -1526,7 +1537,7 @@ sub _ponder_over {
   }
   DEBUG > 1 and print STDERR "=over found of type $list_type\n";
 
-  $self->{'content_seen'} ||= 1;
+  $self->{'content_seen'} ||= 1 unless $self->{'~tried_gen_errata'};
   $self->_handle_element_start((my $scratch = 'over-' . $list_type), $para->[1]);
 
   return;
@@ -1548,7 +1559,7 @@ sub _ponder_back {
     DEBUG > 1 and print STDERR "=back happily closes matching =over\n";
     # Expected case: we're closing the most recently opened thing
     #my $over = pop @$curr_open;
-    $self->{'content_seen'} ||= 1;
+    $self->{'content_seen'} ||= 1 unless $self->{'~tried_gen_errata'};
     $self->_handle_element_end( my $scratch =
       'over-' . ( (pop @$curr_open)->[1]{'~type'} ), $para->[1]
     );
index 54d10e3..23d1bb9 100644 (file)
@@ -9,7 +9,7 @@ use Carp ();
 use Pod::Simple::Methody ();
 use Pod::Simple ();
 use vars qw( @ISA $VERSION );
-$VERSION = '3.38';
+$VERSION = '3.39';
 @ISA = ('Pod::Simple::Methody');
 BEGIN { *DEBUG = defined(&Pod::Simple::DEBUG)
           ? \&Pod::Simple::DEBUG
index 444651f..04d80ee 100644 (file)
@@ -2,7 +2,7 @@ require 5;
 package Pod::Simple::Debug;
 use strict;
 use vars qw($VERSION );
-$VERSION = '3.38';
+$VERSION = '3.39';
 
 sub import {
   my($value,$variable);
index 3b45466..2357b5a 100644 (file)
@@ -1,7 +1,7 @@
 
 require 5;
 package Pod::Simple::DumpAsText;
-$VERSION = '3.38';
+$VERSION = '3.39';
 use Pod::Simple ();
 BEGIN {@ISA = ('Pod::Simple')}
 
index c7a379f..cf7ff7b 100644 (file)
@@ -1,7 +1,7 @@
 
 require 5;
 package Pod::Simple::DumpAsXML;
-$VERSION = '3.38';
+$VERSION = '3.39';
 use Pod::Simple ();
 BEGIN {@ISA = ('Pod::Simple')}
 
index 95b2eb1..72a89c5 100644 (file)
@@ -9,7 +9,7 @@ use vars qw(
   $Doctype_decl  $Content_decl
 );
 @ISA = ('Pod::Simple::PullParser');
-$VERSION = '3.38';
+$VERSION = '3.39';
 BEGIN {
   if(defined &DEBUG) { } # no-op
   elsif( defined &Pod::Simple::DEBUG ) { *DEBUG = \&Pod::Simple::DEBUG }
index 633d41b..93b6983 100644 (file)
@@ -5,7 +5,7 @@ use strict;
 use vars qw( $VERSION $HTML_RENDER_CLASS $HTML_EXTENSION
  $CSS $JAVASCRIPT $SLEEPY $SEARCH_CLASS @ISA
 );
-$VERSION = '3.38';
+$VERSION = '3.39';
 @ISA = ();  # Yup, we're NOT a subclass of Pod::Simple::HTML!
 
 # TODO: nocontents stylesheets. Strike some of the color variations?
index d29aaed..674a92d 100644 (file)
@@ -6,7 +6,7 @@ package Pod::Simple::LinkSection;
 use strict;
 use Pod::Simple::BlackBox;
 use vars qw($VERSION );
-$VERSION = '3.38';
+$VERSION = '3.39';
 
 use overload( # So it'll stringify nice
   '""'   => \&Pod::Simple::BlackBox::stringify_lol,
index 75e3137..b497884 100644 (file)
@@ -4,7 +4,7 @@ package Pod::Simple::Methody;
 use strict;
 use Pod::Simple ();
 use vars qw(@ISA $VERSION);
-$VERSION = '3.38';
+$VERSION = '3.39';
 @ISA = ('Pod::Simple');
 
 # Yes, we could use named variables, but I want this to be impose
index 89280a5..9e5078d 100644 (file)
@@ -1,7 +1,7 @@
 
 require 5;
 package Pod::Simple::Progress;
-$VERSION = '3.38';
+$VERSION = '3.39';
 use strict;
 
 # Objects of this class are used for noting progress of an
index c2279ee..3428d46 100644 (file)
@@ -1,6 +1,6 @@
 require 5;
 package Pod::Simple::PullParser;
-$VERSION = '3.38';
+$VERSION = '3.39';
 use Pod::Simple ();
 BEGIN {@ISA = ('Pod::Simple')}
 
index 7c0d6cf..ca530f5 100644 (file)
@@ -5,7 +5,7 @@ use Pod::Simple::PullParserToken ();
 use strict;
 use vars qw(@ISA $VERSION);
 @ISA = ('Pod::Simple::PullParserToken');
-$VERSION = '3.38';
+$VERSION = '3.39';
 
 sub new {  # Class->new(tagname);
   my $class = shift;
index 0aae62f..8224e20 100644 (file)
@@ -5,7 +5,7 @@ use Pod::Simple::PullParserToken ();
 use strict;
 use vars qw(@ISA $VERSION);
 @ISA = ('Pod::Simple::PullParserToken');
-$VERSION = '3.38';
+$VERSION = '3.39';
 
 sub new {  # Class->new(tagname, optional_attrhash);
   my $class = shift;
index 52d8e64..4319d70 100644 (file)
@@ -5,7 +5,7 @@ use Pod::Simple::PullParserToken ();
 use strict;
 use vars qw(@ISA $VERSION);
 @ISA = ('Pod::Simple::PullParserToken');
-$VERSION = '3.38';
+$VERSION = '3.39';
 
 sub new {  # Class->new(text);
   my $class = shift;
index 2983972..5268c1f 100644 (file)
@@ -3,7 +3,7 @@ require 5;
 package Pod::Simple::PullParserToken;
  # Base class for tokens gotten from Pod::Simple::PullParser's $parser->get_token
 @ISA = ();
-$VERSION = '3.38';
+$VERSION = '3.39';
 use strict;
 
 sub new {  # Class->new('type', stuff...);  ## Overridden in derived classes anyway
index 2ebc4a7..f589183 100644 (file)
@@ -8,7 +8,7 @@ package Pod::Simple::RTF;
 
 use strict;
 use vars qw($VERSION @ISA %Escape $WRAP %Tagmap);
-$VERSION = '3.38';
+$VERSION = '3.39';
 use Pod::Simple::PullParser ();
 BEGIN {@ISA = ('Pod::Simple::PullParser')}
 
index 094038c..526b63b 100644 (file)
@@ -3,7 +3,7 @@ package Pod::Simple::Search;
 use strict;
 
 use vars qw($VERSION $MAX_VERSION_WITHIN $SLEEPY);
-$VERSION = '3.38';   ## Current version of this package
+$VERSION = '3.39';   ## Current version of this package
 
 BEGIN { *DEBUG = sub () {0} unless defined &DEBUG; }   # set DEBUG level
 use Carp ();
index eba922d..d2c6eb8 100644 (file)
@@ -5,7 +5,7 @@ use strict;
 use Carp ();
 use Pod::Simple ();
 use vars qw( $ATTR_PAD @ISA $VERSION $SORT_ATTRS);
-$VERSION = '3.38';
+$VERSION = '3.39';
 BEGIN {
   @ISA = ('Pod::Simple');
   *DEBUG = \&Pod::Simple::DEBUG unless defined &DEBUG;
index a555d26..9209b6e 100644 (file)
@@ -6,7 +6,7 @@ use Carp ();
 use Pod::Simple::Methody ();
 use Pod::Simple ();
 use vars qw( @ISA $VERSION $FREAKYMODE);
-$VERSION = '3.38';
+$VERSION = '3.39';
 @ISA = ('Pod::Simple::Methody');
 BEGIN { *DEBUG = defined(&Pod::Simple::DEBUG)
           ? \&Pod::Simple::DEBUG
index 1843e69..74f7367 100644 (file)
@@ -6,7 +6,7 @@ use strict;
 use Carp ();
 use Pod::Simple ();
 use vars qw( @ISA $VERSION );
-$VERSION = '3.38';
+$VERSION = '3.39';
 @ISA = ('Pod::Simple');
 
 sub new {
index 1b4063e..d2cdde7 100644 (file)
@@ -4,7 +4,7 @@ package Pod::Simple::TiedOutFH;
 use Symbol ('gensym');
 use Carp ();
 use vars qw($VERSION );
-$VERSION = '3.38';
+$VERSION = '3.39';
 
 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
index 6829046..7f003c8 100644 (file)
@@ -3,7 +3,7 @@ require 5;
 package Pod::Simple::Transcode;
 use strict;
 use vars qw($VERSION @ISA);
-$VERSION = '3.38';
+$VERSION = '3.39';
 
 BEGIN {
   if(defined &DEBUG) {;} # Okay
index d0b8b44..d8d0914 100644 (file)
@@ -5,7 +5,7 @@ require 5;
 package Pod::Simple::TranscodeDumb;
 use strict;
 use vars qw($VERSION %Supported);
-$VERSION = '3.38';
+$VERSION = '3.39';
 # This module basically pretends it knows how to transcode, except
 #  only for null-transcodings!  We use this when Encode isn't
 #  available.
index f7b8a83..6deb9e7 100644 (file)
@@ -9,7 +9,7 @@ use strict;
 use Pod::Simple;
 require Encode;
 use vars qw($VERSION );
-$VERSION = '3.38';
+$VERSION = '3.39';
 
 sub is_dumb  {0}
 sub is_smart {1}
index bbd3880..e10b373 100644 (file)
@@ -45,7 +45,7 @@ declare the output character set as UTF-8 before parsing, like so:
 package Pod::Simple::XHTML;
 use strict;
 use vars qw( $VERSION @ISA $HAS_HTML_ENTITIES );
-$VERSION = '3.38';
+$VERSION = '3.39';
 use Pod::Simple::Methody ();
 @ISA = ('Pod::Simple::Methody');
 
index 7d40521..17c0e02 100644 (file)
@@ -5,7 +5,7 @@ use strict;
 use Carp ();
 use Pod::Simple ();
 use vars qw( $ATTR_PAD @ISA $VERSION $SORT_ATTRS);
-$VERSION = '3.38';
+$VERSION = '3.39';
 BEGIN {
   @ISA = ('Pod::Simple');
   *DEBUG = \&Pod::Simple::DEBUG unless defined &DEBUG;
index 97833b7..fa2ffbc 100644 (file)
@@ -63,7 +63,7 @@ foreach my $file (@test_files) {
   $parser->complain_stderr(0);
 
   my $input;
-  open( IN , '<' , $file ) or die "$file: $!";
+  open( IN , '<:raw' , $file ) or die "$file: $!";
   $input .= $_ while (<IN>);
   close( IN );
 
diff --git a/cv.h b/cv.h
index d50e320..35751eb 100644 (file)
--- a/cv.h
+++ b/cv.h
@@ -18,7 +18,7 @@ struct xpvcv {
 /*
 =head1 Handy Values
 
-=for apidoc AmU||Nullcv
+=for apidoc ADmnU||Nullcv
 Null CV pointer.
 
 (deprecated - use C<(CV *)NULL> instead)
index 7c2064a..6eac8c8 100644 (file)
@@ -17,6 +17,7 @@ require 5.003;
 
 use strict;
 use ExtUtils::MakeMaker;
+use Config;
 
 use vars '%opt';  # needs to be global, and we can't use 'our'
 
@@ -47,6 +48,7 @@ sub configure
     'ppport_h.PL'  => 'ppport.h',
     'PPPort_pm.PL' => 'PPPort.pm',
     'RealPPPort_xs.PL' => 'RealPPPort.xs',
+    'mktests.PL' => 't/01_test.t',
   );
   my @moreopts;
 
@@ -85,6 +87,12 @@ sub configure
   die 'failed to extract $VERSION from PPPort_pm.PL' if not $version;
   close FH;
 
+  if ($Config{gccversion}) {
+    my $define = '-W -Wall';
+    $define .= ' -Wdeclaration-after-statement' if $Config{gccversion} =~ /^(\d+\.\d+)\./ && $1 >= 3.4;
+    push @moreopts, DEFINE => $define;
+  }
+
   return {
     C        => \@C_FILES,
     XS       => { 'RealPPPort.xs' => 'RealPPPort.c' },
@@ -141,6 +149,36 @@ POSTAMBLE
   return $post;
 }
 
+sub MY::processPL
+{
+  package MY;
+  my $original = shift->SUPER::processPL(@_);
+
+  require "./parts/ppptools.pl";
+  my $includes = join ' ', all_files_in_dir('parts/inc');
+
+  my $updated = '';
+  my @rules = split( m{^\s*$}m, $original );
+  foreach my $rule ( @rules ) {
+    if ( $rule =~ m{^\s*^PPPort\.pm\s+:}m ) {
+      $rule =~ s{^(\s*^PPPort\.pm\s+:.*)}{$1 $includes}m; # PPPort.pm depends on all files from parts/inc
+      $rule =~ s{pm_to_blib}{}m; # PPPort.pm must not depend on built PPPort.pm in blib/
+    } elsif ( $rule =~ m{^\s*^ppport\.h\s+:}m ) {
+      $rule =~ s{^(\s*^ppport\.h\s+:.*)}{$1 PPPort.pm}m; # ppport.h depends on PPPort.pm
+      $rule =~ s{pm_to_blib}{}m; # ppport.h is used to build RealPPPort.xs so cannot depend on built PPPort in blib/
+    } elsif ( $rule =~ m{^\s*^RealPPPort\.xs\s+:}m ) {
+      $rule =~ s{^(\s*^RealPPPort\.xs\s+:.*)}{$1 ppport.h}m; # RealPPPort.xs depends on ppport.h
+      $rule =~ s{pm_to_blib}{}m; # RealPPPort.xs is used to build PPPort binary, so it cannot depend on it
+    } elsif ( $rule =~ m{^\s*\S+\b01_test\.t\s+:}m ) {
+      $rule =~ s{^(\s*^\S+\b01_test\.t\s+:.*)}{$1 $includes}m; # all tests in t/ depends on all files from parts/inc
+      $rule =~ s{pm_to_blib}{}m; # Generating test files does not depend on built PPPort in blib/
+    }
+    $updated .= $rule;
+  }
+
+  return $updated;
+}
+
 sub MY::dist_core
 {
   package MY;
@@ -150,6 +188,7 @@ sub MY::dist_core
   my @rules = split( m{^\s*$}m, $dist );
   foreach my $rule ( @rules ) {
     if ( $rule =~ m{^\s*^dist\s+:}m ) {
+        $rule =~ s{:}{: manifest}; # make sure we regenerate the manifest
         $rule .= qq[\t].q[$(NOECHO) $(ECHO) "Warning: Please check '__MAX_PERL__' value in PPPort_pm.PL"].qq[\n];
     }
     $updated .= $rule;
index ac4917e..a78d402 100644 (file)
@@ -94,11 +94,11 @@ for (@perl_api) {
   $line .= 'p' if exists $provides{$_};
   if (exists $embed{$_}) {
     my $e = $embed{$_};
-    if (exists $e->{flags}{p}) {
+    if (exists $e->{flags}{p}) {    # Has 'Perl_' prefix
       my $args = $e->{args};
       $line .= 'v' if @$args && $args->[-1][0] eq '...';
     }
-    $line .= 'n' if exists $e->{flags}{n};
+    $line .= 'n' if exists $e->{flags}{T};  # No thread context parameter
   }
   $_ = $line;
 }
@@ -309,7 +309,7 @@ sub make_embed
   my $a = do { my $x = 'a'; join ',', map { $x++ } 1 .. @{$f->{args}} };
   my $lastarg = ${$f->{args}}[-1];
 
-  if ($f->{flags}{n}) {
+  if ($f->{flags}{T}) {
     if ($f->{flags}{p}) {
       return "#define $n $DPPP(my_$n)\n" .
              "#define Perl_$n $DPPP(my_$n)";
@@ -551,7 +551,7 @@ package Devel::PPPort;
 use strict;
 use vars qw($VERSION $data);
 
-$VERSION = '3.53';
+$VERSION = '3.54';
 
 sub _init_data
 {
index ff96ccc..27cc964 100755 (executable)
@@ -72,10 +72,14 @@ if isperlroot $PERLROOT; then
 : source code, but are not contained in F<embed.fnc>.
 :
 
+: This line needs to be in this file for things to work, even though it's been
+: removed from later embed.fnc versions
+ApTod   |int    |my_sprintf     |NN char *buffer|NN const char *pat|...
+
 EOF
   grep -hr '^=for apidoc' $PERLROOT | sed -e 's/=for apidoc //' | grep '|' | sort | uniq \
-     | perl -e'$f=pop;open(F,$f)||die"$f:$!";while(<F>){(split/\|/)[2]=~/(\w+)/;$h{$1}++}
-               while(<>){s/[ \t]+$//;(split/\|/)[2]=~/(\w+)/;$h{$1}||print}' $EMBED >>$OUTPUT
+     | perl -e'$f=pop;open(F,$f)||die"$f:$!";while(<F>){(split/\s*\|\s*/)[2]=~/(\w+)/;$h{$1}++}
+               while(<>){s/[ \t]+$//;(split/\s*\|\s*/)[2]=~/(\w+)/;$h{$1}||print}' $EMBED >>$OUTPUT
 else
   usage
 fi
index 69d8502..65ece66 100644 (file)
@@ -135,41 +135,40 @@ print OUT <<HEAD;
 
 #else
 
-#define NEED_PL_signals
 #define NEED_PL_parser
+#define NEED_PL_signals
 #define NEED_caller_cx
+#define NEED_croak_xs_usage
+#define NEED_die_sv
 #define NEED_eval_pv
 #define NEED_grok_bin
 #define NEED_grok_hex
 #define NEED_grok_number
 #define NEED_grok_numeric_radix
 #define NEED_grok_oct
-#define NEED_gv_fetchpvn_flags
 #define NEED_load_module
+#define NEED_mess
+#define NEED_mess_nocontext
+#define NEED_mess_sv
 #define NEED_mg_findext
 #define NEED_my_snprintf
 #define NEED_my_sprintf
 #define NEED_my_strlcat
 #define NEED_my_strlcpy
+#define NEED_my_strnlen
 #define NEED_newCONSTSUB
-#define NEED_newRV_noinc
-#define NEED_newSV_type
-#define NEED_newSVpvn_flags
 #define NEED_newSVpvn_share
 #define NEED_pv_display
 #define NEED_pv_escape
 #define NEED_pv_pretty
-#define NEED_sv_2pv_flags
-#define NEED_sv_2pvbyte
 #define NEED_sv_catpvf_mg
 #define NEED_sv_catpvf_mg_nocontext
-#define NEED_sv_pvn_force_flags
 #define NEED_sv_setpvf_mg
 #define NEED_sv_setpvf_mg_nocontext
 #define NEED_sv_unmagicext
-#define NEED_SvRX
+#define NEED_utf8_to_uvchr_buf
 #define NEED_vload_module
-#define NEED_vnewSVpvf
+#define NEED_vmess
 #define NEED_warner
 
 #include "ppport.h"
@@ -240,7 +239,7 @@ for $f (@f) {
     }
   }
 
-  unless ($f->{flags}{n} || $f->{flags}{'m'}) {
+  unless ($f->{flags}{'T'} || $f->{flags}{'m'}) {
     $stack = "  dTHX;\n$stack";
     $aTHX = @arg ? 'aTHX_ ' : 'aTHX';
   }
index 1149c06..ce3dae0 100644 (file)
 : source code, but are not contained in F<embed.fnc>.
 :
 
+: This line needs to be in this file for things to work, even though it's been
+: removed from later embed.fnc versions
+ApTod   |int    |my_sprintf     |NN char *buffer|NN const char *pat|...
+
 Ama|char*|savepvs|"literal string" s
 Ama|char*|savesharedpvs|"literal string" s
 Ama|SV*|newSVpvs_flags|"literal string" s|U32 flags
@@ -125,12 +129,39 @@ Amn|NV|POPn
 Amn|peep_t|PL_peepp
 Amn|peep_t|PL_rpeepp
 Amn|Perl_ophook_t|PL_opfreehook
+Amns||dAX
+Amns||dAXMARK
+Amns||dITEMS
+Amns||dMARK
+Amns||dMULTICALL
+Amns||dORIGMARK
+Amns||dSP
+Amns||dUNDERBAR
+Amns||dXCPT
+Amns||dXSARGS
+Amns||dXSI32
+Amns||ENTER
+Amns||FREETMPS
+Amns||LEAVE
+Amns||MULTICALL
+Amns||POP_MULTICALL
+Amns||PUSH_MULTICALL
+Amns||PUTBACK
+Amns||SAVETMPS
+Amns||SPAGAIN
 Amn|STRLEN|PL_na
 Amn|SV|PL_sv_no
 Amn|SV|PL_sv_undef
 Amn|SV|PL_sv_yes
 Amn|SV|PL_sv_zero
 Amn|SV*|POPs
+Amns||XCPT_RETHROW
+Amns||XS_APIVERSION_BOOTCHECK
+Amns||XSRETURN_EMPTY
+Amns||XSRETURN_NO
+Amns||XSRETURN_UNDEF
+Amns||XSRETURN_YES
+Amns||XS_VERSION_BOOTCHECK
 Amn|U32|GIMME
 Amn|U32|GIMME_V
 Amn|UV|POPu
@@ -146,28 +177,8 @@ Am|OP*|OpSIBLING|OP *o
 Am|PADOFFSET|pad_add_name_pvs|"literal string" name|U32 flags|HV *typestash|HV *ourstash
 Am|PADOFFSET|pad_findmy_pvs|"literal string" name|U32 flags
 Am|REGEXP *|SvRX|SV *sv
-Ams||dAX
-Ams||dAXMARK
-Ams||dITEMS
-Ams||dMARK
-Ams||dMULTICALL
-Ams||dORIGMARK
-Ams||dSP
-Ams||dUNDERBAR
-Ams||dXCPT
-Ams||dXSARGS
-Ams||dXSI32
-Ams||ENTER
-Ams||ENTER_with_name(name)
-Ams||FREETMPS
-Ams||LEAVE
-Ams||LEAVE_with_name(name)
-Ams||MULTICALL
-Ams||POP_MULTICALL
-Ams||PUSH_MULTICALL
-Ams||PUTBACK
-Ams||SAVETMPS
-Ams||SPAGAIN
+Ams||ENTER_with_name|const char * name
+Ams||LEAVE_with_name|const char * name
 Am|STRLEN|HeKLEN|HE* he
 Am|STRLEN|HvENAMELEN|HV *stash
 Am|STRLEN|HvNAMELEN|HV *stash
@@ -199,13 +210,6 @@ Am|SV*|SvREFCNT_inc|SV* sv
 Am|SV*|SvRV|SV* sv
 Am|SV *|sv_setref_pvs|"literal string" s
 Am|svtype|SvTYPE|SV* sv
-Ams||XCPT_RETHROW
-Ams||XS_APIVERSION_BOOTCHECK
-Ams||XSRETURN_EMPTY
-Ams||XSRETURN_NO
-Ams||XSRETURN_UNDEF
-Ams||XSRETURN_YES
-Ams||XS_VERSION_BOOTCHECK
 Am|U32|HeHASH|HE* he
 Am|U32|HeUTF8|HE* he
 Am|U32|OP_CLASS|OP *o
@@ -454,13 +458,13 @@ Amx|SV*|newSVpadname|PADNAME *pn
 Amx|SV **|PadARRAY|PAD pad
 Amx|SV *|PadnameSV|PADNAME pn
 Amx|U32|PadlistREFCNT|PADLIST padlist
-AmxU|char *|PL_parser-E<gt>bufend
-AmxU|char *|PL_parser-E<gt>bufptr
-AmxU|char *|PL_parser-E<gt>linestart
+AmxUN|char *|PL_parser-E<gt>bufend
+AmxUN|char *|PL_parser-E<gt>bufptr
+AmxUN|char *|PL_parser-E<gt>linestart
+AmxUN|SV *|PL_parser-E<gt>linestr
 AmxU|PADNAMELIST *|PL_comppad_name
 AmxU|PAD *|PL_comppad
 AmxU|SV **|PL_curpad
-AmxU|SV *|PL_parser-E<gt>linestr
 Amx|void|BhkDISABLE|BHK *hk|which
 Amx|void|BhkENABLE|BHK *hk|which
 Amx|void|BhkENTRY_set|BHK *hk|which|void *ptr
index 40c8069..b8d429a 100644 (file)
@@ -1,16 +1,26 @@
 : BEGIN{die "You meant to run regen/embed.pl"} # Stop early if fed to perl.
 :
-: This file is processed by regen/embed.pl and autodoc.pl
-: It is used to declare the interfaces to the functions defined by perl.  All
-: non-static functions must have entries here.  Static functions need not, but
-: there is benefit to declaring them here, as it generally handles the thread
-: context parameter invisibly, as well as making sure a PERL_ARGS_ASSERT_foo
-: macro is defined, which can save you debugging time.
-:
-: Lines are of the form:
+: WARNING:  The meanings of some flags have been changed as of v5.31.0
+
+: This file is known to be processed by regen/embed.pl, autodoc.pl,
+: makedef.pl, Devel::PPPort, and porting/diag.t.
+:
+: All non-static functions defined by perl need to be listed in this file.
+: embed.pl uses the entries here to construct proto.h to declare to the
+: compiler the function interfaces, and embed.h to create macros that present a
+: uniform interface to C code for the functions, regardless of, say, whether
+: the perl is threaded or not.
+
+: Static functions need not appear here, but there is benefit to declaring them
+: here, as it generally handles the thread context parameter invisibly, as well
+: as making sure a PERL_ARGS_ASSERT_foo macro is defined, which can save you
+: debugging time.
+:
+: Lines in this file are of the form:
 :    flags|return_type|function_name|arg1|arg2|...|argN
 :
-: A line may be continued on another by ending it with a backslash.
+: A function taking no parameters will have no 'arg' elements.
+: A line may be continued onto the next by ending it with a backslash.
 : Leading and trailing whitespace will be ignored in each component.
 :
 : The default without flags is to declare a function for internal perl-core use
 : modify this.  Most non-static functions should have the 'p' flag to avoid
 : namespace clashes with programs that embed perl.
 :
-: flags are single letters with following meanings:
+: Scattered around the perl source are lines of the form:
+:
+:   =for apidoc name
+:
+: and
+:
+:   =for apidoc flags|return_type|name|arg1|arg2|...|argN
+:
+: and with the same meanings as the lines in this file.  autodoc uses these
+: lines in conjunction with this file to construct perlapi.pod.  For entries of
+: the first form, there must be a corresponding entry in this file, and the
+: purpose of the line is to associate the pod accompanying it with the
+: interface defined in this file.  The second form is used to define the
+: interface for the documentation when there is no entry in this file, hence it
+: will be for something that isn't a non-static function: a macro of some kind,
+: a constant, or some other entity that it wishes to have documented.  (If
+: there is also an entry in this file it overrides the apidoc line, and
+: autodoc.pl will warn.) 'return_type' in these lines can be empty, unlike in
+: this file.  The entries in this file that have corresponding '=for apidoc'
+: entries should have the flag 'd' set in this file.
+:
+: Devel::PPPort also looks at both this file and the '=for apidoc' lines.  In
+: part it is to construct lists of functions that are or are not backported.
+:
+: makedef.pl uses this file for constructing the export list
+:
+: porting/diag.t checks some things for consistency based on this file.
+:
+: 'flags' is a string of single letters.  Most of the flags are meaningful only
+: to embed.pl; some only to autodoc.pl, and others only to makedef.pl.  The
+: comments here don't include how Devel::PPPort or diag.t use them:
 :
 :   A  Available fully everywhere (usually part of the public API):
 :
-:         add entry to the list of exported symbols (unless x or m);
-:         any doc entry goes in perlapi.pod rather than perlintern.pod.  If no
-:           documentation is furnished for this function, and M is also
-:           specified, the function is not listed as part of the public API.
-:           If M isn't specified, and no documentation is furnished, the
-:           function is listed in perlapi as existing and being undocumented
+:         add entry to the list of exported symbols (unless e or m);
+:         any doc entry goes in perlapi.pod rather than perlintern.pod.  If
+:            none specified, autodoc.pl does not list this function/macro as
+:            part of the public API.  If x isn't specified, and no
+:            documentation is furnished, autodoc.pl lists this in perlapi as
+:            existing and being undocumented.
 :         makes '#define foo Perl_foo' scope not just for PERL_CORE/PERL_EXT
 :
-:      If the function is only exported for use in a public
-:      macro, see X.
+:      If the function is only exported for use in a public macro, see X.
 :
 :   a  Allocates memory a la malloc/calloc.  Also implies "R".
-:      This should only be on functions which returns 'empty' memory
+:      This flag should only be on functions which return 'empty' memory
 :      which has no other pointers to it, and which does not contain
 :      any pointers to other things. So for example realloc() can't be
 :      'a'.
@@ -60,7 +99,7 @@
 :
 :      For functions, like wrappers, whose macro shortcut doesn't call the
 :      function, but which, for whatever reason, aren't considered legacy-only,
-:      use the 'o' flag
+:      use the 'o' flag, and maybe the 'M'
 :
 :      This flag effectively causes nothing to happen if the perl interpreter
 :      is compiled with -DNO_MATHOMS; otherwise these happen:
 :   D  Function is deprecated:
 :
 :         proto.h: add __attribute__deprecated__
+:         autodoc.pl adds a note to this effect in the doc entry
 :
 :   d  Function has documentation (somewhere) in the source:
 :
-:         enables 'no docs for foo" warning in autodoc.pl
+:         enables 'no docs for foo" warning in autodoc.pl in the documentation
+:         isn't found
 :
 :   E  Visible to extensions included in the Perl core:
 :
 :         in embed.h, change "#ifdef PERL_CORE"
 :         into               "#if defined(PERL_CORE) || defined(PERL_EXT)"
 :
-:      To be usable from dynamically loaded extensions, either:
-:        1) must be static to its containing file ("i" or "s" flag); or
+:       To be usable from dynamically loaded extensions, either:
+:        1) it must be static to its containing file ("i" or "s" flag); or
 :         2) be combined with the "X" flag.
 :
+:   e  Not exported
+
+:         suppress entry in the list of exported symbols
+:
 :   f  Function takes a format string. If the function name =~ qr/strftime/
 :      then its assumed to take a strftime-style format string as 1st arg;
 :      otherwise it's assumed to be a printf style format string, varargs
 :
 :         proto.h: function is declared as S_foo rather than foo unless the 'p'
 :                 flag is also given in which case 'Perl_foo' is used,
-:                PERL_STATIC_INLINE is added to declaration;
+:                PERL_STATIC_INLINE is added to the declaration
 :         embed.h: "#define foo S_foo" or Perl_foo entries added
 :
-:   M  May change:
+:   M  There is an extra macro that bypasses this function
 :
-:         any doc entry is marked that function may change.  Also used to
-:        suppress making a doc entry if it would just be a placeholder.
+:      (requires 'p', and implies 'o')  The function exists so that callers who
+:      used the 'Perl_' form can continue to do so, but there is a macro
+:      available without the 'Perl_' prefix that bypasses the function call,
+:      such as when the function has been reduced to a wrapper around another
+:      one.
 :
 :   m  Implemented as a macro:
 :
 :         suppress entry in the list of exported symbols
 :         suppress embed.h entry
 :
-:   n  Has no implicit interpreter/thread context argument:
+:   N  The name in the entry isn't strictly a name
 :
-:         suppress the pTHX part of "foo(pTHX...)" in proto.h;
-:         In the PERL_IMPLICIT_SYS branch of embed.h, generates
-:             "#define foo Perl_foo",      rather than
-:             "#define foo(a,b,c) Perl_foo(aTHX_ a,b,c)
+:      Normally, the name of the function or macro must contain all \w
+:      characters, and a warning is raised otherwise.  This flag suppresses
+:      that warning, so that weird things can be documented
+:
+:   n  Has no arguments (used only in =for apidoc entries)
+:
+:      The macro (it can't be a function) is used without any parameters nor
+:      empty parentheses.
 :
 :   O  Has a perl_ compatibility macro.
 :
-:      The really OLD name for API funcs
+:      The really OLD name for API funcs.
+
+:      autodoc.pl adds a note that the perl_ form of this function is
+:      deprecated.
+:
 :
 :   o  Has no Perl_foo or S_foo compatibility macro:
 :
 :      doesn't call the function specified by this entry.  This is typically
 :      done for a function that effectively just wraps another one, and where
 :      the macro form calls the underlying function directly.  For these, also
-:      specify the 'm' flag.  Legacy-only functions should instead use 'b'.
+:      specify the 'M' flag.  Legacy-only functions should instead use 'b'.
 :
 :         embed.h: suppress "#define foo Perl_foo"
 :
+:      autodoc.pl adds a note that this function must be explicitly called as
+:      Perl_$name with an aTHX_ parameter, unless the 'M' flag is specified.
+:
 :   P  Pure function:
 :
 :      A pure function has no effects except the return value, and the return
 :
 :        proto.h: add __attribute__noreturn__
 :
-:   s  Static function: function in source code has a S_ prefix:
+:   S  Static function: function in source code has a S_ prefix:
 :
 :         proto.h: function is declared as S_foo rather than foo,
 :                STATIC is added to declaration;
 :         embed.h: "#define foo S_foo" entries added
 :
-:   U  Suppress usage example in autogenerated documentation
+:   s  autodoc.pl adds a terminating semi-colon to the usage example in the
+:      documentation.
 :
-:         (currently no effect)
+:   T  Has no implicit interpreter/thread context argument:
+:
+:         suppress the pTHX part of "foo(pTHX...)" in proto.h;
+:         In the PERL_IMPLICIT_SYS branch of embed.h, generates
+:             "#define foo Perl_foo",      rather than
+:             "#define foo(a,b,c) Perl_foo(aTHX_ a,b,c)
+:
+:   U  autodoc.pl will not output a usage example
 :
 :   W  Add a _pDEPTH argument to function prototypes, and an _aDEPTH
 :      argument to the function calls. This means that under DEBUGGING
 :
 :   X  Explicitly exported:
 :
-:         add entry to the list of exported symbols, unless x or m
+:         add entry to the list of exported symbols, unless e or m
 :
 :      This is often used for private functions that are used by public
 :      macros.  In those cases the macros must use the long form of the
 :      name (Perl_blah(aTHX_ ...)).
 :
-:   x  Not exported
-:
-:         suppress entry in the list of exported symbols
+:   x  Experimental, may change:
 :
-: (see also L<perlguts/Internal Functions> for those flags.)
+:         any doc entry is marked that it may change.  Also used to suppress
+:        making a doc entry if it would just be a placeholder.
 :
-: Pointer parameters that must not be passed NULLs should be prefixed with NN.
+: In this file, pointer parameters that must not be passed NULLs should be
+: prefixed with NN.
 :
-: Pointer parameters that may be NULL should be prefixed with NULLOK.  This has
-: no effect on output yet.  It's a notation for the maintainers to know "I have
-: defined whether NULL is OK or not" rather than having neither NULL or NULLOK,
-: which is ambiguous.
+: And, pointer parameters that may be NULL should be prefixed with NULLOK.
+: This has no effect on output yet.  It's a notation for the maintainers to
+: know "I have defined whether NULL is OK or not" rather than having neither
+: NULL or NULLOK, which is ambiguous.
 :
-: Individual flags may be separated by whitespace.
+: Individual flags may be separated by non-tab whitespace.
 
 #if defined(PERL_IMPLICIT_SYS)
-Ano    |PerlInterpreter*|perl_alloc_using \
+ATo    |PerlInterpreter*|perl_alloc_using \
                                |NN struct IPerlMem *ipM \
                                |NN struct IPerlMem *ipMS \
                                |NN struct IPerlMem *ipMP \
@@ -216,18 +283,18 @@ Ano       |PerlInterpreter*|perl_alloc_using \
                                |NN struct IPerlSock *ipS \
                                |NN struct IPerlProc *ipP
 #endif
-Anod   |PerlInterpreter*       |perl_alloc
-Anod   |void   |perl_construct |NN PerlInterpreter *my_perl
-Anod   |int    |perl_destruct  |NN PerlInterpreter *my_perl
-Anod   |void   |perl_free      |NN PerlInterpreter *my_perl
-Anod   |int    |perl_run       |NN PerlInterpreter *my_perl
-Anod   |int    |perl_parse     |NN PerlInterpreter *my_perl|XSINIT_t xsinit \
+ATod   |PerlInterpreter*       |perl_alloc
+ATod   |void   |perl_construct |NN PerlInterpreter *my_perl
+ATod   |int    |perl_destruct  |NN PerlInterpreter *my_perl
+ATod   |void   |perl_free      |NN PerlInterpreter *my_perl
+ATod   |int    |perl_run       |NN PerlInterpreter *my_perl
+ATod   |int    |perl_parse     |NN PerlInterpreter *my_perl|XSINIT_t xsinit \
                                |int argc|NULLOK char** argv|NULLOK char** env
-AnpR   |bool   |doing_taint    |int argc|NULLOK char** argv|NULLOK char** env
+ATpR   |bool   |doing_taint    |int argc|NULLOK char** argv|NULLOK char** env
 #if defined(USE_ITHREADS)
-Anod   |PerlInterpreter*|perl_clone|NN PerlInterpreter *proto_perl|UV flags
+ATod   |PerlInterpreter*|perl_clone|NN PerlInterpreter *proto_perl|UV flags
 #  if defined(PERL_IMPLICIT_SYS)
-Ano    |PerlInterpreter*|perl_clone_using \
+ATo    |PerlInterpreter*|perl_clone_using \
                                |NN PerlInterpreter *proto_perl \
                                |UV flags \
                                |NN struct IPerlMem* ipM \
@@ -242,20 +309,20 @@ Ano       |PerlInterpreter*|perl_clone_using \
 #  endif
 #endif
 
-Aanop  |Malloc_t|malloc        |MEM_SIZE nbytes
-Aanop  |Malloc_t|calloc        |MEM_SIZE elements|MEM_SIZE size
-ARnop  |Malloc_t|realloc       |Malloc_t where|MEM_SIZE nbytes
-Anop   |Free_t |mfree          |Malloc_t where
+AaTop  |Malloc_t|malloc        |MEM_SIZE nbytes
+AaTop  |Malloc_t|calloc        |MEM_SIZE elements|MEM_SIZE size
+ARTop  |Malloc_t|realloc       |Malloc_t where|MEM_SIZE nbytes
+ATop   |Free_t |mfree          |Malloc_t where
 #if defined(MYMALLOC)
-npR    |MEM_SIZE|malloced_size |NN void *p
-npR    |MEM_SIZE|malloc_good_size      |size_t nbytes
+TpR    |MEM_SIZE|malloced_size |NN void *p
+TpR    |MEM_SIZE|malloc_good_size      |size_t nbytes
 #endif
 #if defined(PERL_IN_MALLOC_C)
-sn     |int    |adjust_size_and_find_bucket    |NN size_t *nbytes_p
+ST     |int    |adjust_size_and_find_bucket    |NN size_t *nbytes_p
 #endif
 
-AnpR   |void*  |get_context
-Anp    |void   |set_context    |NN void *t
+ATpR   |void*  |get_context
+ATp    |void   |set_context    |NN void *t
 
 XEop   |bool   |try_amagic_bin |int method|int flags
 XEop   |bool   |try_amagic_un  |int method|int flags
@@ -270,7 +337,7 @@ Apd |OP*    |op_linklist    |NN OP *o
 Apd    |OP*    |op_prepend_elem|I32 optype|NULLOK OP* first|NULLOK OP* last
 : FIXME - this is only called by pp_chown. They should be merged.
 p      |I32    |apply          |I32 type|NN SV** mark|NN SV** sp
-ApM    |void   |apply_attrs_string|NN const char *stashpv|NN CV *cv|NN const char *attrstr|STRLEN len
+Apx    |void   |apply_attrs_string|NN const char *stashpv|NN CV *cv|NN const char *attrstr|STRLEN len
 Apd    |void   |av_clear       |NN AV *av
 Apd    |SV*    |av_delete      |NN AV *av|SSize_t key|I32 flags
 ApdR   |bool   |av_exists      |NN AV *av|SSize_t key
@@ -284,7 +351,7 @@ ApdR        |SSize_t|av_len         |NN AV *av
 ApdR   |AV*    |av_make        |SSize_t size|NN SV **strp
 p      |SV*    |av_nonelem     |NN AV *av|SSize_t ix
 Apd    |SV*    |av_pop         |NN AV *av
-ApdoxM |void   |av_create_and_push|NN AV **const avp|NN SV *const val
+Apdoex |void   |av_create_and_push|NN AV **const avp|NN SV *const val
 Apd    |void   |av_push        |NN AV *av|NN SV *val
 : Used in scope.c, and by Data::Alias
 EXp    |void   |av_reify       |NN AV *av
@@ -293,12 +360,12 @@ Apd       |SV**   |av_store       |NN AV *av|SSize_t key|NULLOK SV *val
 AidR   |SSize_t|av_top_index   |NN AV *av
 AmpdR  |SSize_t|av_tindex      |NN AV *av
 Apd    |void   |av_undef       |NN AV *av
-ApdoxM |SV**   |av_create_and_unshift_one|NN AV **const avp|NN SV *const val
+Apdoex |SV**   |av_create_and_unshift_one|NN AV **const avp|NN SV *const val
 Apd    |void   |av_unshift     |NN AV *av|SSize_t num
 Apo    |SV**   |av_arylen_p    |NN AV *av
 Apo    |IV*    |av_iter_p      |NN AV *av
 #if defined(PERL_IN_AV_C)
-s      |MAGIC* |get_aux_mg     |NN AV *av
+S      |MAGIC* |get_aux_mg     |NN AV *av
 #endif
 : Used in perly.y
 pR     |OP*    |bind_match     |I32 type|NN OP *left|NN OP *right
@@ -307,7 +374,7 @@ ApdR        |OP*    |block_end      |I32 floor|NULLOK OP* seq
 ApR    |U8     |block_gimme
 : Used in perly.y
 ApdR   |int    |block_start    |int full
-Aod  |void   |blockhook_register |NN BHK *hk
+Aodxp  |void   |blockhook_register |NN BHK *hk
 : Used in perl.c
 p      |void   |boot_core_UNIVERSAL
 : Used in perl.c
@@ -317,10 +384,10 @@ Apd       |const PERL_CONTEXT *   |caller_cx|I32 level \
                                |NULLOK const PERL_CONTEXT **dbcxp
 : Used in several source files
 pR     |bool   |cando          |Mode_t mode|bool effective|NN const Stat_t* statbufp
-ApRn   |U32    |cast_ulong     |NV f
-ApRn   |I32    |cast_i32       |NV f
-ApRn   |IV     |cast_iv        |NV f
-ApRn   |UV     |cast_uv        |NV f
+ApRT   |U32    |cast_ulong     |NV f
+ApRT   |I32    |cast_i32       |NV f
+ApRT   |IV     |cast_iv        |NV f
+ApRT   |UV     |cast_uv        |NV f
 #if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
 ApR    |I32    |my_chsize      |int fd|Off_t length
 #endif
@@ -329,37 +396,37 @@ p |const COP*|closest_cop |NN const COP *cop|NULLOK const OP *o \
 : Used in perly.y
 ApdR   |OP*    |op_convert_list        |I32 optype|I32 flags|NULLOK OP* o
 : Used in op.c and perl.c
-pM     |void   |create_eval_scope|NULLOK OP *retop|U32 flags
+px     |void   |create_eval_scope|NULLOK OP *retop|U32 flags
 Aprd   |void   |croak_sv       |NN SV *baseex
 : croak()'s first parm can be NULL.  Otherwise, mod_perl breaks.
 Afprd  |void   |croak          |NULLOK const char* pat|...
 Aprd   |void   |vcroak         |NULLOK const char* pat|NULLOK va_list* args
-Anprd  |void   |croak_no_modify
-Anprd  |void   |croak_xs_usage |NN const CV *const cv \
+ATprd  |void   |croak_no_modify
+ATprd  |void   |croak_xs_usage |NN const CV *const cv \
                                |NN const char *const params
-npr    |void   |croak_no_mem
-nprX   |void   |croak_popstack
-fnrp   |void   |croak_caller|NULLOK const char* pat|...
-fnprx  |void   |noperl_die|NN const char* pat|...
+Tpr    |void   |croak_no_mem
+TprX   |void   |croak_popstack
+fTrp   |void   |croak_caller|NULLOK const char* pat|...
+fTpre  |void   |noperl_die|NN const char* pat|...
 #if defined(WIN32)
-norx   |void   |win32_croak_not_implemented|NN const char * fname
+Tore   |void   |win32_croak_not_implemented|NN const char * fname
 #endif
 #if defined(PERL_IMPLICIT_CONTEXT)
-Afnrp  |void   |croak_nocontext|NULLOK const char* pat|...
-Afnrp  |OP*    |die_nocontext  |NULLOK const char* pat|...
-Afnp   |void   |deb_nocontext  |NN const char* pat|...
-Afnp   |char*  |form_nocontext |NN const char* pat|...
-Anp    |void   |load_module_nocontext|U32 flags|NN SV* name|NULLOK SV* ver|...
-Afnp   |SV*    |mess_nocontext |NN const char* pat|...
-Afnp   |void   |warn_nocontext |NN const char* pat|...
-Afnp   |void   |warner_nocontext|U32 err|NN const char* pat|...
-Afnp   |SV*    |newSVpvf_nocontext|NN const char *const pat|...
-Afnp   |void   |sv_catpvf_nocontext|NN SV *const sv|NN const char *const pat|...
-Afnp   |void   |sv_setpvf_nocontext|NN SV *const sv|NN const char *const pat|...
-Afnp   |void   |sv_catpvf_mg_nocontext|NN SV *const sv|NN const char *const pat|...
-Afnp   |void   |sv_setpvf_mg_nocontext|NN SV *const sv|NN const char *const pat|...
-Abfnp  |int    |fprintf_nocontext|NN PerlIO *stream|NN const char *format|...
-Abfnp  |int    |printf_nocontext|NN const char *format|...
+AfTrp  |void   |croak_nocontext|NULLOK const char* pat|...
+AfTrp  |OP*    |die_nocontext  |NULLOK const char* pat|...
+AfTp   |void   |deb_nocontext  |NN const char* pat|...
+AfTp   |char*  |form_nocontext |NN const char* pat|...
+ATp    |void   |load_module_nocontext|U32 flags|NN SV* name|NULLOK SV* ver|...
+AfTp   |SV*    |mess_nocontext |NN const char* pat|...
+AfTp   |void   |warn_nocontext |NN const char* pat|...
+AfTp   |void   |warner_nocontext|U32 err|NN const char* pat|...
+AfTp   |SV*    |newSVpvf_nocontext|NN const char *const pat|...
+AfTp   |void   |sv_catpvf_nocontext|NN SV *const sv|NN const char *const pat|...
+AfTp   |void   |sv_setpvf_nocontext|NN SV *const sv|NN const char *const pat|...
+AfTp   |void   |sv_catpvf_mg_nocontext|NN SV *const sv|NN const char *const pat|...
+AfTp   |void   |sv_setpvf_mg_nocontext|NN SV *const sv|NN const char *const pat|...
+AbfTp  |int    |fprintf_nocontext|NN PerlIO *stream|NN const char *format|...
+AbfTp  |int    |printf_nocontext|NN const char *format|...
 #endif
 : Used in pp.c
 p      |SV *   |core_prototype |NULLOK SV *sv|NN const char *name \
@@ -368,13 +435,13 @@ p |SV *   |core_prototype |NULLOK SV *sv|NN const char *name \
 p      |OP *   |coresub_op     |NN SV *const coreargssv|const int code \
                                |const int opnum
 : Used in sv.c
-EMXp   |void   |cv_ckproto_len_flags   |NN const CV* cv|NULLOK const GV* gv\
+ExXp   |void   |cv_ckproto_len_flags   |NN const CV* cv|NULLOK const GV* gv\
                                |NULLOK const char* p|const STRLEN len \
                                 |const U32 flags
 : Used in pp.c and pp_sys.c
 ApdR   |SV*    |gv_const_sv    |NN GV* gv
-ApdRn  |SV*    |cv_const_sv    |NULLOK const CV *const cv
-pRn    |SV*    |cv_const_sv_or_av|NULLOK const CV *const cv
+ApdRT  |SV*    |cv_const_sv    |NULLOK const CV *const cv
+pRT    |SV*    |cv_const_sv_or_av|NULLOK const CV *const cv
 Apd    |SV *   |cv_name        |NN CV *cv|NULLOK SV *sv|U32 flags
 Apd    |void   |cv_undef       |NN CV* cv
 p      |void   |cv_undef_flags |NN CV* cv|U32 flags
@@ -401,14 +468,14 @@ Ap        |I32    |debop          |NN const OP* o
 Ap     |I32    |debstack
 Ap     |I32    |debstackptrs
 pR     |SV *   |defelem_target |NN SV *sv|NULLOK MAGIC *mg
-Anp    |char*  |delimcpy       |NN char* to|NN const char* toend|NN const char* from \
+ATp    |char*  |delimcpy       |NN char* to|NN const char* toend|NN const char* from \
                                |NN const char* fromend|int delim|NN I32* retlen
-np     |char*  |delimcpy_no_escape|NN char* to|NN const char* toend \
+Tp     |char*  |delimcpy_no_escape|NN char* to|NN const char* toend \
                                   |NN const char* from \
                                   |NN const char* fromend|int delim \
                                   |NN I32* retlen
 : Used in op.c, perl.c
-pM     |void   |delete_eval_scope
+px     |void   |delete_eval_scope
 Aprd   |OP*    |die_sv         |NN SV *baseex
 Afrpd  |OP*    |die            |NULLOK const char* pat|...
 : Used in util.c
@@ -439,8 +506,8 @@ Ap  |int    |do_spawn_nowait|NN char* cmd
 p      |bool|do_exec3  |NN const char *incmd|int fd|int do_report
 #endif
 #if defined(PERL_IN_DOIO_C)
-s      |void   |exec_failed    |NN const char *cmd|int fd|int do_report
-s      |bool   |argvout_final  |NN MAGIC *mg|NN IO *io|bool not_implicit
+S      |void   |exec_failed    |NN const char *cmd|int fd|int do_report
+S      |bool   |argvout_final  |NN MAGIC *mg|NN IO *io|bool not_implicit
 #endif
 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
 : Defined in doio.c, used only in pp_sys.c
@@ -466,8 +533,8 @@ Apmb        |bool   |do_open        |NN GV* gv|NN const char* name|I32 len|int as_raw \
 Abp    |bool   |do_open9       |NN GV *gv|NN const char *name|I32 len|int as_raw \
                                |int rawmode|int rawperm|NULLOK PerlIO *supplied_fp \
                                |NN SV *svs|I32 num
-pn     |void   |setfd_cloexec|int fd
-pn     |void   |setfd_inhexec|int fd
+pT     |void   |setfd_cloexec|int fd
+pT     |void   |setfd_inhexec|int fd
 p      |void   |setfd_cloexec_for_nonsysfd|int fd
 p      |void   |setfd_inhexec_for_sysfd|int fd
 p      |void   |setfd_cloexec_or_inhexec_by_sysfdness|int fd
@@ -475,7 +542,7 @@ pR  |int    |PerlLIO_dup_cloexec|int oldfd
 p      |int    |PerlLIO_dup2_cloexec|int oldfd|int newfd
 pR     |int    |PerlLIO_open_cloexec|NN const char *file|int flag
 pR     |int    |PerlLIO_open3_cloexec|NN const char *file|int flag|int perm
-pnoR   |int    |my_mkstemp_cloexec|NN char *templte
+pToR   |int    |my_mkstemp_cloexec|NN char *templte
 #ifdef HAS_PIPE
 pR     |int    |PerlProc_pipe_cloexec|NN int *pipefd
 #endif
@@ -492,10 +559,10 @@ pR        |int    |PerlSock_socketpair_cloexec|int domain|int type|int protocol \
                                |NN int *pairfd
 #endif
 #if defined(PERL_IN_DOIO_C)
-s      |IO *   |openn_setup    |NN GV *gv|NN char *mode|NN PerlIO **saveifp \
+S      |IO *   |openn_setup    |NN GV *gv|NN char *mode|NN PerlIO **saveifp \
                                |NN PerlIO **saveofp|NN int *savefd \
                                 |NN char *savetype
-s      |bool   |openn_cleanup  |NN GV *gv|NN IO *io|NULLOK PerlIO *fp \
+S      |bool   |openn_cleanup  |NN GV *gv|NN IO *io|NULLOK PerlIO *fp \
                                |NN char *mode|NN const char *oname \
                                 |NULLOK PerlIO *saveifp|NULLOK PerlIO *saveofp \
                                 |int savefd|char savetype|int writing \
@@ -506,9 +573,9 @@ Ap  |bool   |do_openn       |NN GV *gv|NN const char *oname|I32 len \
                                |int as_raw|int rawmode|int rawperm \
                                |NULLOK PerlIO *supplied_fp|NULLOK SV **svp \
                                |I32 num
-Mp     |bool   |do_open_raw    |NN GV *gv|NN const char *oname|STRLEN len \
+xp     |bool   |do_open_raw    |NN GV *gv|NN const char *oname|STRLEN len \
                                |int rawmode|int rawperm|NULLOK Stat_t *statbufp
-Mp     |bool   |do_open6       |NN GV *gv|NN const char *oname|STRLEN len \
+xp     |bool   |do_open6       |NN GV *gv|NN const char *oname|STRLEN len \
                                |NULLOK PerlIO *supplied_fp|NULLOK SV **svp \
                                |U32 num
 : Used in pp_hot.c and pp_sys.c
@@ -553,7 +620,7 @@ p   |CV *   |find_lexical_cv|PADOFFSET off
 p      |char*  |find_script    |NN const char *scriptname|bool dosearch \
                                |NULLOK const char *const *const search_ext|I32 flags
 #if defined(PERL_IN_OP_C)
-s      |OP*    |force_list     |NULLOK OP* arg|bool nullit
+S      |OP*    |force_list     |NULLOK OP* arg|bool nullit
 i      |OP*    |op_integerize  |NN OP *o
 i      |OP*    |op_std_init    |NN OP *o
 #if defined(USE_ITHREADS)
@@ -562,21 +629,21 @@ i |void   |op_relocate_sv |NN SV** svp|NN PADOFFSET* targp
 i      |OP*    |newMETHOP_internal     |I32 type|I32 flags|NULLOK OP* dynamic_meth \
                                        |NULLOK SV* const_meth
 : FIXME
-s      |OP*    |fold_constants |NN OP * const o
-s      |OP*    |traverse_op_tree|NN OP* top|NN OP* o
+S      |OP*    |fold_constants |NN OP * const o
+S      |OP*    |traverse_op_tree|NN OP* top|NN OP* o
 #endif
 Afpd   |char*  |form           |NN const char* pat|...
 Ap     |char*  |vform          |NN const char* pat|NULLOK va_list* args
 Ap     |void   |free_tmps
 #if defined(PERL_IN_OP_C)
-s      |OP*    |gen_constant_list|NULLOK OP* o
+S      |OP*    |gen_constant_list|NULLOK OP* o
 #endif
 #if !defined(HAS_GETENV_LEN)
 : Used in hv.c
 p      |char*  |getenv_len     |NN const char *env_elem|NN unsigned long *len
 #endif
 : Used in pp_ctl.c and pp_hot.c
-pox    |void   |get_db_sub     |NULLOK SV **svp|NN CV *cv
+poe    |void   |get_db_sub     |NULLOK SV **svp|NN CV *cv
 Ap     |void   |gp_free        |NULLOK GV* gv
 Ap     |GP*    |gp_ref         |NULLOK GP* gp
 Ap     |GV*    |gv_add_by_type |NULLOK GV *gv|svtype type
@@ -615,17 +682,17 @@ Apd       |GV*    |gv_fetchmeth_pvn_autoload      |NULLOK HV* stash|NN const char* name \
 Apdmb  |GV*    |gv_fetchmethod |NN HV* stash|NN const char* name
 Apd    |GV*    |gv_fetchmethod_autoload|NN HV* stash|NN const char* name \
                                |I32 autoload
-ApM    |GV*    |gv_fetchmethod_sv_flags|NN HV* stash|NN SV* namesv|U32 flags
-ApM    |GV*    |gv_fetchmethod_pv_flags|NN HV* stash|NN const char* name \
+Apx    |GV*    |gv_fetchmethod_sv_flags|NN HV* stash|NN SV* namesv|U32 flags
+Apx    |GV*    |gv_fetchmethod_pv_flags|NN HV* stash|NN const char* name \
                                |U32 flags
-ApM    |GV*    |gv_fetchmethod_pvn_flags|NN HV* stash|NN const char* name \
+Apx    |GV*    |gv_fetchmethod_pvn_flags|NN HV* stash|NN const char* name \
                                |const STRLEN len|U32 flags
 Ap     |GV*    |gv_fetchpv     |NN const char *nambeg|I32 add|const svtype sv_type
 Abp    |void   |gv_fullname    |NN SV* sv|NN const GV* gv
 Apmb   |void   |gv_fullname3   |NN SV* sv|NN const GV* gv|NULLOK const char* prefix
 Ap     |void   |gv_fullname4   |NN SV* sv|NN const GV* gv|NULLOK const char* prefix|bool keepmain
 : Used in scope.c
-pMox   |GP *   |newGP          |NN GV *const gv
+pxoe   |GP *   |newGP          |NN GV *const gv
 pX     |void   |cvgv_set       |NN CV* cv|NULLOK GV* gv
 poX    |GV *   |cvgv_from_hek  |NN CV* cv
 pX     |void   |cvstash_set    |NN CV* cv|NULLOK HV* stash
@@ -637,9 +704,9 @@ Ap  |void   |gv_init_pv     |NN GV* gv|NULLOK HV* stash|NN const char* name \
 Ap     |void   |gv_init_pvn    |NN GV* gv|NULLOK HV* stash|NN const char* name \
                                 |STRLEN len|U32 flags
 Ap     |void   |gv_name_set    |NN GV* gv|NN const char *name|U32 len|U32 flags
-px     |GV *   |gv_override    |NN const char * const name \
+pe     |GV *   |gv_override    |NN const char * const name \
                                |const STRLEN len
-XMpd   |void   |gv_try_downgrade|NN GV* gv
+Xxpd   |void   |gv_try_downgrade|NN GV* gv
 p      |void   |gv_setref      |NN SV *const dstr|NN SV *const sstr
 Apd    |HV*    |gv_stashpv     |NN const char* name|I32 flags
 Apd    |HV*    |gv_stashpvn    |NN const char* name|U32 namelen|I32 flags
@@ -668,19 +735,19 @@ Ap        |void*  |hv_common      |NULLOK HV *hv|NULLOK SV *keysv \
 Ap     |void*  |hv_common_key_len|NULLOK HV *hv|NN const char *key \
                                |I32 klen_i32|const int action|NULLOK SV *val \
                                |const U32 hash
-Apod   |STRLEN |hv_fill        |NN HV *const hv
+AMpod  |STRLEN |hv_fill        |NN HV *const hv
 Ap     |void   |hv_free_ent    |NN HV *hv|NULLOK HE *entry
 Apd    |I32    |hv_iterinit    |NN HV *hv
 ApdR   |char*  |hv_iterkey     |NN HE* entry|NN I32* retlen
 ApdR   |SV*    |hv_iterkeysv   |NN HE* entry
 ApdRbm |HE*    |hv_iternext    |NN HV *hv
 ApdR   |SV*    |hv_iternextsv  |NN HV *hv|NN char **key|NN I32 *retlen
-ApMdR  |HE*    |hv_iternext_flags|NN HV *hv|I32 flags
+ApxdR  |HE*    |hv_iternext_flags|NN HV *hv|I32 flags
 ApdR   |SV*    |hv_iterval     |NN HV *hv|NN HE *entry
 Ap     |void   |hv_ksplit      |NN HV *hv|IV newmax
 Apdbm  |void   |hv_magic       |NN HV *hv|NULLOK GV *gv|int how
 #if defined(PERL_IN_HV_C)
-s      |SV *   |refcounted_he_value    |NN const struct refcounted_he *he
+S      |SV *   |refcounted_he_value    |NN const struct refcounted_he *he
 #endif
 Xpd    |HV *   |refcounted_he_chain_2hv|NULLOK const struct refcounted_he *c|U32 flags
 Xpd    |SV *   |refcounted_he_fetch_pvn|NULLOK const struct refcounted_he *chain \
@@ -707,26 +774,26 @@ Apbmd     |SV**   |hv_store       |NULLOK HV *hv|NULLOK const char *key \
                                |I32 klen|NULLOK SV *val|U32 hash
 Apbmd  |HE*    |hv_store_ent   |NULLOK HV *hv|NULLOK SV *key|NULLOK SV *val\
                                |U32 hash
-ApbmM  |SV**   |hv_store_flags |NULLOK HV *hv|NULLOK const char *key \
+Apbmx  |SV**   |hv_store_flags |NULLOK HV *hv|NULLOK const char *key \
                                |I32 klen|NULLOK SV *val|U32 hash|int flags
 Amd    |void   |hv_undef       |NULLOK HV *hv
 poX    |void   |hv_undef_flags |NULLOK HV *hv|U32 flags
 AmP    |I32    |ibcmp          |NN const char* a|NN const char* b|I32 len
-Ainp   |I32    |foldEQ         |NN const char* a|NN const char* b|I32 len
+AiTp   |I32    |foldEQ         |NN const char* a|NN const char* b|I32 len
 AmP    |I32    |ibcmp_locale   |NN const char* a|NN const char* b|I32 len
-Ainp   |I32    |foldEQ_locale  |NN const char* a|NN const char* b|I32 len
+AiTp   |I32    |foldEQ_locale  |NN const char* a|NN const char* b|I32 len
 Am     |I32    |ibcmp_utf8     |NN const char *s1|NULLOK char **pe1|UV l1 \
                                |bool u1|NN const char *s2|NULLOK char **pe2 \
                                |UV l2|bool u2
 Amd    |I32    |foldEQ_utf8    |NN const char *s1|NULLOK char **pe1|UV l1 \
                                |bool u1|NN const char *s2|NULLOK char **pe2 \
                                |UV l2|bool u2
-AMp    |I32    |foldEQ_utf8_flags |NN const char *s1|NULLOK char **pe1|UV l1 \
+Axp    |I32    |foldEQ_utf8_flags |NN const char *s1|NULLOK char **pe1|UV l1 \
                                |bool u1|NN const char *s2|NULLOK char **pe2 \
                                |UV l2|bool u2|U32 flags
-Ainp   |I32    |foldEQ_latin1  |NN const char* a|NN const char* b|I32 len
+AiTp   |I32    |foldEQ_latin1  |NN const char* a|NN const char* b|I32 len
 #if defined(PERL_IN_DOIO_C)
-sR     |bool   |ingroup        |Gid_t testgid|bool effective
+SR     |bool   |ingroup        |Gid_t testgid|bool effective
 #endif
 : Used in toke.c
 p      |void   |init_argv_symbols|int argc|NN char **argv
@@ -737,7 +804,7 @@ p   |void   |init_debugger
 Ap     |void   |init_stacks
 Ap     |void   |init_tm        |NN struct tm *ptm
 : Used in perly.y
-AbmnpPR        |char*  |instr          |NN const char* big|NN const char* little
+AbmTpPR        |char*  |instr          |NN const char* big|NN const char* little
 : Used in sv.c
 p      |bool   |io_close       |NN IO* io|NULLOK GV *gv \
                                |bool not_implicit|bool warn_on_fail
@@ -746,168 +813,168 @@ pR      |OP*    |invert         |NULLOK OP* cmd
 ApR    |I32    |is_lvalue_sub
 : Used in cop.h
 XopR   |I32    |was_lvalue_sub
-ApMRnP |STRLEN |_is_utf8_char_helper|NN const U8 * const s|NN const U8 * e|const U32 flags
-AbDMpR |U32    |to_uni_upper_lc|U32 c
-AbDMpR |U32    |to_uni_title_lc|U32 c
-AbDMpR |U32    |to_uni_lower_lc|U32 c
-AbDMpR |bool   |is_uni_alnum   |UV c
-AbDMpR |bool   |is_uni_alnumc  |UV c
-AbDMpR |bool   |is_uni_idfirst |UV c
-AbDMpR |bool   |is_uni_alpha   |UV c
-AbDMpPR        |bool   |is_uni_ascii   |UV c
-AbDMpPR        |bool   |is_uni_blank   |UV c
-AbDMpPR        |bool   |is_uni_space   |UV c
-AbDMpPR        |bool   |is_uni_cntrl   |UV c
-AbDMpR |bool   |is_uni_graph   |UV c
-AbDMpR |bool   |is_uni_digit   |UV c
-AbDMpR |bool   |is_uni_upper   |UV c
-AbDMpR |bool   |is_uni_lower   |UV c
-AbDMpR |bool   |is_uni_print   |UV c
-AbDMpR |bool   |is_uni_punct   |UV c
-AbDMpPR        |bool   |is_uni_xdigit  |UV c
-AMp    |UV     |to_uni_upper   |UV c|NN U8 *p|NN STRLEN *lenp
-AMp    |UV     |to_uni_title   |UV c|NN U8 *p|NN STRLEN *lenp
-AbDMpR |bool   |isIDFIRST_lazy |NN const char* p
-AbDMpR |bool   |isALNUM_lazy   |NN const char* p
+ApxRTP |STRLEN |_is_utf8_char_helper|NN const U8 * const s|NN const U8 * e|const U32 flags
+AbDxpR |U32    |to_uni_upper_lc|U32 c
+AbDxpR |U32    |to_uni_title_lc|U32 c
+AbDxpR |U32    |to_uni_lower_lc|U32 c
+AbDxpR |bool   |is_uni_alnum   |UV c
+AbDxpR |bool   |is_uni_alnumc  |UV c
+AbDxpR |bool   |is_uni_idfirst |UV c
+AbDxpR |bool   |is_uni_alpha   |UV c
+AbDxpPR        |bool   |is_uni_ascii   |UV c
+AbDxpPR        |bool   |is_uni_blank   |UV c
+AbDxpPR        |bool   |is_uni_space   |UV c
+AbDxpPR        |bool   |is_uni_cntrl   |UV c
+AbDxpR |bool   |is_uni_graph   |UV c
+AbDxpR |bool   |is_uni_digit   |UV c
+AbDxpR |bool   |is_uni_upper   |UV c
+AbDxpR |bool   |is_uni_lower   |UV c
+AbDxpR |bool   |is_uni_print   |UV c
+AbDxpR |bool   |is_uni_punct   |UV c
+AbDxpPR        |bool   |is_uni_xdigit  |UV c
+Axp    |UV     |to_uni_upper   |UV c|NN U8 *p|NN STRLEN *lenp
+Axp    |UV     |to_uni_title   |UV c|NN U8 *p|NN STRLEN *lenp
+AbDxpR |bool   |isIDFIRST_lazy |NN const char* p
+AbDxpR |bool   |isALNUM_lazy   |NN const char* p
 p      |void   |init_uniprops
 #ifdef PERL_IN_UTF8_C
-snR    |U8     |to_lower_latin1|const U8 c|NULLOK U8 *p|NULLOK STRLEN *lenp  \
+STR    |U8     |to_lower_latin1|const U8 c|NULLOK U8 *p|NULLOK STRLEN *lenp  \
                |const char dummy
 #  ifndef UV_IS_QUAD
-snR    |int    |is_utf8_cp_above_31_bits|NN const U8 * const s             \
+STR    |int    |is_utf8_cp_above_31_bits|NN const U8 * const s             \
                                         |NN const U8 * const e             \
                                         |const bool consider_overlongs
 #  endif
 #endif
 #if defined(PERL_IN_UTF8_C) || defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)
-EXnp   |UV        |_to_fold_latin1|const U8 c|NN U8 *p|NN STRLEN *lenp|const unsigned int flags
+EXTp   |UV        |_to_fold_latin1|const U8 c|NN U8 *p|NN STRLEN *lenp|const unsigned int flags
 #endif
 #if defined(PERL_IN_UTF8_C) || defined(PERL_IN_PP_C)
 p      |UV     |_to_upper_title_latin1|const U8 c|NN U8 *p|NN STRLEN *lenp|const char S_or_s
 #endif
-AMp    |UV     |to_uni_lower   |UV c|NN U8 *p|NN STRLEN *lenp
-AMmp   |UV     |to_uni_fold    |UV c|NN U8 *p|NN STRLEN *lenp
-AMp    |UV     |_to_uni_fold_flags|UV c|NN U8 *p|NN STRLEN *lenp|U8 flags
-AbDMpR |bool   |is_uni_alnum_lc|UV c
-AbDMpR |bool   |is_uni_alnumc_lc|UV c
-AbDMpR |bool   |is_uni_idfirst_lc|UV c
-AMpR   |bool   |_is_uni_perl_idcont|UV c
-AMpR   |bool   |_is_uni_perl_idstart|UV c
-AbDMpR |bool   |is_uni_alpha_lc|UV c
-AbDMpPR        |bool   |is_uni_ascii_lc|UV c
-AbDMpPR        |bool   |is_uni_space_lc|UV c
-AbDMpPR        |bool   |is_uni_blank_lc|UV c
-AbDMpPR        |bool   |is_uni_cntrl_lc|UV c
-AbDMpR |bool   |is_uni_graph_lc|UV c
-AbDMpR |bool   |is_uni_digit_lc|UV c
-AbDMpR |bool   |is_uni_upper_lc|UV c
-AbDMpR |bool   |is_uni_lower_lc|UV c
-AbDMpR |bool   |is_uni_print_lc|UV c
-AbDMpR |bool   |is_uni_punct_lc|UV c
-AbDMpPR        |bool   |is_uni_xdigit_lc|UV c
-AndmoR |bool   |is_utf8_invariant_string|NN const U8* const s              \
+Axp    |UV     |to_uni_lower   |UV c|NN U8 *p|NN STRLEN *lenp
+Axmp   |UV     |to_uni_fold    |UV c|NN U8 *p|NN STRLEN *lenp
+Axp    |UV     |_to_uni_fold_flags|UV c|NN U8 *p|NN STRLEN *lenp|U8 flags
+AbDxpR |bool   |is_uni_alnum_lc|UV c
+AbDxpR |bool   |is_uni_alnumc_lc|UV c
+AbDxpR |bool   |is_uni_idfirst_lc|UV c
+AxpR   |bool   |_is_uni_perl_idcont|UV c
+AxpR   |bool   |_is_uni_perl_idstart|UV c
+AbDxpR |bool   |is_uni_alpha_lc|UV c
+AbDxpPR        |bool   |is_uni_ascii_lc|UV c
+AbDxpPR        |bool   |is_uni_space_lc|UV c
+AbDxpPR        |bool   |is_uni_blank_lc|UV c
+AbDxpPR        |bool   |is_uni_cntrl_lc|UV c
+AbDxpR |bool   |is_uni_graph_lc|UV c
+AbDxpR |bool   |is_uni_digit_lc|UV c
+AbDxpR |bool   |is_uni_upper_lc|UV c
+AbDxpR |bool   |is_uni_lower_lc|UV c
+AbDxpR |bool   |is_uni_print_lc|UV c
+AbDxpR |bool   |is_uni_punct_lc|UV c
+AbDxpPR        |bool   |is_uni_xdigit_lc|UV c
+ATdmoR |bool   |is_utf8_invariant_string|NN const U8* const s              \
                |STRLEN len
-AnidR  |bool   |is_utf8_invariant_string_loc|NN const U8* const s          \
+ATidR  |bool   |is_utf8_invariant_string_loc|NN const U8* const s          \
                |STRLEN len                                                 \
                |NULLOK const U8 ** ep
 #ifndef EBCDIC
-AniR   |unsigned int|_variant_byte_number|PERL_UINTMAX_T word
+ATiR   |unsigned int|_variant_byte_number|PERL_UINTMAX_T word
 #endif
 #if defined(PERL_CORE) || defined(PERL_EXT)
-EinR   |Size_t |variant_under_utf8_count|NN const U8* const s              \
+EiTR   |Size_t |variant_under_utf8_count|NN const U8* const s              \
                |NN const U8* const e
 #endif
-AmnpdRP        |bool   |is_ascii_string|NN const U8* const s|STRLEN len
-AmnpdRP        |bool   |is_invariant_string|NN const U8* const s|STRLEN len
+AmTpdRP        |bool   |is_ascii_string|NN const U8* const s|STRLEN len
+AmTpdRP        |bool   |is_invariant_string|NN const U8* const s|STRLEN len
 #if defined(PERL_CORE) || defined (PERL_EXT)
-EXnidR |bool   |is_utf8_non_invariant_string|NN const U8* const s          \
+EXTidR |bool   |is_utf8_non_invariant_string|NN const U8* const s          \
                |STRLEN len
 #endif
-AbnpdD |STRLEN |is_utf8_char   |NN const U8 *s
-Abmnpd |STRLEN |is_utf8_char_buf|NN const U8 *buf|NN const U8 *buf_end
-AnidR  |Size_t |isUTF8_CHAR|NN const U8 * const s0                         \
+AbTpdD |STRLEN |is_utf8_char   |NN const U8 *s
+AbmTpd |STRLEN |is_utf8_char_buf|NN const U8 *buf|NN const U8 *buf_end
+ATidR  |Size_t |isUTF8_CHAR|NN const U8 * const s0                         \
                            |NN const U8 * const e
-AnidR  |Size_t |isSTRICT_UTF8_CHAR |NN const U8 * const s0                 \
+ATidR  |Size_t |isSTRICT_UTF8_CHAR |NN const U8 * const s0                 \
                                    |NN const U8 * const e
-AnidR  |Size_t |isC9_STRICT_UTF8_CHAR |NN const U8 * const s0              \
+ATidR  |Size_t |isC9_STRICT_UTF8_CHAR |NN const U8 * const s0              \
                                       |NN const U8 * const e
-AnmdpR |bool   |is_utf8_string |NN const U8 *s|STRLEN len
-AnidR  |bool   |is_utf8_string_flags                                       \
+ATmdpR |bool   |is_utf8_string |NN const U8 *s|STRLEN len
+ATidR  |bool   |is_utf8_string_flags                                       \
                |NN const U8 *s|STRLEN len|const U32 flags
-AnmdpR |bool   |is_strict_utf8_string|NN const U8 *s|STRLEN len
-AnmdpR |bool   |is_c9strict_utf8_string|NN const U8 *s|STRLEN len
-Anpdmb |bool   |is_utf8_string_loc                                         \
+ATmdpR |bool   |is_strict_utf8_string|NN const U8 *s|STRLEN len
+ATmdpR |bool   |is_c9strict_utf8_string|NN const U8 *s|STRLEN len
+ATpdmb |bool   |is_utf8_string_loc                                         \
                |NN const U8 *s|const STRLEN len|NN const U8 **ep
-Andm   |bool   |is_utf8_string_loc_flags                                   \
+ATdm   |bool   |is_utf8_string_loc_flags                                   \
                |NN const U8 *s|STRLEN len|NN const U8 **ep                 \
                |const U32 flags
-Andm   |bool   |is_strict_utf8_string_loc                                  \
+ATdm   |bool   |is_strict_utf8_string_loc                                  \
                |NN const U8 *s|STRLEN len|NN const U8 **ep
-Andm   |bool   |is_c9strict_utf8_string_loc                                \
+ATdm   |bool   |is_c9strict_utf8_string_loc                                \
                |NN const U8 *s|STRLEN len|NN const U8 **ep
-Anipd  |bool   |is_utf8_string_loclen                                      \
+ATipd  |bool   |is_utf8_string_loclen                                      \
                |NN const U8 *s|STRLEN len|NULLOK const U8 **ep             \
                |NULLOK STRLEN *el
-Anid   |bool   |is_utf8_string_loclen_flags                                \
+ATid   |bool   |is_utf8_string_loclen_flags                                \
                |NN const U8 *s|STRLEN len|NULLOK const U8 **ep             \
                |NULLOK STRLEN *el|const U32 flags
-Anid   |bool   |is_strict_utf8_string_loclen                               \
+ATid   |bool   |is_strict_utf8_string_loclen                               \
                |NN const U8 *s|STRLEN len|NULLOK const U8 **ep     \
                |NULLOK STRLEN *el
-Anid   |bool   |is_c9strict_utf8_string_loclen                             \
+ATid   |bool   |is_c9strict_utf8_string_loclen                             \
                |NN const U8 *s|STRLEN len|NULLOK const U8 **ep     \
                |NULLOK STRLEN *el
-Amnd   |bool   |is_utf8_fixed_width_buf_flags                              \
+AmTd   |bool   |is_utf8_fixed_width_buf_flags                              \
                |NN const U8 * const s|STRLEN len|const U32 flags
-Amnd   |bool   |is_utf8_fixed_width_buf_loc_flags                          \
+AmTd   |bool   |is_utf8_fixed_width_buf_loc_flags                          \
                |NN const U8 * const s|STRLEN len                           \
                |NULLOK const U8 **ep|const U32 flags
-Anid   |bool   |is_utf8_fixed_width_buf_loclen_flags                       \
+ATid   |bool   |is_utf8_fixed_width_buf_loclen_flags                       \
                |NN const U8 * const s|STRLEN len                           \
                |NULLOK const U8 **ep|NULLOK STRLEN *el|const U32 flags
-AmndP  |bool   |is_utf8_valid_partial_char                                 \
+AmTdP  |bool   |is_utf8_valid_partial_char                                 \
                |NN const U8 * const s|NN const U8 * const e
-AnidR  |bool   |is_utf8_valid_partial_char_flags                           \
+ATidR  |bool   |is_utf8_valid_partial_char_flags                           \
                |NN const U8 * const s|NN const U8 * const e|const U32 flags
-AMpR   |bool   |_is_uni_FOO|const U8 classnum|const UV c
-AMpR   |bool   |_is_utf8_FOO|U8 classnum|NN const U8 * const p             \
+AxpR   |bool   |_is_uni_FOO|const U8 classnum|const UV c
+AxpR   |bool   |_is_utf8_FOO|U8 classnum|NN const U8 * const p             \
                |NN const char * const name                                 \
                |NN const char * const alternative                          \
                |const bool use_utf8|const bool use_locale                  \
                |NN const char * const file|const unsigned line
-AMpR   |bool   |_is_utf8_FOO_with_len|const U8 classnum|NN const U8 *p     \
+AxpR   |bool   |_is_utf8_FOO_with_len|const U8 classnum|NN const U8 *p     \
                |NN const U8 * const e
-AbDMpR |bool   |is_utf8_alnum  |NN const U8 *p
-AbDMpR |bool   |is_utf8_alnumc |NN const U8 *p
-AbDMpR |bool   |is_utf8_idfirst|NN const U8 *p
-AbDMpR |bool   |is_utf8_xidfirst|NN const U8 *p
-AMpR   |bool   |_is_utf8_idcont|NN const U8 *p
-AMpR   |bool   |_is_utf8_idstart|NN const U8 *p
-AMpR   |bool   |_is_utf8_xidcont|NN const U8 *p
-AMpR   |bool   |_is_utf8_xidstart|NN const U8 *p
-AMpR   |bool   |_is_utf8_perl_idcont_with_len|NN const U8 *p               \
+AbDxpR |bool   |is_utf8_alnum  |NN const U8 *p
+AbDxpR |bool   |is_utf8_alnumc |NN const U8 *p
+AbDxpR |bool   |is_utf8_idfirst|NN const U8 *p
+AbDxpR |bool   |is_utf8_xidfirst|NN const U8 *p
+AxpR   |bool   |_is_utf8_idcont|NN const U8 *p
+AxpR   |bool   |_is_utf8_idstart|NN const U8 *p
+AxpR   |bool   |_is_utf8_xidcont|NN const U8 *p
+AxpR   |bool   |_is_utf8_xidstart|NN const U8 *p
+AxpR   |bool   |_is_utf8_perl_idcont_with_len|NN const U8 *p               \
                |NN const U8 * const e
-AMpR   |bool   |_is_utf8_perl_idstart_with_len|NN const U8 *p              \
+AxpR   |bool   |_is_utf8_perl_idstart_with_len|NN const U8 *p              \
                |NN const U8 * const e
-AbDMpR |bool   |is_utf8_idcont |NN const U8 *p
-AbDMpR |bool   |is_utf8_xidcont        |NN const U8 *p
-AbDMpR |bool   |is_utf8_alpha  |NN const U8 *p
-AbDMpR |bool   |is_utf8_ascii  |NN const U8 *p
-AbDMpR |bool   |is_utf8_blank  |NN const U8 *p
-AbDMpR |bool   |is_utf8_space  |NN const U8 *p
-AbDMpR |bool   |is_utf8_perl_space     |NN const U8 *p
-AbDMpR |bool   |is_utf8_perl_word      |NN const U8 *p
-AbDMpR |bool   |is_utf8_cntrl  |NN const U8 *p
-AbDMpR |bool   |is_utf8_digit  |NN const U8 *p
-AbDMpR |bool   |is_utf8_posix_digit    |NN const U8 *p
-AbDMpR |bool   |is_utf8_graph  |NN const U8 *p
-AbDMpR |bool   |is_utf8_upper  |NN const U8 *p
-AbDMpR |bool   |is_utf8_lower  |NN const U8 *p
-AbDMpR |bool   |is_utf8_print  |NN const U8 *p
-AbDMpR |bool   |is_utf8_punct  |NN const U8 *p
-AbDMpR |bool   |is_utf8_xdigit |NN const U8 *p
-AMpR   |bool   |_is_utf8_mark  |NN const U8 *p
-AbDMpR |bool   |is_utf8_mark   |NN const U8 *p
+AbDxpR |bool   |is_utf8_idcont |NN const U8 *p
+AbDxpR |bool   |is_utf8_xidcont        |NN const U8 *p
+AbDxpR |bool   |is_utf8_alpha  |NN const U8 *p
+AbDxpR |bool   |is_utf8_ascii  |NN const U8 *p
+AbDxpR |bool   |is_utf8_blank  |NN const U8 *p
+AbDxpR |bool   |is_utf8_space  |NN const U8 *p
+AbDxpR |bool   |is_utf8_perl_space     |NN const U8 *p
+AbDxpR |bool   |is_utf8_perl_word      |NN const U8 *p
+AbDxpR |bool   |is_utf8_cntrl  |NN const U8 *p
+AbDxpR |bool   |is_utf8_digit  |NN const U8 *p
+AbDxpR |bool   |is_utf8_posix_digit    |NN const U8 *p
+AbDxpR |bool   |is_utf8_graph  |NN const U8 *p
+AbDxpR |bool   |is_utf8_upper  |NN const U8 *p
+AbDxpR |bool   |is_utf8_lower  |NN const U8 *p
+AbDxpR |bool   |is_utf8_print  |NN const U8 *p
+AbDxpR |bool   |is_utf8_punct  |NN const U8 *p
+AbDxpR |bool   |is_utf8_xdigit |NN const U8 *p
+AxpR   |bool   |_is_utf8_mark  |NN const U8 *p
+AbDxpR |bool   |is_utf8_mark   |NN const U8 *p
 #if defined(PERL_CORE) || defined(PERL_EXT)
 EXdpR  |bool   |isSCRIPT_RUN   |NN const U8 *s|NN const U8 *send   \
                                |const bool utf8_target
@@ -917,45 +984,45 @@ p |OP*    |jmaybe         |NN OP *o
 : Used in pp.c 
 pP     |I32    |keyword        |NN const char *name|I32 len|bool all_keywords
 #if defined(PERL_IN_OP_C)
-s      |void   |inplace_aassign        |NN OP* o
+S      |void   |inplace_aassign        |NN OP* o
 #endif
 Ap     |void   |leave_scope    |I32 base
 p      |void   |notify_parser_that_changed_to_utf8
 : Public lexer API
-AMpd   |void   |lex_start      |NULLOK SV* line|NULLOK PerlIO *rsfp|U32 flags
-AMpd   |bool   |lex_bufutf8
-AMpd   |char*  |lex_grow_linestr|STRLEN len
-AMpd   |void   |lex_stuff_pvn  |NN const char* pv|STRLEN len|U32 flags
-AMpd   |void   |lex_stuff_pv   |NN const char* pv|U32 flags
-AMpd   |void   |lex_stuff_sv   |NN SV* sv|U32 flags
-AMpd   |void   |lex_unstuff    |NN char* ptr
-AMpd   |void   |lex_read_to    |NN char* ptr
-AMpd   |void   |lex_discard_to |NN char* ptr
-AMpd   |bool   |lex_next_chunk |U32 flags
-AMpd   |I32    |lex_peek_unichar|U32 flags
-AMpd   |I32    |lex_read_unichar|U32 flags
-AMpd   |void   |lex_read_space |U32 flags
+Axpd   |void   |lex_start      |NULLOK SV* line|NULLOK PerlIO *rsfp|U32 flags
+Axpd   |bool   |lex_bufutf8
+Axpd   |char*  |lex_grow_linestr|STRLEN len
+Axpd   |void   |lex_stuff_pvn  |NN const char* pv|STRLEN len|U32 flags
+Axpd   |void   |lex_stuff_pv   |NN const char* pv|U32 flags
+Axpd   |void   |lex_stuff_sv   |NN SV* sv|U32 flags
+Axpd   |void   |lex_unstuff    |NN char* ptr
+Axpd   |void   |lex_read_to    |NN char* ptr
+Axpd   |void   |lex_discard_to |NN char* ptr
+Axpd   |bool   |lex_next_chunk |U32 flags
+Axpd   |I32    |lex_peek_unichar|U32 flags
+Axpd   |I32    |lex_read_unichar|U32 flags
+Axpd   |void   |lex_read_space |U32 flags
 : Public parser API
-AMpd   |OP*    |parse_arithexpr|U32 flags
-AMpd   |OP*    |parse_termexpr |U32 flags
-AMpd   |OP*    |parse_listexpr |U32 flags
-AMpd   |OP*    |parse_fullexpr |U32 flags
-AMpd   |OP*    |parse_block    |U32 flags
-AMpd   |OP*    |parse_barestmt |U32 flags
-AMpd   |SV*    |parse_label    |U32 flags
-AMpd   |OP*    |parse_fullstmt |U32 flags
-AMpd   |OP*    |parse_stmtseq  |U32 flags
+Axpd   |OP*    |parse_arithexpr|U32 flags
+Axpd   |OP*    |parse_termexpr |U32 flags
+Axpd   |OP*    |parse_listexpr |U32 flags
+Axpd   |OP*    |parse_fullexpr |U32 flags
+Axpd   |OP*    |parse_block    |U32 flags
+Axpd   |OP*    |parse_barestmt |U32 flags
+Axpd   |SV*    |parse_label    |U32 flags
+Axpd   |OP*    |parse_fullstmt |U32 flags
+Axpd   |OP*    |parse_stmtseq  |U32 flags
 : Used in various files
 Apd    |void   |op_null        |NN OP* o
 : FIXME. Used by Data::Alias
 EXp    |void   |op_clear       |NN OP* o
 Ap     |void   |op_refcnt_lock
 Ap     |void   |op_refcnt_unlock
-Apdn   |OP*    |op_sibling_splice|NULLOK OP *parent|NULLOK OP *start \
+ApdT   |OP*    |op_sibling_splice|NULLOK OP *parent|NULLOK OP *start \
                |int del_count|NULLOK OP* insert
-Apdn   |OP*    |op_parent|NN OP *o
+ApdT   |OP*    |op_parent|NN OP *o
 #if defined(PERL_IN_OP_C)
-s      |OP*    |listkids       |NULLOK OP* o
+S      |OP*    |listkids       |NULLOK OP* o
 #endif
 p      |OP*    |list           |NULLOK OP* o
 Apd    |void   |load_module|U32 flags|NN SV* name|NULLOK SV* ver|...
@@ -965,7 +1032,7 @@ p  |OP*    |localize       |NN OP *o|I32 lex
 ApdR   |I32    |looks_like_number|NN SV *const sv
 Apd    |UV     |grok_bin       |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result
 #if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_DQUOTE_C)
-EMpRX  |bool   |grok_bslash_x  |NN char** s             \
+ExpRX  |bool   |grok_bslash_x  |NN char** s             \
                                |NN const char* const send       \
                                |NN UV* uv                       \
                                |NN const char** error_msg       \
@@ -973,8 +1040,8 @@ EMpRX      |bool   |grok_bslash_x  |NN char** s             \
                                |const bool strict               \
                                |const bool silence_non_portable \
                                |const bool utf8
-EMpRX  |char   |grok_bslash_c  |const char source|const bool output_warning
-EMpRX  |bool   |grok_bslash_o  |NN char** s             \
+ExpRX  |char   |grok_bslash_c  |const char source|const bool output_warning
+ExpRX  |bool   |grok_bslash_o  |NN char** s             \
                                |NN const char* const send       \
                                |NN UV* uv                       \
                                |NN const char** error_msg       \
@@ -982,9 +1049,9 @@ EMpRX      |bool   |grok_bslash_o  |NN char** s             \
                                |const bool strict               \
                                |const bool silence_non_portable \
                                |const bool utf8
-EMiR   |char*|form_short_octal_warning|NN const char * const s  \
+ExiR   |char*|form_short_octal_warning|NN const char * const s  \
                                |const STRLEN len
-EiRn   |I32    |regcurly       |NN const char *s
+EiRT   |I32    |regcurly       |NN const char *s
 #endif
 Apd    |UV     |grok_hex       |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result
 Apd    |int    |grok_infnan    |NN const char** sp|NN const char *send
@@ -992,7 +1059,7 @@ Apd        |int    |grok_number    |NN const char *pv|STRLEN len|NULLOK UV *valuep
 Apd    |int    |grok_number_flags|NN const char *pv|STRLEN len|NULLOK UV *valuep|U32 flags
 ApdR   |bool   |grok_numeric_radix|NN const char **sp|NN const char *send
 Apd    |UV     |grok_oct       |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result
-EXpn   |bool   |grok_atoUV     |NN const char* pv|NN UV* valptr|NULLOK const char** endptr
+EXpT   |bool   |grok_atoUV     |NN const char* pv|NN UV* valptr|NULLOK const char** endptr
 : These are all indirectly referenced by globals.c. This is somewhat annoying.
 p      |int    |magic_clearenv |NN SV* sv|NN MAGIC* mg
 p      |int    |magic_clear_all_env|NN SV* sv|NN MAGIC* mg
@@ -1063,7 +1130,7 @@ p |int    |magic_setcollxfrm|NN SV* sv|NN MAGIC* mg
 pb     |char*  |mem_collxfrm   |NN const char* input_string|STRLEN len|NN STRLEN* xlen
 : Defined in locale.c, used only in sv.c
 #   if defined(PERL_IN_LOCALE_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_MATHOMS_C)
-pM     |char*  |_mem_collxfrm  |NN const char* input_string    \
+px     |char*  |_mem_collxfrm  |NN const char* input_string    \
                                |STRLEN len                     \
                                |NN STRLEN* xlen                \
                                |bool utf8
@@ -1083,8 +1150,8 @@ Apd       |int    |mg_copy        |NN SV *sv|NN SV *nsv|NULLOK const char *key \
 : Defined in mg.c, used only in scope.c
 pd     |void   |mg_localize    |NN SV* sv|NN SV* nsv|bool setmagic
 Apd    |SV*    |sv_string_from_errnum|int errnum|NULLOK SV* tgtsv
-ApdRn  |MAGIC* |mg_find        |NULLOK const SV* sv|int type
-ApdRn  |MAGIC* |mg_findext     |NULLOK const SV* sv|int type|NULLOK const MGVTBL *vtbl
+ApdRT  |MAGIC* |mg_find        |NULLOK const SV* sv|int type
+ApdRT  |MAGIC* |mg_findext     |NULLOK const SV* sv|int type|NULLOK const MGVTBL *vtbl
 : exported for re.pm
 EXpR   |MAGIC* |mg_find_mglob  |NN SV* sv
 Apd    |int    |mg_free        |NN SV* sv
@@ -1092,35 +1159,35 @@ Apd     |void   |mg_free_type   |NN SV* sv|int how
 Apd    |void   |mg_freeext     |NN SV* sv|int how|NULLOK const MGVTBL *vtbl
 Apd    |int    |mg_get         |NN SV* sv
 ApdD   |U32    |mg_length      |NN SV* sv
-Apdn   |void   |mg_magical     |NN SV* sv
+ApdT   |void   |mg_magical     |NN SV* sv
 Apd    |int    |mg_set         |NN SV* sv
 Ap     |I32    |mg_size        |NN SV* sv
-Apn    |void   |mini_mktime    |NN struct tm *ptm
-AMmd   |OP*    |op_lvalue      |NULLOK OP* o|I32 type
+ApT    |void   |mini_mktime    |NN struct tm *ptm
+Axmd   |OP*    |op_lvalue      |NULLOK OP* o|I32 type
 poX    |OP*    |op_lvalue_flags|NULLOK OP* o|I32 type|U32 flags
 p      |void   |finalize_optree                |NN OP* o
 p      |void   |optimize_optree|NN OP* o
 #if defined(PERL_IN_OP_C)
-s      |void   |optimize_op    |NN OP* o
-s      |void   |finalize_op    |NN OP* o
-s      |void   |move_proto_attr|NN OP **proto|NN OP **attrs \
+S      |void   |optimize_op    |NN OP* o
+S      |void   |finalize_op    |NN OP* o
+S      |void   |move_proto_attr|NN OP **proto|NN OP **attrs \
                                |NN const GV *name|bool curstash
 #endif
 : Used in op.c and pp_sys.c
 p      |int    |mode_from_discipline|NULLOK const char* s|STRLEN len
 Ap     |const char*    |moreswitches   |NN const char* s
 Ap     |NV     |my_atof        |NN const char *s
-AnpR   |NV     |my_strtod      |NN const char * const s|NULLOK char ** e
+ATpR   |NV     |my_strtod      |NN const char * const s|NULLOK char ** e
 Apr    |void   |my_exit        |U32 status
 Apr    |void   |my_failure_exit
 Ap     |I32    |my_fflush_all
-Anp    |Pid_t  |my_fork
-Anp    |void   |atfork_lock
-Anp    |void   |atfork_unlock
+ATp    |Pid_t  |my_fork
+ATp    |void   |atfork_lock
+ATp    |void   |atfork_unlock
 Apmb   |I32    |my_lstat
 pX     |I32    |my_lstat_flags |NULLOK const U32 flags
 #if ! defined(HAS_MEMRCHR) && (defined(PERL_CORE) || defined(PERL_EXT))
-Exin   |void * |my_memrchr     |NN const char * s|const char c|const STRLEN len
+EeiT   |void * |my_memrchr     |NN const char * s|const char c|const STRLEN len
 #endif
 #if !defined(PERL_IMPLICIT_SYS)
 Ap     |I32    |my_pclose      |NULLOK PerlIO* ptr
@@ -1133,8 +1200,8 @@ pX        |I32    |my_stat_flags  |NULLOK const U32 flags
 Afp    |char * |my_strftime    |NN const char *fmt|int sec|int min|int hour|int mday|int mon|int year|int wday|int yday|int isdst
 : Used in pp_ctl.c
 p      |void   |my_unexec
-AbDMnPR        |UV     |NATIVE_TO_NEED |const UV enc|const UV ch
-AbDMnPR        |UV     |ASCII_TO_NEED  |const UV enc|const UV ch
+AbDxTPR        |UV     |NATIVE_TO_NEED |const UV enc|const UV ch
+AbDxTPR        |UV     |ASCII_TO_NEED  |const UV enc|const UV ch
 ApR    |OP*    |newANONLIST    |NULLOK OP* o
 ApR    |OP*    |newANONHASH    |NULLOK OP* o
 Ap     |OP*    |newANONSUB     |I32 floor|NULLOK OP* proto|NULLOK OP* block
@@ -1148,7 +1215,7 @@ Ap        |void   |newFORM        |I32 floor|NULLOK OP* o|NULLOK OP* block
 ApdR   |OP*    |newFOROP       |I32 flags|NULLOK OP* sv|NN OP* expr|NULLOK OP* block|NULLOK OP* cont
 ApdR   |OP*    |newGIVENOP     |NN OP* cond|NN OP* block|PADOFFSET defsv_off
 ApdR   |OP*    |newLOGOP       |I32 optype|I32 flags|NN OP *first|NN OP *other
-pM     |LOGOP* |alloc_LOGOP    |I32 type|NULLOK OP *first|NULLOK OP *other
+px     |LOGOP* |alloc_LOGOP    |I32 type|NULLOK OP *first|NULLOK OP *other
 ApdR   |OP*    |newLOOPEX      |I32 type|NN OP* label
 ApdR   |OP*    |newLOOPOP      |I32 flags|I32 debuggable|NULLOK OP* expr|NULLOK OP* block
 ApdR   |OP*    |newNULLLIST
@@ -1165,10 +1232,10 @@ pd      |CV *   |newXS_len_flags|NULLOK const char *name|STRLEN len \
                                |NULLOK const char *const proto \
                                |NULLOK SV **const_svp|U32 flags
 pX     |CV *   |newXS_deffile  |NN const char *name|NN XSUBADDR_t subaddr
-ApM    |CV *   |newXS_flags    |NULLOK const char *name|NN XSUBADDR_t subaddr\
+Apx    |CV *   |newXS_flags    |NULLOK const char *name|NN XSUBADDR_t subaddr\
                                |NN const char *const filename \
                                |NULLOK const char *const proto|U32 flags
-Apd    |CV*    |newXS          |NULLOK const char *name|NN XSUBADDR_t subaddr\
+ApdU   |CV*    |newXS          |NULLOK const char *name|NN XSUBADDR_t subaddr\
                                |NN const char *filename
 ApmdbR |AV*    |newAV
 ApR    |OP*    |newAVREF       |NN OP* o
@@ -1183,9 +1250,9 @@ ApmdbR    |HV*    |newHV
 ApR    |HV*    |newHVhv        |NULLOK HV *hv
 ApRbm  |IO*    |newIO
 ApdR   |OP*    |newLISTOP      |I32 type|I32 flags|NULLOK OP* first|NULLOK OP* last
-AMpdRn |PADNAME *|newPADNAMEouter|NN PADNAME *outer
-AMpdRn |PADNAME *|newPADNAMEpvn|NN const char *s|STRLEN len
-AMpdRn |PADNAMELIST *|newPADNAMELIST|size_t max
+AxpdRT |PADNAME *|newPADNAMEouter|NN PADNAME *outer
+AxpdRT |PADNAME *|newPADNAMEpvn|NN const char *s|STRLEN len
+AxpdRT |PADNAMELIST *|newPADNAMELIST|size_t max
 #ifdef USE_ITHREADS
 ApdR   |OP*    |newPADOP       |I32 type|I32 flags|NN SV* sv
 #endif
@@ -1236,7 +1303,7 @@ Apd       |void   |cv_set_call_checker_flags|NN CV *cv \
                                          |NN Perl_call_checker ckfun \
                                          |NN SV *ckobj|U32 ckflags
 Apd    |void   |wrap_op_checker|Optype opcode|NN Perl_check_t new_checker|NN Perl_check_t *old_checker_p
-AMpd   |void   |wrap_keyword_plugin|NN Perl_keyword_plugin_t new_plugin|NN Perl_keyword_plugin_t *old_plugin_p
+Axpd   |void   |wrap_keyword_plugin|NN Perl_keyword_plugin_t new_plugin|NN Perl_keyword_plugin_t *old_plugin_p
 ApR    |PERL_SI*|new_stackinfo|I32 stitems|I32 cxitems
 Ap     |char*  |scan_vstring   |NN const char *s|NN const char *const e \
                                |NN SV *sv
@@ -1253,15 +1320,10 @@ Apd     |SV*    |vstringify     |NN SV *vs
 Apd    |int    |vcmp           |NN SV *lhv|NN SV *rhv
 : Used in pp_hot.c and pp_sys.c
 p      |PerlIO*|nextargv       |NN GV* gv|bool nomagicopen
-#ifdef HAS_MEMMEM
-AdnopP |char*  |ninstr         |NN const char* big|NN const char* bigend \
-                               |NN const char* little|NN const char* lend
-#else
-AdnpP  |char*  |ninstr         |NN const char* big|NN const char* bigend \
+AdMTpP |char*  |ninstr         |NN const char* big|NN const char* bigend \
                                |NN const char* little|NN const char* lend
-#endif
 Apd    |void   |op_free        |NULLOK OP* arg
-Mp     |OP*    |op_unscope     |NULLOK OP* o
+xp     |OP*    |op_unscope     |NULLOK OP* o
 #ifdef PERL_CORE
 p      |void   |opslab_free    |NN OPSLAB *slab
 p      |void   |opslab_free_nopad|NN OPSLAB *slab
@@ -1275,7 +1337,7 @@ p |void   |package_version|NN OP* v
 p      |PADOFFSET|allocmy      |NN const char *const name|const STRLEN len\
                                |const U32 flags
 #ifdef USE_ITHREADS
-AMp    |PADOFFSET|alloccopstash|NN HV *hv
+Axp    |PADOFFSET|alloccopstash|NN HV *hv
 #endif
 : Used in perly.y
 pR     |OP*    |oopsAV         |NN OP* o
@@ -1286,12 +1348,12 @@ pR      |OP*    |oopsHV         |NN OP* o
 p      |void   |peep           |NULLOK OP* o
 p      |void   |rpeep          |NULLOK OP* o
 : Defined in doio.c, used only in pp_hot.c
-dopM   |PerlIO*|start_glob     |NN SV *tmpglob|NN IO *io
+dopx   |PerlIO*|start_glob     |NN SV *tmpglob|NN IO *io
 
 Ap     |void   |reentrant_size
 Ap     |void   |reentrant_init
 Ap     |void   |reentrant_free
-Anp    |void*  |reentrant_retry|NN const char *f|...
+ATp    |void*  |reentrant_retry|NN const char *f|...
 
 : "Very" special - can't use the O flag for this one:
 : (The rename from perl_atexit to Perl_call_atexit was in 864dbfa3ca8032ef)
@@ -1309,46 +1371,46 @@ ApdO    |AV*    |get_av         |NN const char *name|I32 flags
 ApdO   |HV*    |get_hv         |NN const char *name|I32 flags
 ApdO   |CV*    |get_cv         |NN const char* name|I32 flags
 Apd    |CV*    |get_cvn_flags  |NN const char* name|STRLEN len|I32 flags
-Ando   |const char*|Perl_setlocale|const int category|NULLOK const char* locale
+ATdo   |const char*|Perl_setlocale|const int category|NULLOK const char* locale
 #if defined(HAS_NL_LANGINFO) && defined(PERL_LANGINFO_H)
-Ando   |const char*|Perl_langinfo|const nl_item item
+ATdo   |const char*|Perl_langinfo|const nl_item item
 #else
-Ando   |const char*|Perl_langinfo|const int item
+ATdo   |const char*|Perl_langinfo|const int item
 #endif
-ApOM   |int    |init_i18nl10n  |int printwarn
-AbpOM  |int    |init_i18nl14n  |int printwarn
+ApOx   |int    |init_i18nl10n  |int printwarn
+AbpOx  |int    |init_i18nl14n  |int printwarn
 p      |char*  |my_strerror    |const int errnum
-Xpn    |void   |_warn_problematic_locale
+XpT    |void   |_warn_problematic_locale
 Xp     |void   |set_numeric_underlying
 Xp     |void   |set_numeric_standard
 Xp     |bool   |_is_in_locale_category|const bool compiling|const int category
-Apdn   |void   |switch_to_global_locale
-Apdn   |bool   |sync_locale
-ApMn   |void   |thread_locale_init
-ApMn   |void   |thread_locale_term
+ApdT   |void   |switch_to_global_locale
+ApdT   |bool   |sync_locale
+ApxT   |void   |thread_locale_init
+ApxT   |void   |thread_locale_term
 ApdO   |void   |require_pv     |NN const char* pv
 Abpd   |void   |pack_cat       |NN SV *cat|NN const char *pat|NN const char *patend \
                                |NN SV **beglist|NN SV **endlist|NN SV ***next_in_list|U32 flags
 Apd    |void   |packlist       |NN SV *cat|NN const char *pat|NN const char *patend|NN SV **beglist|NN SV **endlist
 #if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C)
-s      |void   |pidgone        |Pid_t pid|int status
+S      |void   |pidgone        |Pid_t pid|int status
 #endif
 : Used in perly.y
 p      |OP*    |pmruntime      |NN OP *o|NN OP *expr|NULLOK OP *repl \
                                |UV flags|I32 floor
 #if defined(PERL_IN_OP_C)
-s      |OP*    |pmtrans        |NN OP* o|NN OP* expr|NN OP* repl
+S      |OP*    |pmtrans        |NN OP* o|NN OP* expr|NN OP* repl
 #endif
 Ap     |void   |pop_scope
 Ap     |void   |push_scope
 Apmb   |OP*    |ref            |NULLOK OP* o|I32 type
 #if defined(PERL_IN_OP_C)
-s      |OP*    |refkids        |NULLOK OP* o|I32 type
+S      |OP*    |refkids        |NULLOK OP* o|I32 type
 #endif
 Ap     |void   |regdump        |NN const regexp* r
 #if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_PERL_C) || defined(PERL_IN_UTF8_C)
 EXpR   |SV*    |_new_invlist_C_array|NN const UV* const list
-EXMp   |bool   |_invlistEQ     |NN SV* const a|NN SV* const b|const bool complement_b
+EXxp   |bool   |_invlistEQ     |NN SV* const a|NN SV* const b|const bool complement_b
 #endif
 Ap     |I32    |pregexec       |NN REGEXP * const prog|NN char* stringarg \
                                |NN char* strend|NN char* strbeg \
@@ -1404,8 +1466,8 @@ EXp       |I32|reg_numbered_buff_length|NN REGEXP * const rx|NN const SV * const sv|co
 : FIXME - is anything in re using this now?
 EXp    |SV*|reg_qr_package|NN REGEXP * const rx
 
-Anp    |void   |repeatcpy      |NN char* to|NN const char* from|I32 len|IV count
-AdnpP  |char*  |rninstr        |NN const char* big|NN const char* bigend \
+ATp    |void   |repeatcpy      |NN char* to|NN const char* from|I32 len|IV count
+AdTpP  |char*  |rninstr        |NN const char* big|NN const char* bigend \
                                |NN const char* little|NN const char* lend
 Ap     |Sighandler_t|rsignal   |int i|Sighandler_t t
 : Used in pp_sys.c
@@ -1414,8 +1476,8 @@ p |int    |rsignal_restore|int i|NULLOK Sigsave_t* t
 p      |int    |rsignal_save   |int i|Sighandler_t t1|NN Sigsave_t* save
 Ap     |Sighandler_t|rsignal_state|int i
 #if defined(PERL_IN_PP_CTL_C)
-s      |void   |rxres_free     |NN void** rsp
-s      |void   |rxres_restore  |NN void **rsp|NN REGEXP *rx
+S      |void   |rxres_free     |NN void** rsp
+S      |void   |rxres_restore  |NN void **rsp|NN REGEXP *rx
 #endif
 : Used in pp_hot.c
 p      |void   |rxres_save     |NN void **rsp|NN REGEXP *rx
@@ -1480,14 +1542,14 @@ Ap      |void   |save_padsv_and_mortalize|PADOFFSET off
 Ap     |void   |save_sptr      |NN SV** sptr
 Xp     |void   |save_strlen    |NN STRLEN* ptr
 Ap     |SV*    |save_svref     |NN SV** sptr
-AMpo   |void   |savetmps
+Axpo   |void   |savetmps
 Ap     |void   |save_pushptr   |NULLOK void *const ptr|const int type
 Ap     |void   |save_pushi32ptr|const I32 i|NULLOK void *const ptr|const int type
 : Used by SAVESWITCHSTACK() in pp.c
 Ap     |void   |save_pushptrptr|NULLOK void *const ptr1 \
                                |NULLOK void *const ptr2|const int type
 #if defined(PERL_IN_SCOPE_C)
-s      |void   |save_pushptri32ptr|NULLOK void *const ptr1|const I32 i \
+S      |void   |save_pushptri32ptr|NULLOK void *const ptr1|const I32 i \
                                |NULLOK void *const ptr2|const int type
 #endif
 : Used in perly.y
@@ -1496,8 +1558,8 @@ Apd       |OP*    |op_contextualize|NN OP* o|I32 context
 : Used in perly.y
 p      |OP*    |scalar         |NULLOK OP* o
 #if defined(PERL_IN_OP_C)
-s      |OP*    |scalarkids     |NULLOK OP* o
-s      |OP*    |scalarseq      |NULLOK OP* o
+S      |OP*    |scalarkids     |NULLOK OP* o
+S      |OP*    |scalarseq      |NULLOK OP* o
 #endif
 : Used in pp_ctl.c
 p      |OP*    |scalarvoid     |NN OP* o
@@ -1505,18 +1567,18 @@ Apd     |NV     |scan_bin       |NN const char* start|STRLEN len|NN STRLEN* retlen
 Apd    |NV     |scan_hex       |NN const char* start|STRLEN len|NN STRLEN* retlen
 Ap     |char*  |scan_num       |NN const char* s|NN YYSTYPE *lvalp
 Apd    |NV     |scan_oct       |NN const char* start|STRLEN len|NN STRLEN* retlen
-AMpd   |OP*    |op_scope       |NULLOK OP* o
+Axpd   |OP*    |op_scope       |NULLOK OP* o
 : Only used by perl.c/miniperl.c, but defined in caretx.c
-px     |void   |set_caret_X
+pe     |void   |set_caret_X
 Apd    |void   |setdefout      |NN GV* gv
 Ap     |HEK*   |share_hek      |NN const char* str|SSize_t len|U32 hash
 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
 : Used in perl.c
-np     |Signal_t |sighandler   |int sig|NULLOK siginfo_t *info|NULLOK void *uap
-Anp    |Signal_t |csighandler  |int sig|NULLOK siginfo_t *info|NULLOK void *uap
+Tp     |Signal_t |sighandler   |int sig|NULLOK siginfo_t *info|NULLOK void *uap
+ATp    |Signal_t |csighandler  |int sig|NULLOK siginfo_t *info|NULLOK void *uap
 #else
-np     |Signal_t |sighandler   |int sig
-Anp    |Signal_t |csighandler  |int sig
+Tp     |Signal_t |sighandler   |int sig
+ATp    |Signal_t |csighandler  |int sig
 #endif
 Ap     |SV**   |stack_grow     |NN SV** sp|NN SV** p|SSize_t n
 Ap     |I32    |start_subparse |I32 is_format|U32 flags
@@ -1529,14 +1591,14 @@ Apd     |CV*    |sv_2cv         |NULLOK SV* sv|NN HV **const st|NN GV **const gvp \
                                |const I32 lref
 Apd    |IO*    |sv_2io         |NN SV *const sv
 #if defined(PERL_IN_SV_C)
-s      |bool   |glob_2number   |NN GV* const gv
+S      |bool   |glob_2number   |NN GV* const gv
 #endif
 Apmb   |IV     |sv_2iv         |NN SV *sv
 Apd    |IV     |sv_2iv_flags   |NN SV *const sv|const I32 flags
 Apd    |SV*    |sv_2mortal     |NULLOK SV *const sv
 Apd    |NV     |sv_2nv_flags   |NN SV *const sv|const I32 flags
 : Used in pp.c, pp_hot.c, sv.c
-pMd    |SV*    |sv_2num        |NN SV *const sv
+pxd    |SV*    |sv_2num        |NN SV *const sv
 Apmb   |char*  |sv_2pv         |NN SV *sv|NULLOK STRLEN *lp
 Apd    |char*  |sv_2pv_flags   |NN SV *const sv|NULLOK STRLEN *const lp|const I32 flags
 Apd    |char*  |sv_2pvutf8     |NN SV *sv|NULLOK STRLEN *const lp
@@ -1552,15 +1614,15 @@ Abpd    |char*  |sv_pvutf8n     |NN SV *sv|NN STRLEN *lp
 Abpd   |char*  |sv_pvbyten     |NN SV *sv|NN STRLEN *lp
 Apd    |I32    |sv_true        |NULLOK SV *const sv
 #if defined(PERL_IN_SV_C)
-sd     |void   |sv_add_arena   |NN char *const ptr|const U32 size \
+Sd     |void   |sv_add_arena   |NN char *const ptr|const U32 size \
                                |const U32 flags
 #endif
-Apdn   |void   |sv_backoff     |NN SV *const sv
+ApdT   |void   |sv_backoff     |NN SV *const sv
 Apd    |SV*    |sv_bless       |NN SV *const sv|NN HV *const stash
 #if defined(PERL_DEBUG_READONLY_COW)
 p      |void   |sv_buf_to_ro   |NN SV *sv
 # if defined(PERL_IN_SV_C)
-s      |void   |sv_buf_to_rw   |NN SV *sv
+S      |void   |sv_buf_to_rw   |NN SV *sv
 # endif
 #endif
 Afpd   |void   |sv_catpvf      |NN SV *const sv|NN const char *const pat|...
@@ -1576,12 +1638,12 @@ pd      |I32    |sv_clean_all
 pd     |void   |sv_clean_objs
 Apd    |void   |sv_clear       |NN SV *const orig_sv
 #if defined(PERL_IN_SV_C)
-s      |bool   |curse          |NN SV * const sv|const bool check_refcnt
+S      |bool   |curse          |NN SV * const sv|const bool check_refcnt
 #endif
-Aopd   |I32    |sv_cmp         |NULLOK SV *const sv1|NULLOK SV *const sv2
+AMopd  |I32    |sv_cmp         |NULLOK SV *const sv1|NULLOK SV *const sv2
 Apd    |I32    |sv_cmp_flags   |NULLOK SV *const sv1|NULLOK SV *const sv2 \
                                |const U32 flags
-Aopd   |I32    |sv_cmp_locale  |NULLOK SV *const sv1|NULLOK SV *const sv2
+AMopd  |I32    |sv_cmp_locale  |NULLOK SV *const sv1|NULLOK SV *const sv2
 Apd    |I32    |sv_cmp_locale_flags    |NULLOK SV *const sv1 \
                                |NULLOK SV *const sv2|const U32 flags
 #if defined(USE_LOCALE_COLLATE)
@@ -1605,7 +1667,7 @@ ApdR      |bool   |sv_does_pvn    |NN SV* sv|NN const char *const name|const STRLEN len \
 Apbmd  |I32    |sv_eq          |NULLOK SV* sv1|NULLOK SV* sv2
 Apd    |I32    |sv_eq_flags    |NULLOK SV* sv1|NULLOK SV* sv2|const U32 flags
 Apd    |void   |sv_free        |NULLOK SV *const sv
-poMX   |void   |sv_free2       |NN SV *const sv|const U32 refcnt
+poxX   |void   |sv_free2       |NN SV *const sv|const U32 refcnt
 : Used only in perl.c
 pd     |void   |sv_free_arenas
 Apd    |char*  |sv_gets        |NN SV *const sv|NN PerlIO *const fp|I32 append
@@ -1627,11 +1689,11 @@ Apd     |void   |sv_magic       |NN SV *const sv|NULLOK SV *const obj|const int how \
 Apd    |MAGIC *|sv_magicext    |NN SV *const sv|NULLOK SV *const obj|const int how \
                                |NULLOK const MGVTBL *const vtbl|NULLOK const char *const name \
                                |const I32 namlen
-Ein    |bool   |sv_only_taint_gmagic|NN SV *sv
+EiT    |bool   |sv_only_taint_gmagic|NN SV *sv
 : exported for re.pm
 EXp    |MAGIC *|sv_magicext_mglob|NN SV *sv
 ApdbmR |SV*    |sv_mortalcopy  |NULLOK SV *const oldsv
-XpR    |SV*    |sv_mortalcopy_flags|NULLOK SV *const oldsv|U32 flags
+ApdR   |SV*    |sv_mortalcopy_flags|NULLOK SV *const oldsv|U32 flags
 ApdR   |SV*    |sv_newmortal
 Apd    |SV*    |sv_newref      |NULLOK SV *const sv
 Ap     |char*  |sv_peek        |NULLOK SV* sv
@@ -1693,64 +1755,64 @@ Apd     |void   |sv_vsetpvfn    |NN SV *const sv|NN const char *const pat|const STRLEN pa
                                |NULLOK va_list *const args|NULLOK SV **const svargs \
                                |const Size_t sv_count|NULLOK bool *const maybe_tainted
 ApR    |NV     |str_to_version |NN SV *sv
-EXpRM  |SV*    |swash_init     |NN const char* pkg|NN const char* name|NN SV* listsv|I32 minbits|I32 none
-EXpM   |UV     |swash_fetch    |NN SV *swash|NN const U8 *ptr|bool do_utf8
+EXpRx  |SV*    |swash_init     |NN const char* pkg|NN const char* name|NN SV* listsv|I32 minbits|I32 none
+EXpx   |UV     |swash_fetch    |NN SV *swash|NN const U8 *ptr|bool do_utf8
 #ifdef PERL_IN_REGCOMP_C
-EiMR   |SV*    |add_cp_to_invlist      |NULLOK SV* invlist|const UV cp
-EiMRn  |bool   |invlist_is_iterating|NN SV* const invlist
+EixR   |SV*    |add_cp_to_invlist      |NULLOK SV* invlist|const UV cp
+EixRT  |bool   |invlist_is_iterating|NN SV* const invlist
 #ifndef PERL_EXT_RE_BUILD
-EiMRn  |UV*    |_invlist_array_init    |NN SV* const invlist|const bool will_have_0
-EiMRn  |UV     |invlist_max    |NN SV* const invlist
-EsM    |void   |_append_range_to_invlist   |NN SV* const invlist|const UV start|const UV end
-EsM    |void   |invlist_extend    |NN SV* const invlist|const UV len
-EsM    |void   |invlist_replace_list_destroys_src|NN SV *dest|NN SV *src
-EiMRn  |IV*    |get_invlist_previous_index_addr|NN SV* invlist
-EiM    |void   |invlist_set_len|NN SV* const invlist|const UV len|const bool offset
-EiMn   |void   |invlist_set_previous_index|NN SV* const invlist|const IV index
-EiMRn  |IV     |invlist_previous_index|NN SV* const invlist
-EiMn   |void   |invlist_trim   |NN SV* invlist
-EiM    |void   |invlist_clear  |NN SV* invlist
-sM     |void   |initialize_invlist_guts|NN SV* invlist|const Size_t initial_size
-#endif
-EiMRn  |STRLEN*|get_invlist_iter_addr  |NN SV* invlist
-EiMn   |void   |invlist_iterinit|NN SV* invlist
-EsMRn  |bool   |invlist_iternext|NN SV* invlist|NN UV* start|NN UV* end
-EiMn   |void   |invlist_iterfinish|NN SV* invlist
-EiMRn  |UV     |invlist_highest|NN SV* const invlist
-EMRs   |SV*    |_make_exactf_invlist   |NN RExC_state_t *pRExC_state \
+EixRT  |UV*    |_invlist_array_init    |NN SV* const invlist|const bool will_have_0
+EixRT  |UV     |invlist_max    |NN SV* const invlist
+ESx    |void   |_append_range_to_invlist   |NN SV* const invlist|const UV start|const UV end
+ESx    |void   |invlist_extend    |NN SV* const invlist|const UV len
+ESx    |void   |invlist_replace_list_destroys_src|NN SV *dest|NN SV *src
+EixRT  |IV*    |get_invlist_previous_index_addr|NN SV* invlist
+Eix    |void   |invlist_set_len|NN SV* const invlist|const UV len|const bool offset
+EixT   |void   |invlist_set_previous_index|NN SV* const invlist|const IV index
+EixRT  |IV     |invlist_previous_index|NN SV* const invlist
+EixT   |void   |invlist_trim   |NN SV* invlist
+Eix    |void   |invlist_clear  |NN SV* invlist
+Sx     |void   |initialize_invlist_guts|NN SV* invlist|const Size_t initial_size
+#endif
+EixRT  |STRLEN*|get_invlist_iter_addr  |NN SV* invlist
+EixT   |void   |invlist_iterinit|NN SV* invlist
+ESxRT  |bool   |invlist_iternext|NN SV* invlist|NN UV* start|NN UV* end
+EixT   |void   |invlist_iterfinish|NN SV* invlist
+EixRT  |UV     |invlist_highest|NN SV* const invlist
+ExRS   |SV*    |_make_exactf_invlist   |NN RExC_state_t *pRExC_state \
                                        |NN regnode *node
-EsMR   |SV*    |invlist_contents|NN SV* const invlist              \
+ESxR   |SV*    |invlist_contents|NN SV* const invlist              \
                                 |const bool traditional_style
-EsRn   |bool   |new_regcurly   |NN const char *s|NN const char *e
+ESRT   |bool   |new_regcurly   |NN const char *s|NN const char *e
 #endif
 #if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_UTF8_C)
-EXmM   |void   |_invlist_intersection  |NN SV* const a|NN SV* const b|NN SV** i
-EXpM   |void   |_invlist_intersection_maybe_complement_2nd \
+EXmx   |void   |_invlist_intersection  |NN SV* const a|NN SV* const b|NN SV** i
+EXpx   |void   |_invlist_intersection_maybe_complement_2nd \
                |NULLOK SV* const a|NN SV* const b          \
                |const bool complement_b|NN SV** i
-EXmM   |void   |_invlist_union |NULLOK SV* const a|NN SV* const b|NN SV** output
-EXpM   |void   |_invlist_union_maybe_complement_2nd        \
+EXmx   |void   |_invlist_union |NULLOK SV* const a|NN SV* const b|NN SV** output
+EXpx   |void   |_invlist_union_maybe_complement_2nd        \
                |NULLOK SV* const a|NN SV* const b          \
                |const bool complement_b|NN SV** output
-EXmM   |void   |_invlist_subtract|NN SV* const a|NN SV* const b|NN SV** result
-EXpM   |void   |_invlist_invert|NN SV* const invlist
-EXMpR  |SV*    |_new_invlist   |IV initial_size
-EXMpR  |SV*    |_add_range_to_invlist  |NULLOK SV* invlist|UV start|UV end
-EXMpR  |SV*    |_setup_canned_invlist|const STRLEN size|const UV element0|NN UV** other_elements_ptr
+EXmx   |void   |_invlist_subtract|NN SV* const a|NN SV* const b|NN SV** result
+EXpx   |void   |_invlist_invert|NN SV* const invlist
+EXxpR  |SV*    |_new_invlist   |IV initial_size
+EXxpR  |SV*    |_add_range_to_invlist  |NULLOK SV* invlist|UV start|UV end
+EXxpR  |SV*    |_setup_canned_invlist|const STRLEN size|const UV element0|NN UV** other_elements_ptr
 #endif
 #if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_SV_C)
-EMpX   |SV*    |invlist_clone  |NN SV* const invlist|NULLOK SV* newlist
+ExpX   |SV*    |invlist_clone  |NN SV* const invlist|NULLOK SV* newlist
 #endif
 #if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UTF8_C) || defined(PERL_IN_PP_C)
-EiMRn  |UV*    |invlist_array  |NN SV* const invlist
-EiMRn  |bool   |is_invlist     |NULLOK SV* const invlist
-EiMRn  |bool*  |get_invlist_offset_addr|NN SV* invlist
-EiMRn  |UV     |_invlist_len   |NN SV* const invlist
-EMiRn  |bool   |_invlist_contains_cp|NN SV* const invlist|const UV cp
-EXpMRn |SSize_t|_invlist_search        |NN SV* const invlist|const UV cp
+EixRT  |UV*    |invlist_array  |NN SV* const invlist
+EixRT  |bool   |is_invlist     |NULLOK SV* const invlist
+EixRT  |bool*  |get_invlist_offset_addr|NN SV* invlist
+EixRT  |UV     |_invlist_len   |NN SV* const invlist
+ExiRT  |bool   |_invlist_contains_cp|NN SV* const invlist|const UV cp
+EXpxRT |SSize_t|_invlist_search        |NN SV* const invlist|const UV cp
 #endif
 #if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)
-EXpM   |SV*    |_get_regclass_nonbitmap_data                              \
+EXpx   |SV*    |_get_regclass_nonbitmap_data                              \
                                |NULLOK const regexp *prog                 \
                                |NN const struct regnode *node             \
                                |bool doinit                               \
@@ -1759,42 +1821,42 @@ EXpM    |SV*    |_get_regclass_nonbitmap_data                              \
                                |NULLOK SV **output_invlist
 #endif
 #if defined(PERL_IN_REGCOMP_C) || defined (PERL_IN_DUMP_C)
-EXMp   |void   |_invlist_dump  |NN PerlIO *file|I32 level   \
+EXxp   |void   |_invlist_dump  |NN PerlIO *file|I32 level   \
                                |NN const char* const indent \
                                |NN SV* const invlist
 #endif
 Ap     |void   |taint_env
 Ap     |void   |taint_proper   |NULLOK const char* f|NN const char *const s
-EpM    |char * |_byte_dump_string                                      \
+Epx    |char * |_byte_dump_string                                      \
                                |NN const U8 * const start              \
                                |const STRLEN len                       \
                                |const bool format
 #if defined(PERL_IN_UTF8_C)
-inR    |int    |does_utf8_overflow|NN const U8 * const s               \
+iTR    |int    |does_utf8_overflow|NN const U8 * const s               \
                                   |NN const U8 * e                     \
                                   |const bool consider_overlongs
-inR    |int    |is_utf8_overlong_given_start_byte_ok|NN const U8 * const s \
+iTR    |int    |is_utf8_overlong_given_start_byte_ok|NN const U8 * const s \
                                                     |const STRLEN len
-inR    |int    |isFF_OVERLONG  |NN const U8 * const s|const STRLEN len
-sMR    |char * |unexpected_non_continuation_text                       \
+iTR    |int    |isFF_OVERLONG  |NN const U8 * const s|const STRLEN len
+SxR    |char * |unexpected_non_continuation_text                       \
                |NN const U8 * const s                                  \
                |STRLEN print_len                                       \
                |const STRLEN non_cont_byte_pos                         \
                |const STRLEN expect_len
-s      |void   |warn_on_first_deprecated_use                               \
+S      |void   |warn_on_first_deprecated_use                               \
                                |NN const char * const name                 \
                                |NN const char * const alternative          \
                                |const bool use_locale                      \
                                |NN const char * const file                 \
                                |const unsigned line
-s      |U32    |check_and_deprecate                                        \
+S      |U32    |check_and_deprecate                                        \
                                |NN const U8 * p                            \
                                |NN const U8 ** e                           \
                                |const unsigned type                        \
                                |const bool use_locale                      \
                                |NN const char * const file                 \
                                |const unsigned line
-s      |UV     |_to_utf8_case  |const UV uv1                                   \
+S      |UV     |_to_utf8_case  |const UV uv1                                   \
                                |NULLOK const U8 *p                             \
                                |NN U8* ustrp                                   \
                                |NN STRLEN *lenp                                \
@@ -1803,28 +1865,28 @@ s       |UV     |_to_utf8_case  |const UV uv1                                   \
                                |NULLOK const unsigned int * const * const aux_tables   \
                                |NULLOK const U8 * const aux_table_lengths      \
                                |NN const char * const normal
-s      |UV     |turkic_fc      |NN const U8 * const p |NN const U8 * const e|NN U8* ustrp|NN STRLEN *lenp
-s      |UV     |turkic_lc      |NN const U8 * const p0|NN const U8 * const e|NN U8* ustrp|NN STRLEN *lenp
-s      |UV     |turkic_uc      |NN const U8 * const p |NN const U8 * const e|NN U8* ustrp|NN STRLEN *lenp
+S      |UV     |turkic_fc      |NN const U8 * const p |NN const U8 * const e|NN U8* ustrp|NN STRLEN *lenp
+S      |UV     |turkic_lc      |NN const U8 * const p0|NN const U8 * const e|NN U8* ustrp|NN STRLEN *lenp
+S      |UV     |turkic_uc      |NN const U8 * const p |NN const U8 * const e|NN U8* ustrp|NN STRLEN *lenp
 #endif
 ApbmdD |UV     |to_utf8_lower  |NN const U8 *p|NN U8* ustrp|NULLOK STRLEN *lenp
-AMp    |UV     |_to_utf8_lower_flags|NN const U8 *p|NULLOK const U8* e         \
+Axp    |UV     |_to_utf8_lower_flags|NN const U8 *p|NULLOK const U8* e         \
                                |NN U8* ustrp|NULLOK STRLEN *lenp|bool flags    \
                                |NN const char * const file|const int line
 ApbmdD |UV     |to_utf8_upper  |NN const U8 *p|NN U8* ustrp|NULLOK STRLEN *lenp
-AMp    |UV     |_to_utf8_upper_flags   |NN const U8 *p|NULLOK const U8 *e      \
+Axp    |UV     |_to_utf8_upper_flags   |NN const U8 *p|NULLOK const U8 *e      \
                                |NN U8* ustrp|NULLOK STRLEN *lenp|bool flags    \
                                |NN const char * const file|const int line
 ApbmdD |UV     |to_utf8_title  |NN const U8 *p|NN U8* ustrp|NULLOK STRLEN *lenp
-AMp    |UV     |_to_utf8_title_flags   |NN const U8 *p|NULLOK const U8* e      \
+Axp    |UV     |_to_utf8_title_flags   |NN const U8 *p|NULLOK const U8* e      \
                                |NN U8* ustrp|NULLOK STRLEN *lenp|bool flags    \
                                |NN const char * const file|const int line
 ApbmdD |UV     |to_utf8_fold   |NN const U8 *p|NN U8* ustrp|NULLOK STRLEN *lenp
-AMp    |UV     |_to_utf8_fold_flags|NN const U8 *p|NULLOK const U8 *e          \
+Axp    |UV     |_to_utf8_fold_flags|NN const U8 *p|NULLOK const U8 *e          \
                                |NN U8* ustrp|NULLOK STRLEN *lenp|U8 flags  \
                                |NN const char * const file|const int line
 #if defined(PERL_IN_MG_C) || defined(PERL_IN_PP_C)
-pn     |bool   |translate_substr_offsets|STRLEN curlen|IV pos1_iv \
+pT     |bool   |translate_substr_offsets|STRLEN curlen|IV pos1_iv \
                                         |bool pos1_is_uv|IV len_iv \
                                         |bool len_is_uv|NN STRLEN *posp \
                                         |NN STRLEN *lenp
@@ -1842,64 +1904,64 @@ Ap      |void   |unsharepvn     |NULLOK const char* sv|I32 len|U32 hash
 p      |void   |unshare_hek    |NULLOK HEK* hek
 : Used in perly.y
 p      |void   |utilize        |int aver|I32 floor|NULLOK OP* version|NN OP* idop|NULLOK OP* arg
-ApM    |void   |_force_out_malformed_utf8_message                          \
+Apx    |void   |_force_out_malformed_utf8_message                          \
                |NN const U8 *const p|NN const U8 * const e|const U32 flags \
                |const bool die_here
 EXp    |U8*    |utf16_to_utf8  |NN U8* p|NN U8 *d|I32 bytelen|NN I32 *newlen
 EXp    |U8*    |utf16_to_utf8_reversed|NN U8* p|NN U8 *d|I32 bytelen|NN I32 *newlen
 AdpR   |STRLEN |utf8_length    |NN const U8* s|NN const U8 *e
 AipdR  |IV     |utf8_distance  |NN const U8 *a|NN const U8 *b
-AipdRn |U8*    |utf8_hop       |NN const U8 *s|SSize_t off
-AipdRn |U8*    |utf8_hop_back|NN const U8 *s|SSize_t off|NN const U8 *start
-AipdRn |U8*    |utf8_hop_forward|NN const U8 *s|SSize_t off|NN const U8 *end
-AipdRn |U8*    |utf8_hop_safe  |NN const U8 *s|SSize_t off|NN const U8 *start|NN const U8 *end
-ApMd   |U8*    |utf8_to_bytes  |NN U8 *s|NN STRLEN *lenp
+AipdRT |U8*    |utf8_hop       |NN const U8 *s|SSize_t off
+AipdRT |U8*    |utf8_hop_back|NN const U8 *s|SSize_t off|NN const U8 *start
+AipdRT |U8*    |utf8_hop_forward|NN const U8 *s|SSize_t off|NN const U8 *end
+AipdRT |U8*    |utf8_hop_safe  |NN const U8 *s|SSize_t off|NN const U8 *start|NN const U8 *end
+Apxd   |U8*    |utf8_to_bytes  |NN U8 *s|NN STRLEN *lenp
 Apd    |int    |bytes_cmp_utf8 |NN const U8 *b|STRLEN blen|NN const U8 *u \
                                |STRLEN ulen
-AModp  |U8*    |bytes_from_utf8|NN const U8 *s|NN STRLEN *lenp|NN bool *is_utf8p
-AMnp   |U8*    |bytes_from_utf8_loc|NN const U8 *s                         \
+AMxdp  |U8*    |bytes_from_utf8|NN const U8 *s|NN STRLEN *lenp|NN bool *is_utf8p
+AxTp   |U8*    |bytes_from_utf8_loc|NN const U8 *s                         \
                                    |NN STRLEN *lenp                        \
                                    |NN bool *is_utf8p                      \
                                    |NULLOK const U8 ** first_unconverted
-ApMd   |U8*    |bytes_to_utf8  |NN const U8 *s|NN STRLEN *lenp
+Apxd   |U8*    |bytes_to_utf8  |NN const U8 *s|NN STRLEN *lenp
 ApdD   |UV     |utf8_to_uvchr  |NN const U8 *s|NULLOK STRLEN *retlen
 AbpdD  |UV     |utf8_to_uvuni  |NN const U8 *s|NULLOK STRLEN *retlen
-AbpMD  |UV     |valid_utf8_to_uvuni    |NN const U8 *s|NULLOK STRLEN *retlen
-Aopd   |UV     |utf8_to_uvchr_buf      |NN const U8 *s|NN const U8 *send|NULLOK STRLEN *retlen
+AbpxD  |UV     |valid_utf8_to_uvuni    |NN const U8 *s|NULLOK STRLEN *retlen
+AMpd   |UV     |utf8_to_uvchr_buf      |NN const U8 *s|NN const U8 *send|NULLOK STRLEN *retlen
 ApdD   |UV     |utf8_to_uvuni_buf      |NN const U8 *s|NN const U8 *send|NULLOK STRLEN *retlen
-pM     |bool   |check_utf8_print       |NN const U8 *s|const STRLEN len
+px     |bool   |check_utf8_print       |NN const U8 *s|const STRLEN len
 
-Adnop  |UV     |utf8n_to_uvchr |NN const U8 *s                             \
+AdMTp  |UV     |utf8n_to_uvchr |NN const U8 *s                             \
                                |STRLEN curlen                              \
                                |NULLOK STRLEN *retlen                      \
                                |const U32 flags
-Adnop  |UV     |utf8n_to_uvchr_error|NN const U8 *s                        \
+AdMTp  |UV     |utf8n_to_uvchr_error|NN const U8 *s                        \
                                |STRLEN curlen                              \
                                |NULLOK STRLEN *retlen                      \
                                |const U32 flags                            \
                                |NULLOK U32 * errors
-AMndi  |UV     |utf8n_to_uvchr_msgs|NN const U8 *s                         \
+AxTdi  |UV     |utf8n_to_uvchr_msgs|NN const U8 *s                         \
                                |STRLEN curlen                              \
                                |NULLOK STRLEN *retlen                      \
                                |const U32 flags                            \
                                |NULLOK U32 * errors                        \
                                |NULLOK AV ** msgs
-AMnp   |UV     |_utf8n_to_uvchr_msgs_helper                                \
+AxTp   |UV     |_utf8n_to_uvchr_msgs_helper                                \
                                |NN const U8 *s                             \
                                |STRLEN curlen                              \
                                |NULLOK STRLEN *retlen                      \
                                |const U32 flags                            \
                                |NULLOK U32 * errors                        \
                                |NULLOK AV ** msgs
-AipnR  |UV     |valid_utf8_to_uvchr    |NN const U8 *s|NULLOK STRLEN *retlen
+AipTR  |UV     |valid_utf8_to_uvchr    |NN const U8 *s|NULLOK STRLEN *retlen
 Ap     |UV     |utf8n_to_uvuni|NN const U8 *s|STRLEN curlen|NULLOK STRLEN *retlen|U32 flags
 
 Adm    |U8*    |uvchr_to_utf8  |NN U8 *d|UV uv
 Ap     |U8*    |uvuni_to_utf8  |NN U8 *d|UV uv
 Adm    |U8*    |uvchr_to_utf8_flags    |NN U8 *d|UV uv|UV flags
-AdmM   |U8*    |uvchr_to_utf8_flags_msgs|NN U8 *d|UV uv|UV flags|NULLOK HV ** msgs
-Apod   |U8*    |uvoffuni_to_utf8_flags |NN U8 *d|UV uv|const UV flags
-ApM    |U8*    |uvoffuni_to_utf8_flags_msgs|NN U8 *d|UV uv|const UV flags|NULLOK HV** msgs
+Admx   |U8*    |uvchr_to_utf8_flags_msgs|NN U8 *d|UV uv|UV flags|NULLOK HV ** msgs
+AMpod  |U8*    |uvoffuni_to_utf8_flags |NN U8 *d|UV uv|const UV flags
+Apx    |U8*    |uvoffuni_to_utf8_flags_msgs|NN U8 *d|UV uv|const UV flags|NULLOK HV** msgs
 Ap     |U8*    |uvuni_to_utf8_flags    |NN U8 *d|UV uv|UV flags
 Apd    |char*  |pv_uni_display |NN SV *dsv|NN const U8 *spv|STRLEN len|STRLEN pvlim|UV flags
 ApdR   |char*  |sv_uni_display |NN SV *dsv|NN SV *ssv|STRLEN pvlim|UV flags
@@ -1915,8 +1977,8 @@ p |I32    |wait4pid       |Pid_t pid|NN int* statusp|int flags
 : Used in locale.c and perl.c
 p      |U32    |parse_unicode_opts|NN const char **popt
 Ap     |U32    |seed
-Xpno   |double |drand48_r      |NN perl_drand48_t *random_state
-Xpno   |void   |drand48_init_r |NN perl_drand48_t *random_state|U32 seed
+XpTo   |double |drand48_r      |NN perl_drand48_t *random_state
+XpTo   |void   |drand48_init_r |NN perl_drand48_t *random_state|U32 seed
 : Only used in perl.c
 p      |void   |get_hash_seed        |NN unsigned char * const seed_buffer
 : Used in doio.c, pp_hot.c, pp_sys.c
@@ -1952,7 +2014,7 @@ Ap        |I32    |whichsig_pvn   |NN const char* sig|STRLEN len
 : used to check for NULs in pathnames and other names
 AiR    |bool   |is_safe_syscall|NN const char *pv|STRLEN len|NN const char *what|NN const char *op_name
 #ifdef PERL_CORE
-inR    |bool   |should_warn_nl|NN const char *pv
+iTR    |bool   |should_warn_nl|NN const char *pv
 #endif
 : Used in pp_ctl.c
 p      |void   |write_to_stderr|NN SV* msv
@@ -1974,17 +2036,17 @@ p       |void   |parser_free_nexttoke_ops|NN yy_parser *parser \
                                         |NN OPSLAB *slab
 #endif
 #if defined(PERL_IN_TOKE_C)
-s      |int    |yywarn         |NN const char *const s|U32 flags
+S      |int    |yywarn         |NN const char *const s|U32 flags
 #endif
 #if defined(MYMALLOC)
 Ap     |void   |dump_mstats    |NN const char* s
 Ap     |int    |get_mstats     |NN perl_mstats_t *buf|int buflen|int level
 #endif
-Anpa   |Malloc_t|safesysmalloc |MEM_SIZE nbytes
-Anpa   |Malloc_t|safesyscalloc |MEM_SIZE elements|MEM_SIZE size
-AnpR   |Malloc_t|safesysrealloc|Malloc_t where|MEM_SIZE nbytes
-Anp    |Free_t |safesysfree    |Malloc_t where
-Asrnx  |void   |croak_memory_wrap
+ATpa   |Malloc_t|safesysmalloc |MEM_SIZE nbytes
+ATpa   |Malloc_t|safesyscalloc |MEM_SIZE elements|MEM_SIZE size
+ATpR   |Malloc_t|safesysrealloc|Malloc_t where|MEM_SIZE nbytes
+ATp    |Free_t |safesysfree    |Malloc_t where
+AirTe  |void   |croak_memory_wrap
 #if defined(PERL_GLOBAL_STRUCT)
 Ap     |struct perl_vars *|GetVars
 Ap     |struct perl_vars*|init_global_struct
@@ -2054,7 +2116,7 @@ Apd       |void   |sv_force_normal_flags|NN SV *const sv|const U32 flags
 pX     |SSize_t|tmps_grow_p    |SSize_t ix
 Apd    |SV*    |sv_rvweaken    |NN SV *const sv
 Apd    |SV*    |sv_rvunweaken  |NN SV *const sv
-AnpMd  |SV*    |sv_get_backrefs|NN SV *const sv
+ATpxd  |SV*    |sv_get_backrefs|NN SV *const sv
 : This is indirectly referenced by globals.c. This is somewhat annoying.
 p      |int    |magic_killbackrefs|NN SV *sv|NN MAGIC *mg
 Ap     |OP*    |newANONATTRSUB |I32 floor|NULLOK OP *proto|NULLOK OP *attrs|NULLOK OP *block
@@ -2081,9 +2143,9 @@ ApR       |DIR*   |dirp_dup       |NULLOK DIR *const dp|NN CLONE_PARAMS *const param
 ApR    |GP*    |gp_dup         |NULLOK GP *const gp|NN CLONE_PARAMS *const param
 ApR    |MAGIC* |mg_dup         |NULLOK MAGIC *mg|NN CLONE_PARAMS *const param
 #if defined(PERL_IN_SV_C)
-s      |SV **  |sv_dup_inc_multiple|NN SV *const *source|NN SV **dest \
+S      |SV **  |sv_dup_inc_multiple|NN SV *const *source|NN SV **dest \
                                |SSize_t items|NN CLONE_PARAMS *const param
-sR     |SV*    |sv_dup_common  |NN const SV *const sstr \
+SR     |SV*    |sv_dup_common  |NN const SV *const sstr \
                                |NN CLONE_PARAMS *const param
 #endif
 ApR    |SV*    |sv_dup         |NULLOK const SV *const sstr|NN CLONE_PARAMS *const param
@@ -2122,31 +2184,31 @@ Adp     |int    |nothreadhook
 p      |void   |init_constants
 
 #if defined(PERL_IN_DOOP_C)
-sR     |Size_t |do_trans_simple        |NN SV * const sv
-sR     |Size_t |do_trans_count         |NN SV * const sv
-sR     |Size_t |do_trans_complex       |NN SV * const sv
-sR     |Size_t |do_trans_simple_utf8   |NN SV * const sv
-sR     |Size_t |do_trans_count_utf8    |NN SV * const sv
-sR     |Size_t |do_trans_complex_utf8  |NN SV * const sv
+SR     |Size_t |do_trans_simple        |NN SV * const sv
+SR     |Size_t |do_trans_count         |NN SV * const sv
+SR     |Size_t |do_trans_complex       |NN SV * const sv
+SR     |Size_t |do_trans_simple_utf8   |NN SV * const sv
+SR     |Size_t |do_trans_count_utf8    |NN SV * const sv
+SR     |Size_t |do_trans_complex_utf8  |NN SV * const sv
 #endif
 
 #if defined(PERL_IN_GV_C)
-s      |void   |gv_init_svtype |NN GV *gv|const svtype sv_type
-s      |void   |gv_magicalize_isa      |NN GV *gv
-s      |bool|parse_gv_stash_name|NN HV **stash|NN GV **gv \
+S      |void   |gv_init_svtype |NN GV *gv|const svtype sv_type
+S      |void   |gv_magicalize_isa      |NN GV *gv
+S      |bool|parse_gv_stash_name|NN HV **stash|NN GV **gv \
                      |NN const char **name|NN STRLEN *len \
                      |NN const char *nambeg|STRLEN full_len \
                      |const U32 is_utf8|const I32 add
-s      |bool|find_default_stash|NN HV **stash|NN const char *name \
+S      |bool|find_default_stash|NN HV **stash|NN const char *name \
                      |STRLEN len|const U32 is_utf8|const I32 add \
                      |const svtype sv_type
-s      |bool|gv_magicalize|NN GV *gv|NN HV *stash|NN const char *name \
+S      |bool|gv_magicalize|NN GV *gv|NN HV *stash|NN const char *name \
                      |STRLEN len \
                      |const svtype sv_type
-s      |void|maybe_multimagic_gv|NN GV *gv|NN const char *name|const svtype sv_type
-s      |bool|gv_is_in_main|NN const char *name|STRLEN len \
+S      |void|maybe_multimagic_gv|NN GV *gv|NN const char *name|const svtype sv_type
+S      |bool|gv_is_in_main|NN const char *name|STRLEN len \
                       |const U32 is_utf8
-s      |void   |require_tie_mod|NN GV *gv|NN const char varname \
+S      |void   |require_tie_mod|NN GV *gv|NN const char varname \
                                |NN const char * name|STRLEN len \
                                |const U32 flags
 #endif
@@ -2156,196 +2218,197 @@ po    |SV*    |hfree_next_entry       |NN HV *hv|NN STRLEN *indexp
 #endif
 
 #if defined(PERL_IN_HV_C)
-s      |void   |hsplit         |NN HV *hv|STRLEN const oldsize|STRLEN newsize
-s      |void   |hv_free_entries|NN HV *hv
-s      |SV*    |hv_free_ent_ret|NN HV *hv|NN HE *entry
-sR     |HE*    |new_he
-sanR   |HEK*   |save_hek_flags |NN const char *str|I32 len|U32 hash|int flags
-sn     |void   |hv_magic_check |NN HV *hv|NN bool *needs_copy|NN bool *needs_store
-s      |void   |unshare_hek_or_pvn|NULLOK const HEK* hek|NULLOK const char* str|I32 len|U32 hash
-sR     |HEK*   |share_hek_flags|NN const char *str|STRLEN len|U32 hash|int flags
-rs     |void   |hv_notallowed  |int flags|NN const char *key|I32 klen|NN const char *msg
-in     |U32|ptr_hash|PTRV u
-s      |struct xpvhv_aux*|hv_auxinit|NN HV *hv
-sn     |struct xpvhv_aux*|hv_auxinit_internal|NN struct xpvhv_aux *iter
-sM     |SV*    |hv_delete_common|NULLOK HV *hv|NULLOK SV *keysv \
+S      |void   |hsplit         |NN HV *hv|STRLEN const oldsize|STRLEN newsize
+S      |void   |hv_free_entries|NN HV *hv
+S      |SV*    |hv_free_ent_ret|NN HV *hv|NN HE *entry
+SR     |HE*    |new_he
+SaTR   |HEK*   |save_hek_flags |NN const char *str|I32 len|U32 hash|int flags
+ST     |void   |hv_magic_check |NN HV *hv|NN bool *needs_copy|NN bool *needs_store
+S      |void   |unshare_hek_or_pvn|NULLOK const HEK* hek|NULLOK const char* str|I32 len|U32 hash
+SR     |HEK*   |share_hek_flags|NN const char *str|STRLEN len|U32 hash|int flags
+rS     |void   |hv_notallowed  |int flags|NN const char *key|I32 klen|NN const char *msg
+iT     |U32|ptr_hash|PTRV u
+S      |struct xpvhv_aux*|hv_auxinit|NN HV *hv
+ST     |struct xpvhv_aux*|hv_auxinit_internal|NN struct xpvhv_aux *iter
+Sx     |SV*    |hv_delete_common|NULLOK HV *hv|NULLOK SV *keysv \
                |NULLOK const char *key|STRLEN klen|int k_flags|I32 d_flags \
                |U32 hash
-sM     |void   |clear_placeholders     |NN HV *hv|U32 items
+Sx     |void   |clear_placeholders     |NN HV *hv|U32 items
 #endif
 
 #if defined(PERL_IN_MG_C)
-s      |void   |save_magic_flags|I32 mgs_ix|NN SV *sv|U32 flags
-s      |int    |magic_methpack |NN SV *sv|NN const MAGIC *mg|NN SV *meth
-s      |SV*    |magic_methcall1|NN SV *sv|NN const MAGIC *mg \
+S      |void   |save_magic_flags|I32 mgs_ix|NN SV *sv|U32 flags
+S      |int    |magic_methpack |NN SV *sv|NN const MAGIC *mg|NN SV *meth
+S      |SV*    |magic_methcall1|NN SV *sv|NN const MAGIC *mg \
                                |NN SV *meth|U32 flags \
                                |int n|NULLOK SV *val
-s      |void   |restore_magic  |NULLOK const void *p
-s      |void   |unwind_handler_stack|NULLOK const void *p
-s      |void   |fixup_errno_string|NN SV* sv
+S      |void   |restore_magic  |NULLOK const void *p
+S      |void   |unwind_handler_stack|NULLOK const void *p
+S      |void   |fixup_errno_string|NN SV* sv
 
 #endif
 
 #if defined(PERL_IN_OP_C)
-sRn    |bool   |is_handle_constructor|NN const OP *o|I32 numargs
-sR     |I32    |assignment_type|NULLOK const OP *o
-s      |void   |forget_pmop    |NN PMOP *const o
-s      |void   |find_and_forget_pmops  |NN OP *o
-s      |void   |cop_free       |NN COP *cop
-s      |OP*    |modkids        |NULLOK OP *o|I32 type
-s      |OP*    |scalarboolean  |NN OP *o
-sR     |OP*    |search_const   |NN OP *o
-sR     |OP*    |new_logop      |I32 type|I32 flags|NN OP **firstp|NN OP **otherp
-s      |void   |simplify_sort  |NN OP *o
-sRn    |bool   |scalar_mod_type|NULLOK const OP *o|I32 type
-s      |OP *   |my_kid         |NULLOK OP *o|NULLOK OP *attrs|NN OP **imopsp
-s      |OP *   |dup_attrlist   |NN OP *o
-s      |void   |apply_attrs    |NN HV *stash|NN SV *target|NULLOK OP *attrs
-s      |void   |apply_attrs_my |NN HV *stash|NN OP *target|NULLOK OP *attrs|NN OP **imopsp
-s      |void   |bad_type_pv    |I32 n|NN const char *t|NN const OP *o|NN const OP *kid
-s      |void   |bad_type_gv    |I32 n|NN GV *gv|NN const OP *kid|NN const char *t
-s      |void   |no_bareword_allowed|NN OP *o
-sR     |OP*    |no_fh_allowed|NN OP *o
-sR     |OP*    |too_few_arguments_pv|NN OP *o|NN const char* name|U32 flags
-s      |OP*    |too_many_arguments_pv|NN OP *o|NN const char* name|U32 flags
-s      |bool   |looks_like_bool|NN const OP* o
-s      |OP*    |newGIVWHENOP   |NULLOK OP* cond|NN OP *block \
+SRT    |bool   |is_handle_constructor|NN const OP *o|I32 numargs
+SR     |I32    |assignment_type|NULLOK const OP *o
+S      |void   |forget_pmop    |NN PMOP *const o
+S      |void   |find_and_forget_pmops  |NN OP *o
+S      |void   |cop_free       |NN COP *cop
+S      |OP*    |modkids        |NULLOK OP *o|I32 type
+S      |OP*    |scalarboolean  |NN OP *o
+SR     |OP*    |search_const   |NN OP *o
+SR     |OP*    |new_logop      |I32 type|I32 flags|NN OP **firstp|NN OP **otherp
+S      |void   |simplify_sort  |NN OP *o
+SRT    |bool   |scalar_mod_type|NULLOK const OP *o|I32 type
+S      |OP *   |my_kid         |NULLOK OP *o|NULLOK OP *attrs|NN OP **imopsp
+S      |OP *   |dup_attrlist   |NN OP *o
+S      |void   |apply_attrs    |NN HV *stash|NN SV *target|NULLOK OP *attrs
+S      |void   |apply_attrs_my |NN HV *stash|NN OP *target|NULLOK OP *attrs|NN OP **imopsp
+S      |void   |bad_type_pv    |I32 n|NN const char *t|NN const OP *o|NN const OP *kid
+S      |void   |bad_type_gv    |I32 n|NN GV *gv|NN const OP *kid|NN const char *t
+S      |void   |no_bareword_allowed|NN OP *o
+SR     |OP*    |no_fh_allowed|NN OP *o
+SR     |OP*    |too_few_arguments_pv|NN OP *o|NN const char* name|U32 flags
+S      |OP*    |too_many_arguments_pv|NN OP *o|NN const char* name|U32 flags
+S      |bool   |looks_like_bool|NN const OP* o
+S      |OP*    |newGIVWHENOP   |NULLOK OP* cond|NN OP *block \
                                |I32 enter_opcode|I32 leave_opcode \
                                |PADOFFSET entertarg
-s      |OP*    |ref_array_or_hash|NULLOK OP* cond
-s      |bool   |process_special_blocks |I32 floor \
+S      |OP*    |ref_array_or_hash|NULLOK OP* cond
+S      |bool   |process_special_blocks |I32 floor \
                                        |NN const char *const fullname\
                                        |NN GV *const gv|NN CV *const cv
-s      |void   |clear_special_blocks   |NN const char *const fullname\
+S      |void   |clear_special_blocks   |NN const char *const fullname\
                                        |NN GV *const gv|NN CV *const cv
 #endif
 XpR    |void*  |Slab_Alloc     |size_t sz
 Xp     |void   |Slab_Free      |NN void *op
 #if defined(PERL_DEBUG_READONLY_OPS)
 #    if defined(PERL_CORE)
-px     |void   |Slab_to_ro     |NN OPSLAB *slab
-px     |void   |Slab_to_rw     |NN OPSLAB *const slab
+pe     |void   |Slab_to_ro     |NN OPSLAB *slab
+pe     |void   |Slab_to_rw     |NN OPSLAB *const slab
 #    endif
 : Used in OpREFCNT_inc() in sv.c
-poxM   |OP *   |op_refcnt_inc  |NULLOK OP *o
+poex   |OP *   |op_refcnt_inc  |NULLOK OP *o
 : FIXME - can be static.
-poxM   |PADOFFSET      |op_refcnt_dec  |NN OP *o
+poex   |PADOFFSET      |op_refcnt_dec  |NN OP *o
 #endif
 
 #if defined(PERL_IN_PERL_C)
-s      |void   |find_beginning |NN SV* linestr_sv|NN PerlIO *rsfp
-s      |void   |forbid_setid   |const char flag|const bool suidscript
-s      |void   |incpush        |NN const char *const dir|STRLEN len \
+S      |void   |find_beginning |NN SV* linestr_sv|NN PerlIO *rsfp
+S      |void   |forbid_setid   |const char flag|const bool suidscript
+S      |void   |incpush        |NN const char *const dir|STRLEN len \
                                |U32 flags
-s      |SV*    |mayberelocate  |NN const char *const dir|STRLEN len \
+S      |SV*    |mayberelocate  |NN const char *const dir|STRLEN len \
                                |U32 flags
-s      |void   |incpush_use_sep|NN const char *p|STRLEN len|U32 flags
-s      |void   |init_interp
-s      |void   |init_ids
-s      |void   |init_main_stash
-s      |void   |init_perllib
-s      |void   |init_postdump_symbols|int argc|NN char **argv|NULLOK char **env
-s      |void   |init_predump_symbols
-rs     |void   |my_exit_jump
-s      |void   |nuke_stacks
-s      |PerlIO *|open_script   |NN const char *scriptname|bool dosearch \
+S      |void   |incpush_use_sep|NN const char *p|STRLEN len|U32 flags
+S      |void   |init_interp
+S      |void   |init_ids
+S      |void   |init_main_stash
+S      |void   |init_perllib
+S      |void   |init_postdump_symbols|int argc|NN char **argv|NULLOK char **env
+S      |void   |init_predump_symbols
+rS     |void   |my_exit_jump
+S      |void   |nuke_stacks
+S      |PerlIO *|open_script   |NN const char *scriptname|bool dosearch \
                                |NN bool *suidscript
-sr     |void   |usage
+Sr     |void   |usage
 #ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
-so     |void   |validate_suid  |NN PerlIO *rsfp
+So     |void   |validate_suid  |NN PerlIO *rsfp
 #endif
-sr     |void   |minus_v
+Sr     |void   |minus_v
 
-s      |void*  |parse_body     |NULLOK char **env|XSINIT_t xsinit
-rs     |void   |run_body       |I32 oldscope
+S      |void*  |parse_body     |NULLOK char **env|XSINIT_t xsinit
+rS     |void   |run_body       |I32 oldscope
 #  ifndef PERL_IS_MINIPERL
-s      |SV *   |incpush_if_exists|NN AV *const av|NN SV *dir|NN SV *const stem
+S      |SV *   |incpush_if_exists|NN AV *const av|NN SV *dir|NN SV *const stem
 #  endif
 #endif
 
 #if defined(PERL_IN_PP_C)
-s      |size_t |do_chomp       |NN SV *retval|NN SV *sv|bool chomping
-s      |OP*    |do_delete_local
-sR     |SV*    |refto          |NN SV* sv
+S      |size_t |do_chomp       |NN SV *retval|NN SV *sv|bool chomping
+S      |OP*    |do_delete_local
+SR     |SV*    |refto          |NN SV* sv
 #endif
 #if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C)
 : Used in pp_hot.c
-pRxo   |GV*    |softref2xv     |NN SV *const sv|NN const char *const what \
+pReo   |GV*    |softref2xv     |NN SV *const sv|NN const char *const what \
                                |const svtype type|NN SV ***spp
+iTR    |bool   |lossless_NV_to_IV|const NV nv|NN IV * ivp
 #endif
 
 #if defined(PERL_IN_PP_PACK_C)
-s      |SSize_t|unpack_rec     |NN struct tempsym* symptr|NN const char *s \
+S      |SSize_t|unpack_rec     |NN struct tempsym* symptr|NN const char *s \
                                |NN const char *strbeg|NN const char *strend|NULLOK const char **new_s
-s      |SV **  |pack_rec       |NN SV *cat|NN struct tempsym* symptr|NN SV **beglist|NN SV **endlist
-s      |SV*    |mul128         |NN SV *sv|U8 m
-s      |SSize_t|measure_struct |NN struct tempsym* symptr
-s      |bool   |next_symbol    |NN struct tempsym* symptr
-sR     |SV*    |is_an_int      |NN const char *s|STRLEN l
-s      |int    |div128         |NN SV *pnum|NN bool *done
-s      |const char *|group_end |NN const char *patptr|NN const char *patend \
+S      |SV **  |pack_rec       |NN SV *cat|NN struct tempsym* symptr|NN SV **beglist|NN SV **endlist
+S      |SV*    |mul128         |NN SV *sv|U8 m
+S      |SSize_t|measure_struct |NN struct tempsym* symptr
+S      |bool   |next_symbol    |NN struct tempsym* symptr
+SR     |SV*    |is_an_int      |NN const char *s|STRLEN l
+S      |int    |div128         |NN SV *pnum|NN bool *done
+S      |const char *|group_end |NN const char *patptr|NN const char *patend \
                                |char ender
-sR     |const char *|get_num   |NN const char *patptr|NN SSize_t *lenptr
-ns     |bool   |need_utf8      |NN const char *pat|NN const char *patend
-ns     |char   |first_symbol   |NN const char *pat|NN const char *patend
-sR     |char * |sv_exp_grow    |NN SV *sv|STRLEN needed
-snR    |char * |my_bytes_to_utf8|NN const U8 *start|STRLEN len|NN char *dest \
+SR     |const char *|get_num   |NN const char *patptr|NN SSize_t *lenptr
+TS     |bool   |need_utf8      |NN const char *pat|NN const char *patend
+TS     |char   |first_symbol   |NN const char *pat|NN const char *patend
+SR     |char * |sv_exp_grow    |NN SV *sv|STRLEN needed
+STR    |char * |my_bytes_to_utf8|NN const U8 *start|STRLEN len|NN char *dest \
                                |const bool needs_swap
 #endif
 
 #if defined(PERL_IN_PP_CTL_C)
-sR     |OP*    |docatch        |Perl_ppaddr_t firstpp
-sR     |OP*    |dofindlabel    |NN OP *o|NN const char *label|STRLEN len \
+SR     |OP*    |docatch        |Perl_ppaddr_t firstpp
+SR     |OP*    |dofindlabel    |NN OP *o|NN const char *label|STRLEN len \
                                 |U32 flags|NN OP **opstack|NN OP **oplimit
-s      |MAGIC *|doparseform    |NN SV *sv
-snR    |bool   |num_overflow   |NV value|I32 fldsize|I32 frcsize
-sR     |I32    |dopoptoeval    |I32 startingblock
-sR     |I32    |dopoptogivenfor|I32 startingblock
-sR     |I32    |dopoptolabel   |NN const char *label|STRLEN len|U32 flags
-sR     |I32    |dopoptoloop    |I32 startingblock
-sR     |I32    |dopoptosub_at  |NN const PERL_CONTEXT* cxstk|I32 startingblock
-sR     |I32    |dopoptowhen    |I32 startingblock
-s      |void   |save_lines     |NULLOK AV *array|NN SV *sv
-s      |bool   |doeval_compile |U8 gimme \
+S      |MAGIC *|doparseform    |NN SV *sv
+STR    |bool   |num_overflow   |NV value|I32 fldsize|I32 frcsize
+SR     |I32    |dopoptoeval    |I32 startingblock
+SR     |I32    |dopoptogivenfor|I32 startingblock
+SR     |I32    |dopoptolabel   |NN const char *label|STRLEN len|U32 flags
+SR     |I32    |dopoptoloop    |I32 startingblock
+SR     |I32    |dopoptosub_at  |NN const PERL_CONTEXT* cxstk|I32 startingblock
+SR     |I32    |dopoptowhen    |I32 startingblock
+S      |void   |save_lines     |NULLOK AV *array|NN SV *sv
+S      |bool   |doeval_compile |U8 gimme \
                                |NULLOK CV* outside|U32 seq|NULLOK HV* hh
-sR     |PerlIO *|check_type_and_open|NN SV *name
+SR     |PerlIO *|check_type_and_open|NN SV *name
 #ifndef PERL_DISABLE_PMC
-sR     |PerlIO *|doopen_pm     |NN SV *name
-#endif
-iRn    |bool   |path_is_searchable|NN const char *name
-sR     |I32    |run_user_filter|int idx|NN SV *buf_sv|int maxlen
-sR     |PMOP*  |make_matcher   |NN REGEXP* re
-sR     |bool   |matcher_matches_sv|NN PMOP* matcher|NN SV* sv
-s      |void   |destroy_matcher|NN PMOP* matcher
-s      |OP*    |do_smartmatch  |NULLOK HV* seen_this \
+SR     |PerlIO *|doopen_pm     |NN SV *name
+#endif
+iRT    |bool   |path_is_searchable|NN const char *name
+SR     |I32    |run_user_filter|int idx|NN SV *buf_sv|int maxlen
+SR     |PMOP*  |make_matcher   |NN REGEXP* re
+SR     |bool   |matcher_matches_sv|NN PMOP* matcher|NN SV* sv
+S      |void   |destroy_matcher|NN PMOP* matcher
+S      |OP*    |do_smartmatch  |NULLOK HV* seen_this \
                                |NULLOK HV* seen_other|const bool copied
 #endif
 
 #if defined(PERL_IN_PP_HOT_C)
-s      |void   |do_oddball     |NN SV **oddkey|NN SV **firstkey
+S      |void   |do_oddball     |NN SV **oddkey|NN SV **firstkey
 i      |HV*    |opmethod_stash |NN SV* meth
 #endif
 
 #if defined(PERL_IN_PP_SORT_C)
-s      |I32    |sv_ncmp        |NN SV *const a|NN SV *const b
-s      |I32    |sv_i_ncmp      |NN SV *const a|NN SV *const b
-s      |I32    |amagic_ncmp    |NN SV *const a|NN SV *const b
-s      |I32    |amagic_i_ncmp  |NN SV *const a|NN SV *const b
-s      |I32    |amagic_cmp     |NN SV *const str1|NN SV *const str2
+S      |I32    |sv_ncmp        |NN SV *const a|NN SV *const b
+S      |I32    |sv_i_ncmp      |NN SV *const a|NN SV *const b
+S      |I32    |amagic_ncmp    |NN SV *const a|NN SV *const b
+S      |I32    |amagic_i_ncmp  |NN SV *const a|NN SV *const b
+S      |I32    |amagic_cmp     |NN SV *const str1|NN SV *const str2
 #  ifdef USE_LOCALE_COLLATE
-s      |I32    |amagic_cmp_locale|NN SV *const str1|NN SV *const str2
+S      |I32    |amagic_cmp_locale|NN SV *const str1|NN SV *const str2
 #  endif
-s      |I32    |sortcv         |NN SV *const a|NN SV *const b
-s      |I32    |sortcv_xsub    |NN SV *const a|NN SV *const b
-s      |I32    |sortcv_stacked |NN SV *const a|NN SV *const b
+S      |I32    |sortcv         |NN SV *const a|NN SV *const b
+S      |I32    |sortcv_xsub    |NN SV *const a|NN SV *const b
+S      |I32    |sortcv_stacked |NN SV *const a|NN SV *const b
 #endif
 
 #if defined(PERL_IN_PP_SYS_C)
-s      |OP*    |doform         |NN CV *cv|NN GV *gv|NULLOK OP *retop
+S      |OP*    |doform         |NN CV *cv|NN GV *gv|NULLOK OP *retop
 #  if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
-sR     |int    |dooneliner     |NN const char *cmd|NN const char *filename
+SR     |int    |dooneliner     |NN const char *cmd|NN const char *filename
 #  endif
-s      |SV *   |space_join_names_mortal|NULLOK char *const *array
+S      |SV *   |space_join_names_mortal|NULLOK char *const *array
 #endif
 p      |OP *   |tied_method|NN SV *methname|NN SV **sp \
                                |NN SV *const sv|NN const MAGIC *const mg \
@@ -2357,108 +2420,108 @@ Ep    |void   |regprop        |NULLOK const regexp *prog|NN SV* sv|NN const regnode* o|NULLO
 Ep     |int    |re_printf      |NN const char *fmt|...
 #endif
 #if defined(PERL_IN_REGCOMP_C)
-Es     |regnode_offset|reg     |NN RExC_state_t *pRExC_state \
+ES     |regnode_offset|reg     |NN RExC_state_t *pRExC_state \
                                |I32 paren|NN I32 *flagp|U32 depth
-Es     |regnode_offset|regnode_guts|NN RExC_state_t *pRExC_state          \
+ES     |regnode_offset|regnode_guts|NN RExC_state_t *pRExC_state          \
                                |const U8 op                               \
                                |const STRLEN extra_len                    \
                                |NN const char* const name
-Es     |void   |change_engine_size|NN RExC_state_t *pRExC_state|const Ptrdiff_t size
-Es     |regnode_offset|reganode|NN RExC_state_t *pRExC_state|U8 op \
+ES     |void   |change_engine_size|NN RExC_state_t *pRExC_state|const Ptrdiff_t size
+ES     |regnode_offset|reganode|NN RExC_state_t *pRExC_state|U8 op \
                                |U32 arg
-Es     |regnode_offset|reg2Lanode|NN RExC_state_t *pRExC_state            \
+ES     |regnode_offset|reg2Lanode|NN RExC_state_t *pRExC_state            \
                                |const U8 op                               \
                                |const U32 arg1                            \
                                |const I32 arg2
-Es     |regnode_offset|regatom |NN RExC_state_t *pRExC_state \
+ES     |regnode_offset|regatom |NN RExC_state_t *pRExC_state \
                                |NN I32 *flagp|U32 depth
-Es     |regnode_offset|regbranch       |NN RExC_state_t *pRExC_state \
+ES     |regnode_offset|regbranch       |NN RExC_state_t *pRExC_state \
                                |NN I32 *flagp|I32 first|U32 depth
-Es     |void    |set_ANYOF_arg |NN RExC_state_t* const pRExC_state \
+ES     |void    |set_ANYOF_arg |NN RExC_state_t* const pRExC_state \
                                |NN regnode* const node                    \
                                |NULLOK SV* const cp_list                  \
                                |NULLOK SV* const runtime_defns            \
                                |NULLOK SV* const only_utf8_locale_list
-Es     |void   |output_posix_warnings                                      \
+ES     |void   |output_posix_warnings                                      \
                                |NN RExC_state_t *pRExC_state               \
                                |NN AV* posix_warnings
-Es     |AV*     |add_multi_match|NULLOK AV* multi_char_matches             \
+ES     |AV*     |add_multi_match|NULLOK AV* multi_char_matches             \
                                |NN SV* multi_string                        \
                                |const STRLEN cp_count
-Es     |regnode_offset|regclass|NN RExC_state_t *pRExC_state                 \
+ES     |regnode_offset|regclass|NN RExC_state_t *pRExC_state                 \
                                |NN I32 *flagp|U32 depth|const bool stop_at_1 \
                                |bool allow_multi_fold                        \
                                |const bool silence_non_portable              \
                                |const bool strict                            \
                                |bool optimizable                             \
                                |NULLOK SV** ret_invlist
-Es     |void|add_above_Latin1_folds|NN RExC_state_t *pRExC_state|const U8 cp \
+ES     |void|add_above_Latin1_folds|NN RExC_state_t *pRExC_state|const U8 cp \
                                |NN SV** invlist
 Ei     |regnode_offset|handle_named_backref|NN RExC_state_t *pRExC_state   \
                                |NN I32 *flagp                              \
                                |NN char * parse_start                      \
                                |char ch
-EsnR   |unsigned int|regex_set_precedence|const U8 my_operator
-Es     |regnode_offset|handle_regex_sets|NN RExC_state_t *pRExC_state \
+ESTR   |unsigned int|regex_set_precedence|const U8 my_operator
+ES     |regnode_offset|handle_regex_sets|NN RExC_state_t *pRExC_state \
                                |NULLOK SV ** return_invlist            \
                                |NN I32 *flagp|U32 depth                \
                                |NN char * const oregcomp_parse
-Es     |void   |set_regex_pv   |NN RExC_state_t *pRExC_state|NN REGEXP *Rx
+ES     |void   |set_regex_pv   |NN RExC_state_t *pRExC_state|NN REGEXP *Rx
 #if defined(DEBUGGING) && defined(ENABLE_REGEX_SETS_DEBUGGING)
-Es     |void   |dump_regex_sets_structures                                 \
+ES     |void   |dump_regex_sets_structures                                 \
                                |NN RExC_state_t *pRExC_state               \
                                |NN AV * stack                              \
                                |const IV fence|NN AV * fence_stack
 #endif
-Es     |void|parse_lparen_question_flags|NN RExC_state_t *pRExC_state
-Es     |regnode_offset|reg_node|NN RExC_state_t *pRExC_state|U8 op
-Es     |regnode_offset|regpiece|NN RExC_state_t *pRExC_state \
+ES     |void|parse_lparen_question_flags|NN RExC_state_t *pRExC_state
+ES     |regnode_offset|reg_node|NN RExC_state_t *pRExC_state|U8 op
+ES     |regnode_offset|regpiece|NN RExC_state_t *pRExC_state \
                                |NN I32 *flagp|U32 depth
-Es     |bool   |grok_bslash_N  |NN RExC_state_t *pRExC_state               \
+ES     |bool   |grok_bslash_N  |NN RExC_state_t *pRExC_state               \
                                |NULLOK regnode_offset* nodep               \
                                |NULLOK UV *code_point_p                    \
                                |NULLOK int* cp_count                       \
                                |NN I32 *flagp                              \
                                |const bool strict                          \
                                |const U32 depth
-Es     |void   |reginsert      |NN RExC_state_t *pRExC_state \
+ES     |void   |reginsert      |NN RExC_state_t *pRExC_state \
                                |const U8 op                                \
                                |const regnode_offset operand               \
                                |const U32 depth
-Es     |bool   |regtail        |NN RExC_state_t * pRExC_state              \
+ES     |bool   |regtail        |NN RExC_state_t * pRExC_state              \
                                |NN const regnode_offset p                  \
                                |NN const regnode_offset val                \
                                |const U32 depth
-Es     |SV *   |reg_scan_name  |NN RExC_state_t *pRExC_state \
+ES     |SV *   |reg_scan_name  |NN RExC_state_t *pRExC_state \
                                |U32 flags
-Es     |U32    |join_exact     |NN RExC_state_t *pRExC_state \
+ES     |U32    |join_exact     |NN RExC_state_t *pRExC_state \
                                |NN regnode *scan|NN UV *min_subtract  \
                                |NN bool *unfolded_multi_char          \
                                |U32 flags|NULLOK regnode *val|U32 depth
-Ein    |U8   |compute_EXACTish|NN RExC_state_t *pRExC_state
-Es     |void   |nextchar       |NN RExC_state_t *pRExC_state
-Es     |void   |skip_to_be_ignored_text|NN RExC_state_t *pRExC_state  \
+EiT    |U8   |compute_EXACTish|NN RExC_state_t *pRExC_state
+ES     |void   |nextchar       |NN RExC_state_t *pRExC_state
+ES     |void   |skip_to_be_ignored_text|NN RExC_state_t *pRExC_state  \
                                |NN char ** p                       \
                                |const bool force_to_xmod
-Ein    |char * |reg_skipcomment|NN RExC_state_t *pRExC_state|NN char * p
-Es     |void   |scan_commit    |NN const RExC_state_t *pRExC_state \
+EiT    |char * |reg_skipcomment|NN RExC_state_t *pRExC_state|NN char * p
+ES     |void   |scan_commit    |NN const RExC_state_t *pRExC_state \
                                |NN struct scan_data_t *data        \
                                |NN SSize_t *minlenp                \
                                |int is_inf
-Es     |void   |populate_ANYOF_from_invlist|NN regnode *node|NN SV** invlist_ptr
-Es     |void   |ssc_anything   |NN regnode_ssc *ssc
-EsRn   |int    |ssc_is_anything|NN const regnode_ssc *ssc
-Es     |void   |ssc_init       |NN const RExC_state_t *pRExC_state \
+ES     |void   |populate_ANYOF_from_invlist|NN regnode *node|NN SV** invlist_ptr
+ES     |void   |ssc_anything   |NN regnode_ssc *ssc
+ESRT   |int    |ssc_is_anything|NN const regnode_ssc *ssc
+ES     |void   |ssc_init       |NN const RExC_state_t *pRExC_state \
                                |NN regnode_ssc *ssc
-EsRn   |int    |ssc_is_cp_posixl_init|NN const RExC_state_t *pRExC_state \
+ESRT   |int    |ssc_is_cp_posixl_init|NN const RExC_state_t *pRExC_state \
                                |NN const regnode_ssc *ssc
-Es     |void   |ssc_and        |NN const RExC_state_t *pRExC_state \
+ES     |void   |ssc_and        |NN const RExC_state_t *pRExC_state \
                                |NN regnode_ssc *ssc                \
                                |NN const regnode_charclass *and_with
-Es     |void   |ssc_or         |NN const RExC_state_t *pRExC_state \
+ES     |void   |ssc_or         |NN const RExC_state_t *pRExC_state \
                                |NN regnode_ssc *ssc \
                                |NN const regnode_charclass *or_with
-Es     |SV*    |get_ANYOF_cp_list_for_ssc                                 \
+ES     |SV*    |get_ANYOF_cp_list_for_ssc                                 \
                                |NN const RExC_state_t *pRExC_state \
                                |NN const regnode_charclass* const node
 Ei     |void   |ssc_intersection|NN regnode_ssc *ssc \
@@ -2469,36 +2532,36 @@ Ei      |void   |ssc_add_range  |NN regnode_ssc *ssc \
                                |UV const start|UV const end
 Ei     |void   |ssc_cp_and     |NN regnode_ssc *ssc \
                                |UV const cp
-Ein    |void   |ssc_clear_locale|NN regnode_ssc *ssc
-Ens    |bool   |is_ssc_worth_it|NN const RExC_state_t * pRExC_state \
+EiT    |void   |ssc_clear_locale|NN regnode_ssc *ssc
+ETS    |bool   |is_ssc_worth_it|NN const RExC_state_t * pRExC_state \
                                |NN const regnode_ssc * ssc
-Es     |void   |ssc_finalize   |NN RExC_state_t *pRExC_state \
+ES     |void   |ssc_finalize   |NN RExC_state_t *pRExC_state \
                                |NN regnode_ssc *ssc
-Es     |SSize_t|study_chunk    |NN RExC_state_t *pRExC_state \
+ES     |SSize_t|study_chunk    |NN RExC_state_t *pRExC_state \
                                |NN regnode **scanp|NN SSize_t *minlenp \
                                |NN SSize_t *deltap|NN regnode *last \
                                |NULLOK struct scan_data_t *data \
                                 |I32 stopparen|U32 recursed_depth \
                                |NULLOK regnode_ssc *and_withp \
                                |U32 flags|U32 depth
-EsR    |SV *   |get_ANYOFM_contents|NN const regnode * n
-EsRn   |U32    |add_data       |NN RExC_state_t* const pRExC_state \
+ESR    |SV *   |get_ANYOFM_contents|NN const regnode * n
+ESRT   |U32    |add_data       |NN RExC_state_t* const pRExC_state \
                                |NN const char* const s|const U32 n
-rs     |void   |re_croak2      |bool utf8|NN const char* pat1|NN const char* pat2|...
-Es     |int    |handle_possible_posix                                      \
+rS     |void   |re_croak2      |bool utf8|NN const char* pat1|NN const char* pat2|...
+ES     |int    |handle_possible_posix                                      \
                                |NN RExC_state_t *pRExC_state               \
                                |NN const char* const s                     \
                                |NULLOK char ** updated_parse_ptr           \
                                |NULLOK AV** posix_warnings                 \
                                |const bool check_only
-Es     |I32    |make_trie      |NN RExC_state_t *pRExC_state \
+ES     |I32    |make_trie      |NN RExC_state_t *pRExC_state \
                                |NN regnode *startbranch|NN regnode *first \
                                |NN regnode *last|NN regnode *tail \
                                |U32 word_count|U32 flags|U32 depth
-Es     |regnode *|construct_ahocorasick_from_trie|NN RExC_state_t *pRExC_state \
+ES     |regnode *|construct_ahocorasick_from_trie|NN RExC_state_t *pRExC_state \
                                 |NN regnode *source|U32 depth
-EnsR   |const char *|cntrl_to_mnemonic|const U8 c
-EnsR   |int    |edit_distance  |NN const UV *src                   \
+ETSR   |const char *|cntrl_to_mnemonic|const U8 c
+ETSR   |int    |edit_distance  |NN const UV *src                   \
                                |NN const UV *tgt                   \
                                |const STRLEN x                     \
                                |const STRLEN y                     \
@@ -2524,48 +2587,48 @@ EXp     |SV *   |handle_user_defined_property|NN const char * name          \
                                             |const STRLEN level
 #  ifdef DEBUGGING
 Ep     |int    |re_indentf     |NN const char *fmt|U32 depth|...
-Es     |void        |regdump_intflags|NULLOK const char *lead| const U32 flags
-Es     |void   |regdump_extflags|NULLOK const char *lead| const U32 flags
-Es     |const regnode*|dumpuntil|NN const regexp *r|NN const regnode *start \
+ES     |void        |regdump_intflags|NULLOK const char *lead| const U32 flags
+ES     |void   |regdump_extflags|NULLOK const char *lead| const U32 flags
+ES     |const regnode*|dumpuntil|NN const regexp *r|NN const regnode *start \
                                |NN const regnode *node \
                                |NULLOK const regnode *last \
                                |NULLOK const regnode *plast \
                                |NN SV* sv|I32 indent|U32 depth
-Es     |void   |put_code_point |NN SV* sv|UV c
-Es     |bool   |put_charclass_bitmap_innards|NN SV* sv             \
+ES     |void   |put_code_point |NN SV* sv|UV c
+ES     |bool   |put_charclass_bitmap_innards|NN SV* sv             \
                                |NULLOK char* bitmap                \
                                |NULLOK SV* nonbitmap_invlist       \
                                |NULLOK SV* only_utf8_locale_invlist\
                                |NULLOK const regnode * const node  \
                                |const bool force_as_is_display
-Es     |SV*    |put_charclass_bitmap_innards_common                \
+ES     |SV*    |put_charclass_bitmap_innards_common                \
                                |NN SV* invlist                     \
                                |NULLOK SV* posixes                 \
                                |NULLOK SV* only_utf8               \
                                |NULLOK SV* not_utf8                \
                                |NULLOK SV* only_utf8_locale        \
                                |const bool invert
-Es     |void   |put_charclass_bitmap_innards_invlist               \
+ES     |void   |put_charclass_bitmap_innards_invlist               \
                                |NN SV *sv                          \
                                |NN SV* invlist
-Es     |void   |put_range      |NN SV* sv|UV start|const UV end    \
+ES     |void   |put_range      |NN SV* sv|UV start|const UV end    \
                                |const bool allow_literals
-Es     |void   |dump_trie      |NN const struct _reg_trie_data *trie\
+ES     |void   |dump_trie      |NN const struct _reg_trie_data *trie\
                                |NULLOK HV* widecharmap|NN AV *revcharmap\
                                |U32 depth
-Es     |void   |dump_trie_interim_list|NN const struct _reg_trie_data *trie\
+ES     |void   |dump_trie_interim_list|NN const struct _reg_trie_data *trie\
                                |NULLOK HV* widecharmap|NN AV *revcharmap\
                                |U32 next_alloc|U32 depth
-Es     |void   |dump_trie_interim_table|NN const struct _reg_trie_data *trie\
+ES     |void   |dump_trie_interim_table|NN const struct _reg_trie_data *trie\
                                |NULLOK HV* widecharmap|NN AV *revcharmap\
                                |U32 next_alloc|U32 depth
-Es     |bool   |regtail_study  |NN RExC_state_t *pRExC_state \
+ES     |bool   |regtail_study  |NN RExC_state_t *pRExC_state \
                                |NN regnode_offset p|NN const regnode_offset val|U32 depth
 #  endif
 #endif
 
 #if defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_UTF8_C)
-EXRpM  |bool   |isFOO_lc       |const U8 classnum|const U8 character
+EXRpx  |bool   |isFOO_lc       |const U8 classnum|const U8 character
 #endif
 
 #if defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C)
@@ -2573,92 +2636,92 @@ ERp     |bool   |_is_grapheme   |NN const U8 * strbeg|NN const U8 * s|NN const U8 *stren
 #endif
 
 #if defined(PERL_IN_REGEXEC_C)
-ERs    |bool   |isFOO_utf8_lc  |const U8 classnum|NN const U8* character|NN const U8* e
-ERns   |U8 *   |find_next_masked|NN U8 * s                             \
+ERS    |bool   |isFOO_utf8_lc  |const U8 classnum|NN const U8* character|NN const U8* e
+ERTS   |U8 *   |find_next_masked|NN U8 * s                             \
                                 |NN const U8 * send                    \
                                 |const U8 byte|const U8 mask
-ERns   |U8 *|find_span_end     |NN U8* s|NN const U8 * send|const U8 span_byte
-ERns   |U8 *|find_span_end_mask|NN U8 * s|NN const U8 * send   \
+ERTS   |U8 *|find_span_end     |NN U8* s|NN const U8 * send|const U8 span_byte
+ERTS   |U8 *|find_span_end_mask|NN U8 * s|NN const U8 * send   \
                                |const U8 span_byte|const U8 mask
-ERs    |SSize_t|regmatch       |NN regmatch_info *reginfo|NN char *startpos|NN regnode *prog
-WERs   |I32    |regrepeat      |NN regexp *prog|NN char **startposp \
+ERS    |SSize_t|regmatch       |NN regmatch_info *reginfo|NN char *startpos|NN regnode *prog
+WERS   |I32    |regrepeat      |NN regexp *prog|NN char **startposp \
                                |NN const regnode *p \
                                |NN char *loceol                \
                                |NN regmatch_info *const reginfo \
                                |I32 max
-ERs    |bool   |regtry         |NN regmatch_info *reginfo|NN char **startposp
-ERs    |bool   |reginclass     |NULLOK regexp * const prog  \
+ERS    |bool   |regtry         |NN regmatch_info *reginfo|NN char **startposp
+ERS    |bool   |reginclass     |NULLOK regexp * const prog  \
                                |NN const regnode * const n  \
                                |NN const U8 * const p       \
                                |NN const U8 * const p_end   \
                                |bool const utf8_target
-WEs    |CHECKPOINT|regcppush   |NN const regexp *rex|I32 parenfloor\
+WES    |CHECKPOINT|regcppush   |NN const regexp *rex|I32 parenfloor\
                                |U32 maxopenparen
-WEs    |void   |regcppop       |NN regexp *rex|NN U32 *maxopenparen_p
-WEs    |void   |regcp_restore  |NN regexp *rex|I32 ix|NN U32 *maxopenparen_p
-ERsn   |U8*    |reghop3        |NN U8 *s|SSize_t off|NN const U8 *lim
-ERsn   |U8*    |reghop4        |NN U8 *s|SSize_t off|NN const U8 *llim \
+WES    |void   |regcppop       |NN regexp *rex|NN U32 *maxopenparen_p
+WES    |void   |regcp_restore  |NN regexp *rex|I32 ix|NN U32 *maxopenparen_p
+ERST   |U8*    |reghop3        |NN U8 *s|SSize_t off|NN const U8 *lim
+ERST   |U8*    |reghop4        |NN U8 *s|SSize_t off|NN const U8 *llim \
                                |NN const U8 *rlim
-ERsn   |U8*    |reghopmaybe3   |NN U8 *s|SSize_t off|NN const U8 * const lim
-ERs    |char*  |find_byclass   |NN regexp * prog|NN const regnode *c \
+ERST   |U8*    |reghopmaybe3   |NN U8 *s|SSize_t off|NN const U8 * const lim
+ERS    |char*  |find_byclass   |NN regexp * prog|NN const regnode *c \
                                |NN char *s|NN const char *strend \
                                |NULLOK regmatch_info *reginfo
-Es     |void   |to_utf8_substr |NN regexp * prog
-Es     |bool   |to_byte_substr |NN regexp * prog
-ERsn   |I32    |reg_check_named_buff_matched   |NN const regexp *rex \
+ES     |void   |to_utf8_substr |NN regexp * prog
+ES     |bool   |to_byte_substr |NN regexp * prog
+ERST   |I32    |reg_check_named_buff_matched   |NN const regexp *rex \
                                                |NN const regnode *scan
-EsR    |bool   |isGCB          |const GCB_enum before                  \
+ESR    |bool   |isGCB          |const GCB_enum before                  \
                                |const GCB_enum after                   \
                                |NN const U8 * const strbeg             \
                                |NN const U8 * const curpos             \
                                |const bool utf8_target
-EsR    |GCB_enum|backup_one_GCB|NN const U8 * const strbeg                     \
+ESR    |GCB_enum|backup_one_GCB|NN const U8 * const strbeg                     \
                                |NN U8 ** curpos                                \
                                |const bool utf8_target
-EsR    |bool   |isLB           |LB_enum before                         \
+ESR    |bool   |isLB           |LB_enum before                         \
                                |LB_enum after                          \
                                |NN const U8 * const strbeg             \
                                |NN const U8 * const curpos             \
                                |NN const U8 * const strend             \
                                |const bool utf8_target
-EsR    |LB_enum|advance_one_LB |NN U8 ** curpos                                \
+ESR    |LB_enum|advance_one_LB |NN U8 ** curpos                                \
                                |NN const U8 * const strend                     \
                                |const bool utf8_target
-EsR    |LB_enum|backup_one_LB  |NN const U8 * const strbeg                     \
+ESR    |LB_enum|backup_one_LB  |NN const U8 * const strbeg                     \
                                |NN U8 ** curpos                                \
                                |const bool utf8_target
-EsR    |bool   |isSB           |SB_enum before                         \
+ESR    |bool   |isSB           |SB_enum before                         \
                                |SB_enum after                          \
                                |NN const U8 * const strbeg                     \
                                |NN const U8 * const curpos                     \
                                |NN const U8 * const strend                     \
                                |const bool utf8_target
-EsR    |SB_enum|advance_one_SB |NN U8 ** curpos                                \
+ESR    |SB_enum|advance_one_SB |NN U8 ** curpos                                \
                                |NN const U8 * const strend                     \
                                |const bool utf8_target
-EsR    |SB_enum|backup_one_SB  |NN const U8 * const strbeg                     \
+ESR    |SB_enum|backup_one_SB  |NN const U8 * const strbeg                     \
                                |NN U8 ** curpos                                \
                                |const bool utf8_target
-EsR    |bool   |isWB           |WB_enum previous                               \
+ESR    |bool   |isWB           |WB_enum previous                               \
                                |WB_enum before                         \
                                |WB_enum after                          \
                                |NN const U8 * const strbeg                     \
                                |NN const U8 * const curpos                     \
                                |NN const U8 * const strend                     \
                                |const bool utf8_target
-EsR    |WB_enum|advance_one_WB |NN U8 ** curpos                                \
+ESR    |WB_enum|advance_one_WB |NN U8 ** curpos                                \
                                |NN const U8 * const strend                     \
                                |const bool utf8_target                         \
                                |const bool skip_Extend_Format
-EsR    |WB_enum|backup_one_WB  |NN WB_enum * previous                  \
+ESR    |WB_enum|backup_one_WB  |NN WB_enum * previous                  \
                                |NN const U8 * const strbeg                     \
                                |NN U8 ** curpos                                \
                                |const bool utf8_target
-Ein    |I32    |foldEQ_latin1_s2_folded|NN const char* a|NN const char* b|I32 len
+EiT    |I32    |foldEQ_latin1_s2_folded|NN const char* a|NN const char* b|I32 len
 #  ifdef DEBUGGING
-Es     |void   |dump_exec_pos  |NN const char *locinput|NN const regnode *scan|NN const char *loc_regeol\
+ES     |void   |dump_exec_pos  |NN const char *locinput|NN const regnode *scan|NN const char *loc_regeol\
                                |NN const char *loc_bostr|NN const char *loc_reg_starttry|const bool do_utf8|const U32 depth
-Es     |void   |debug_start_match|NN const REGEXP *prog|const bool do_utf8\
+ES     |void   |debug_start_match|NN const REGEXP *prog|const bool do_utf8\
                                |NN const char *start|NN const char *end\
                                |NN const char *blurb
 
@@ -2667,14 +2730,14 @@ Ep      |int    |re_exec_indentf        |NN const char *fmt|U32 depth|...
 #endif
 
 #if defined(PERL_IN_DUMP_C)
-s      |CV*    |deb_curcv      |I32 ix
-s      |void   |debprof        |NN const OP *o
-s      |UV     |sequence_num   |NULLOK const OP *o
-s      |SV*    |pm_description |NN const PMOP *pm
+S      |CV*    |deb_curcv      |I32 ix
+S      |void   |debprof        |NN const OP *o
+S      |UV     |sequence_num   |NULLOK const OP *o
+S      |SV*    |pm_description |NN const PMOP *pm
 #endif
 
 #if defined(PERL_IN_SCOPE_C)
-s      |SV*    |save_scalar_at |NN SV **sptr|const U32 flags
+S      |SV*    |save_scalar_at |NN SV **sptr|const U32 flags
 #endif
 
 #if defined(PERL_IN_GV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_PAD_C) || defined(PERL_IN_OP_C)
@@ -2684,7 +2747,7 @@ po        |void   |sv_add_backref |NN SV *const tsv|NN SV *const sv
 
 #if defined(PERL_IN_HV_C) || defined(PERL_IN_MG_C) || defined(PERL_IN_SV_C)
 : Used in hv.c and mg.c
-poM    |void   |sv_kill_backrefs       |NN SV *const sv|NULLOK AV *const av
+pox    |void   |sv_kill_backrefs       |NN SV *const sv|NULLOK AV *const av
 #endif
 
 #if defined(PERL_IN_SV_C) || defined (PERL_IN_OP_C)
@@ -2695,46 +2758,46 @@ pR      |SV *   |varname        |NULLOK const GV *const gv|const char gvtype \
 
 pX     |void   |sv_del_backref |NN SV *const tsv|NN SV *const sv
 #if defined(PERL_IN_SV_C)
-niR    |char * |uiv_2buf       |NN char *const buf|const IV iv|UV uv|const int is_uv|NN char **const peob
+TiR    |char * |uiv_2buf       |NN char *const buf|const IV iv|UV uv|const int is_uv|NN char **const peob
 i      |void   |sv_unglob      |NN SV *const sv|U32 flags
-s      |const char *|sv_display        |NN SV *const sv|NN char *tmpbuf|STRLEN tmpbuf_size
-s      |void   |not_a_number   |NN SV *const sv
-s      |void   |not_incrementable      |NN SV *const sv
-s      |I32    |visit          |NN SVFUNC_t f|const U32 flags|const U32 mask
+S      |const char *|sv_display        |NN SV *const sv|NN char *tmpbuf|STRLEN tmpbuf_size
+S      |void   |not_a_number   |NN SV *const sv
+S      |void   |not_incrementable      |NN SV *const sv
+S      |I32    |visit          |NN SVFUNC_t f|const U32 flags|const U32 mask
 #  ifdef DEBUGGING
-s      |void   |del_sv |NN SV *p
+S      |void   |del_sv |NN SV *p
 #  endif
 #  if !defined(NV_PRESERVES_UV)
 #    ifdef DEBUGGING
-s      |int    |sv_2iuv_non_preserve   |NN SV *const sv|I32 numtype
+S      |int    |sv_2iuv_non_preserve   |NN SV *const sv|I32 numtype
 #    else
-s      |int    |sv_2iuv_non_preserve   |NN SV *const sv
+S      |int    |sv_2iuv_non_preserve   |NN SV *const sv
 #    endif
 #  endif
-sR     |STRLEN |expect_number  |NN const char **const pattern
-sn     |STRLEN |sv_pos_u2b_forwards|NN const U8 *const start \
+SR     |STRLEN |expect_number  |NN const char **const pattern
+ST     |STRLEN |sv_pos_u2b_forwards|NN const U8 *const start \
                |NN const U8 *const send|NN STRLEN *const uoffset \
                |NN bool *const at_end
-sn     |STRLEN |sv_pos_u2b_midway|NN const U8 *const start \
+ST     |STRLEN |sv_pos_u2b_midway|NN const U8 *const start \
                |NN const U8 *send|STRLEN uoffset|const STRLEN uend
-s      |STRLEN |sv_pos_u2b_cached|NN SV *const sv|NN MAGIC **const mgp \
+S      |STRLEN |sv_pos_u2b_cached|NN SV *const sv|NN MAGIC **const mgp \
                |NN const U8 *const start|NN const U8 *const send \
                |STRLEN uoffset|STRLEN uoffset0|STRLEN boffset0
-s      |void   |utf8_mg_len_cache_update|NN SV *const sv|NN MAGIC **const mgp \
+S      |void   |utf8_mg_len_cache_update|NN SV *const sv|NN MAGIC **const mgp \
                |const STRLEN ulen
-s      |void   |utf8_mg_pos_cache_update|NN SV *const sv|NN MAGIC **const mgp \
+S      |void   |utf8_mg_pos_cache_update|NN SV *const sv|NN MAGIC **const mgp \
                |const STRLEN byte|const STRLEN utf8|const STRLEN blen
-s      |STRLEN |sv_pos_b2u_midway|NN const U8 *const s|NN const U8 *const target \
+S      |STRLEN |sv_pos_b2u_midway|NN const U8 *const s|NN const U8 *const target \
                |NN const U8 *end|STRLEN endu
-s      |void   |assert_uft8_cache_coherent|NN const char *const func \
+S      |void   |assert_uft8_cache_coherent|NN const char *const func \
                |STRLEN from_cache|STRLEN real|NN SV *const sv
-sn     |char * |F0convert      |NV nv|NN char *const endbuf|NN STRLEN *const len
-s      |SV *   |more_sv
-s      |bool   |sv_2iuv_common |NN SV *const sv
-s      |void   |glob_assign_glob|NN SV *const dstr|NN SV *const sstr \
+ST     |char * |F0convert      |NV nv|NN char *const endbuf|NN STRLEN *const len
+S      |SV *   |more_sv
+S      |bool   |sv_2iuv_common |NN SV *const sv
+S      |void   |glob_assign_glob|NN SV *const dstr|NN SV *const sstr \
                |const int dtype
-sRn    |PTR_TBL_ENT_t *|ptr_table_find|NN PTR_TBL_t *const tbl|NULLOK const void *const sv
-s      |void   |anonymise_cv_maybe     |NN GV *gv|NN CV *cv
+SRT    |PTR_TBL_ENT_t *|ptr_table_find|NN PTR_TBL_t *const tbl|NULLOK const void *const sv
+S      |void   |anonymise_cv_maybe     |NN GV *gv|NN CV *cv
 #endif
 
 : Used in sv.c and hv.c
@@ -2746,122 +2809,122 @@ EXpR  |SV*    |get_and_check_backslash_N_name|NN const char* s        \
                                |NN const char** error_msg
 
 : For use ONLY in B::Hooks::Parser, by special dispensation
-EXpMR  |char*  |scan_str       |NN char *start|int keep_quoted \
+EXpxR  |char*  |scan_str       |NN char *start|int keep_quoted \
                                |int keep_delims|int re_reparse \
                                |NULLOK char **delimp
-EXpM   |char*  |scan_word      |NN char *s|NN char *dest|STRLEN destlen \
+EXpx   |char*  |scan_word      |NN char *s|NN char *dest|STRLEN destlen \
                                |int allow_package|NN STRLEN *slp
-EXpMR  |char*  |skipspace_flags|NN char *s|U32 flags
+EXpxR  |char*  |skipspace_flags|NN char *s|U32 flags
 #if defined(PERL_IN_TOKE_C)
-s      |void   |check_uni
-s      |void   |force_next     |I32 type
-s      |char*  |force_version  |NN char *s|int guessing
-s      |char*  |force_strict_version   |NN char *s
-s      |char*  |force_word     |NN char *start|int token|int check_keyword \
+S      |void   |check_uni
+S      |void   |force_next     |I32 type
+S      |char*  |force_version  |NN char *s|int guessing
+S      |char*  |force_strict_version   |NN char *s
+S      |char*  |force_word     |NN char *start|int token|int check_keyword \
                                |int allow_pack
-s      |SV*    |tokeq          |NN SV *sv
-sR     |char*  |scan_const     |NN char *start
-sR     |SV*    |get_and_check_backslash_N_name_wrapper|NN const char* s \
+S      |SV*    |tokeq          |NN SV *sv
+SR     |char*  |scan_const     |NN char *start
+SR     |SV*    |get_and_check_backslash_N_name_wrapper|NN const char* s \
                                |NN const char* const e
-sR     |char*  |scan_formline  |NN char *s
-sR     |char*  |scan_heredoc   |NN char *s
-s      |char*  |scan_ident     |NN char *s|NN char *dest       \
+SR     |char*  |scan_formline  |NN char *s
+SR     |char*  |scan_heredoc   |NN char *s
+S      |char*  |scan_ident     |NN char *s|NN char *dest       \
                                |STRLEN destlen|I32 ck_uni
-sR     |char*  |scan_inputsymbol|NN char *start
-sR     |char*  |scan_pat       |NN char *start|I32 type
-sR     |char*  |scan_subst     |NN char *start
-sR     |char*  |scan_trans     |NN char *start
-s      |void   |update_debugger_info|NULLOK SV *orig_sv \
+SR     |char*  |scan_inputsymbol|NN char *start
+SR     |char*  |scan_pat       |NN char *start|I32 type
+SR     |char*  |scan_subst     |NN char *start
+SR     |char*  |scan_trans     |NN char *start
+S      |void   |update_debugger_info|NULLOK SV *orig_sv \
                                |NULLOK const char *const buf|STRLEN len
-sR     |char*  |swallow_bom    |NN U8 *s
+SR     |char*  |swallow_bom    |NN U8 *s
 #ifndef PERL_NO_UTF16_FILTER
-s      |I32    |utf16_textfilter|int idx|NN SV *sv|int maxlen
-s      |U8*    |add_utf16_textfilter|NN U8 *const s|bool reversed
+S      |I32    |utf16_textfilter|int idx|NN SV *sv|int maxlen
+S      |U8*    |add_utf16_textfilter|NN U8 *const s|bool reversed
 #endif
-s      |void   |checkcomma     |NN const char *s|NN const char *name \
+S      |void   |checkcomma     |NN const char *s|NN const char *name \
                                |NN const char *what
-s      |void   |force_ident    |NN const char *s|int kind
-s      |void   |force_ident_maybe_lex|char pit
-s      |void   |incline        |NN const char *s|NN const char *end
-s      |int    |intuit_method  |NN char *s|NULLOK SV *ioname|NULLOK CV *cv
-s      |int    |intuit_more    |NN char *s|NN char *e
-s      |I32    |lop            |I32 f|U8 x|NN char *s
-rs     |void   |missingterm    |NULLOK char *s|STRLEN len
-s      |void   |no_op          |NN const char *const what|NULLOK char *s
-s      |int    |pending_ident
-sR     |I32    |sublex_done
-sR     |I32    |sublex_push
-sR     |I32    |sublex_start
-sR     |char * |filter_gets    |NN SV *sv|STRLEN append
-sR     |HV *   |find_in_my_stash|NN const char *pkgname|STRLEN len
-sR     |char * |tokenize_use   |int is_use|NN char *s
-so     |SV*    |new_constant   |NULLOK const char *s|STRLEN len            \
+S      |void   |force_ident    |NN const char *s|int kind
+S      |void   |force_ident_maybe_lex|char pit
+S      |void   |incline        |NN const char *s|NN const char *end
+S      |int    |intuit_method  |NN char *s|NULLOK SV *ioname|NULLOK CV *cv
+S      |int    |intuit_more    |NN char *s|NN char *e
+S      |I32    |lop            |I32 f|U8 x|NN char *s
+rS     |void   |missingterm    |NULLOK char *s|STRLEN len
+S      |void   |no_op          |NN const char *const what|NULLOK char *s
+S      |int    |pending_ident
+SR     |I32    |sublex_done
+SR     |I32    |sublex_push
+SR     |I32    |sublex_start
+SR     |char * |filter_gets    |NN SV *sv|STRLEN append
+SR     |HV *   |find_in_my_stash|NN const char *pkgname|STRLEN len
+SR     |char * |tokenize_use   |int is_use|NN char *s
+So     |SV*    |new_constant   |NULLOK const char *s|STRLEN len            \
                                |NN const char *key|STRLEN keylen|NN SV *sv \
                                |NULLOK SV *pv|NULLOK const char *type      \
                                |STRLEN typelen                             \
                                |NULLOK const char ** error_msg
-s      |int    |ao             |int toketype
-s      |void|parse_ident|NN char **s|NN char **d \
+S      |int    |ao             |int toketype
+S      |void|parse_ident|NN char **s|NN char **d \
                      |NN char * const e|int allow_package \
                                |bool is_utf8|bool check_dollar \
                                |bool tick_warn
 #  if defined(PERL_CR_FILTER)
-s      |I32    |cr_textfilter  |int idx|NULLOK SV *sv|int maxlen
-s      |void   |strip_return   |NN SV *sv
+S      |I32    |cr_textfilter  |int idx|NULLOK SV *sv|int maxlen
+S      |void   |strip_return   |NN SV *sv
 #  endif
 #  if defined(DEBUGGING)
-s      |int    |tokereport     |I32 rv|NN const YYSTYPE* lvalp
-sf     |void   |printbuf       |NN const char *const fmt|NN const char *const s
+S      |int    |tokereport     |I32 rv|NN const YYSTYPE* lvalp
+Sf     |void   |printbuf       |NN const char *const fmt|NN const char *const s
 #  endif
 #endif
-EXMp   |bool   |validate_proto |NN SV *name|NULLOK SV *proto|bool warn \
+EXxp   |bool   |validate_proto |NN SV *name|NULLOK SV *proto|bool warn \
                |bool curstash
 
 #if defined(PERL_IN_UNIVERSAL_C)
-s      |bool   |isa_lookup     |NN HV *stash|NN const char * const name \
+S      |bool   |isa_lookup     |NN HV *stash|NN const char * const name \
                                         |STRLEN len|U32 flags
 #endif
 
 #if defined(PERL_IN_LOCALE_C)
 #  ifdef USE_LOCALE
-sn     |const char*|category_name |const int category
-s      |const char*|switch_category_locale_to_template|const int switch_category|const int template_category|NULLOK const char * template_locale
-s      |void   |restore_switched_locale|const int category|NULLOK const char * const original_locale
+ST     |const char*|category_name |const int category
+S      |const char*|switch_category_locale_to_template|const int switch_category|const int template_category|NULLOK const char * template_locale
+S      |void   |restore_switched_locale|const int category|NULLOK const char * const original_locale
 #  endif
 #  ifdef HAS_NL_LANGINFO
-sn     |const char*|my_nl_langinfo|const nl_item item|bool toggle
+ST     |const char*|my_nl_langinfo|const nl_item item|bool toggle
 #  else
-sn     |const char*|my_nl_langinfo|const int item|bool toggle
+ST     |const char*|my_nl_langinfo|const int item|bool toggle
 #  endif
-inR    |const char *|save_to_buffer|NULLOK const char * string \
+iTR    |const char *|save_to_buffer|NULLOK const char * string \
                                    |NULLOK char **buf          \
                                    |NN Size_t *buf_size        \
                                    |const Size_t offset
 #  if defined(USE_LOCALE)
-s      |char*  |stdize_locale  |NN char* locs
-s      |void   |new_collate    |NULLOK const char* newcoll
-s      |void   |new_ctype      |NN const char* newctype
-s      |void   |set_numeric_radix|const bool use_locale
-s      |void   |new_numeric    |NULLOK const char* newnum
+S      |char*  |stdize_locale  |NN char* locs
+S      |void   |new_collate    |NULLOK const char* newcoll
+S      |void   |new_ctype      |NN const char* newctype
+S      |void   |set_numeric_radix|const bool use_locale
+S      |void   |new_numeric    |NULLOK const char* newnum
 #    ifdef USE_POSIX_2008_LOCALE
-sn     |const char*|emulate_setlocale|const int category               \
+ST     |const char*|emulate_setlocale|const int category               \
                                    |NULLOK const char* locale          \
                                    |unsigned int index                 \
                                    |const bool is_index_valid
 #    endif
 #    ifdef WIN32
-s      |char*  |win32_setlocale|int category|NULLOK const char* locale
+S      |char*  |win32_setlocale|int category|NULLOK const char* locale
 #    endif
 #    ifdef DEBUGGING
-s      |void   |print_collxfrm_input_and_return                \
+S      |void   |print_collxfrm_input_and_return                \
                            |NN const char * const s            \
                            |NN const char * const e            \
                            |NULLOK const STRLEN * const xlen   \
                            |const bool is_utf8
-s      |void   |print_bytes_for_locale |NN const char * const s        \
+S      |void   |print_bytes_for_locale |NN const char * const s        \
                                        |NN const char * const e        \
                                        |const bool is_utf8
-snR    |char * |setlocale_debug_string |const int category                 \
+STR    |char * |setlocale_debug_string |const int category                 \
                                        |NULLOK const char* const locale    \
                                        |NULLOK const char* const retval
 #    endif
@@ -2873,16 +2936,16 @@ snR     |char * |setlocale_debug_string |const int category                 \
         || defined(PERL_IN_MG_C)       \
        || defined (PERL_EXT_POSIX)     \
        || defined (PERL_EXT_LANGINFO))
-ApM    |bool   |_is_cur_LC_category_utf8|int category
+Apx    |bool   |_is_cur_LC_category_utf8|int category
 #endif
 
 
 #if defined(PERL_IN_UTIL_C)
-s      |SV*    |mess_alloc
-s      |SV *   |with_queued_errors|NN SV *ex
-s      |bool   |invoke_exception_hook|NULLOK SV *ex|bool warn
+S      |SV*    |mess_alloc
+S      |SV *   |with_queued_errors|NN SV *ex
+S      |bool   |invoke_exception_hook|NULLOK SV *ex|bool warn
 #if defined(PERL_MEM_LOG) && !defined(PERL_MEM_LOG_NOIMPL)
-sn     |void   |mem_log_common |enum mem_log_type mlt|const UV n|const UV typesize \
+ST     |void   |mem_log_common |enum mem_log_type mlt|const UV n|const UV typesize \
                                |NN const char *type_name|NULLOK const SV *sv \
                                |Malloc_t oldalloc|Malloc_t newalloc \
                                |NN const char *filename|const int linenumber \
@@ -2891,16 +2954,16 @@ sn      |void   |mem_log_common |enum mem_log_type mlt|const UV n|const UV typesize \
 #endif
 
 #if defined(PERL_MEM_LOG)
-pn     |Malloc_t       |mem_log_alloc  |const UV nconst|UV typesize|NN const char *type_name|Malloc_t newalloc|NN const char *filename|const int linenumber|NN const char *funcname
-pn     |Malloc_t       |mem_log_realloc        |const UV n|const UV typesize|NN const char *type_name|Malloc_t oldalloc|Malloc_t newalloc|NN const char *filename|const int linenumber|NN const char *funcname
-pn     |Malloc_t       |mem_log_free   |Malloc_t oldalloc|NN const char *filename|const int linenumber|NN const char *funcname
+pT     |Malloc_t       |mem_log_alloc  |const UV nconst|UV typesize|NN const char *type_name|Malloc_t newalloc|NN const char *filename|const int linenumber|NN const char *funcname
+pT     |Malloc_t       |mem_log_realloc        |const UV n|const UV typesize|NN const char *type_name|Malloc_t oldalloc|Malloc_t newalloc|NN const char *filename|const int linenumber|NN const char *funcname
+pT     |Malloc_t       |mem_log_free   |Malloc_t oldalloc|NN const char *filename|const int linenumber|NN const char *funcname
 #endif
 
 #if defined(PERL_IN_UTF8_C)
-sR     |HV *   |new_msg_hv |NN const char * const message                  \
+SR     |HV *   |new_msg_hv |NN const char * const message                  \
                            |U32 categories                                 \
                            |U32 flag
-sRM    |UV     |check_locale_boundary_crossing                             \
+SRx    |UV     |check_locale_boundary_crossing                             \
                |NN const U8* const p                                       \
                |const UV result                                            \
                |NN U8* const ustrp                                         \
@@ -2910,13 +2973,13 @@ iR      |bool   |is_utf8_common |NN const U8 *const p                       \
 iR     |bool   |is_utf8_common_with_len|NN const U8 *const p               \
                                        |NN const U8 *const e               \
                                        |NULLOK SV* const invlist
-sR     |SV*    |swatch_get     |NN SV* swash|UV start|UV span
-sRM    |U8*    |swash_scan_list_line|NN U8* l|NN U8* const lend|NN UV* min \
+SR     |SV*    |swatch_get     |NN SV* swash|UV start|UV span
+SRx    |U8*    |swash_scan_list_line|NN U8* l|NN U8* const lend|NN UV* min \
                |NN UV* max|NN UV* val|const bool wants_value               \
                |NN const U8* const typestr
 #endif
 
-EXiMn  |void   |append_utf8_from_native_byte|const U8 byte|NN U8** dest
+EXixT  |void   |append_utf8_from_native_byte|const U8 byte|NN U8** dest
 
 Apd    |void   |sv_set_undef   |NN SV *sv
 Apd    |void   |sv_setsv_flags |NN SV *dstr|NULLOK SV *sstr|const I32 flags
@@ -2933,11 +2996,11 @@ Apmd    |void   |sv_copypv_nomg |NN SV *const dsv|NN SV *const ssv
 Apd    |void   |sv_copypv_flags        |NN SV *const dsv|NN SV *const ssv|const I32 flags
 Apo    |char*  |my_atof2       |NN const char *orig|NN NV* value
 Ap     |char*  |my_atof3       |NN const char *orig|NN NV* value|const STRLEN len
-Apn    |int    |my_socketpair  |int family|int type|int protocol|int fd[2]
-Apn    |int    |my_dirfd       |NULLOK DIR* dir
+ApT    |int    |my_socketpair  |int family|int type|int protocol|int fd[2]
+ApT    |int    |my_dirfd       |NULLOK DIR* dir
 #ifdef PERL_ANY_COW
 : Used in pp_hot.c and regexec.c
-pMXE   |SV*    |sv_setsv_cow   |NULLOK SV* dstr|NN SV* sstr
+pxXE   |SV*    |sv_setsv_cow   |NULLOK SV* dstr|NN SV* sstr
 #endif
 
 Aop    |const char *|PerlIO_context_layers|NULLOK const char *mode
@@ -2978,17 +3041,17 @@ ApR     |PerlIO *|PerlIO_stderr
 : Only used in dump.c
 p      |void   |deb_stack_all
 #if defined(PERL_IN_DEB_C)
-s      |void   |deb_stack_n    |NN SV** stack_base|I32 stack_min \
+S      |void   |deb_stack_n    |NN SV** stack_base|I32 stack_min \
                                |I32 stack_max|I32 mark_min|I32 mark_max
 #endif
 
 : pad API
 ApdR   |PADLIST*|pad_new       |int flags
 #ifdef DEBUGGING
-pnX    |void|set_padlist| NN CV * cv | NULLOK PADLIST * padlist
+pTX    |void|set_padlist| NN CV * cv | NULLOK PADLIST * padlist
 #endif
 #if defined(PERL_IN_PAD_C)
-s      |PADOFFSET|pad_alloc_name|NN PADNAME *name|U32 flags \
+S      |PADOFFSET|pad_alloc_name|NN PADNAME *name|U32 flags \
                                |NULLOK HV *typestash|NULLOK HV *ourstash
 #endif
 Apd    |PADOFFSET|pad_add_name_pvn|NN const char *namepv|STRLEN namelen\
@@ -3000,11 +3063,11 @@ Apd     |PADOFFSET|pad_add_name_pv|NN const char *name\
 Apd    |PADOFFSET|pad_add_name_sv|NN SV *name\
                                |U32 flags|NULLOK HV *typestash\
                                |NULLOK HV *ourstash
-AMpd   |PADOFFSET|pad_alloc    |I32 optype|U32 tmptype
+Axpd   |PADOFFSET|pad_alloc    |I32 optype|U32 tmptype
 Apd    |PADOFFSET|pad_add_anon |NN CV* func|I32 optype
 p      |void   |pad_add_weakref|NN CV* func
 #if defined(PERL_IN_PAD_C)
-sd     |void   |pad_check_dup  |NN PADNAME *name|U32 flags \
+Sd     |void   |pad_check_dup  |NN PADNAME *name|U32 flags \
                                |NULLOK const HV *ourstash
 #endif
 Apd    |PADOFFSET|pad_findmy_pvn|NN const char* namepv|STRLEN namelen|U32 flags
@@ -3013,7 +3076,7 @@ Apd       |PADOFFSET|pad_findmy_sv|NN SV* name|U32 flags
 ApdD   |PADOFFSET|find_rundefsvoffset  |
 Apd    |SV*    |find_rundefsv  |
 #if defined(PERL_IN_PAD_C)
-sd     |PADOFFSET|pad_findlex  |NN const char *namepv|STRLEN namelen|U32 flags \
+Sd     |PADOFFSET|pad_findlex  |NN const char *namepv|STRLEN namelen|U32 flags \
                                |NN const CV* cv|U32 seq|int warn \
                                |NULLOK SV** out_capture \
                                |NN PADNAME** out_name|NN int *out_flags
@@ -3027,14 +3090,14 @@ Apd     |U32    |intro_my
 pd     |OP *   |pad_leavemy
 pd     |void   |pad_swipe      |PADOFFSET po|bool refadjust
 #if defined(PERL_IN_PAD_C)
-sd     |void   |pad_reset
+Sd     |void   |pad_reset
 #endif
-AMpd   |void   |pad_tidy       |padtidy_type type
+Axpd   |void   |pad_tidy       |padtidy_type type
 pd     |void   |pad_free       |PADOFFSET po
 pd     |void   |do_dump_pad    |I32 level|NN PerlIO *file|NULLOK PADLIST *padlist|int full
 #if defined(PERL_IN_PAD_C)
 #  if defined(DEBUGGING)
-sd     |void   |cv_dump        |NN const CV *cv|NN const char *title
+Sd     |void   |cv_dump        |NN const CV *cv|NN const char *title
 #  endif
 #endif
 Apd    |CV*    |cv_clone       |NN CV* proto
@@ -3042,9 +3105,9 @@ p |CV*    |cv_clone_into  |NN CV* proto|NN CV *target
 pd     |void   |pad_fixup_inner_anons|NN PADLIST *padlist|NN CV *old_cv|NN CV *new_cv
 pdX    |void   |pad_push       |NN PADLIST *padlist|int depth
 ApbdR  |HV*    |pad_compname_type|const PADOFFSET po
-AMpdRn |PADNAME *|padnamelist_fetch|NN PADNAMELIST *pnl|SSize_t key
+AxpdRT |PADNAME *|padnamelist_fetch|NN PADNAMELIST *pnl|SSize_t key
 Xop    |void   |padnamelist_free|NN PADNAMELIST *pnl
-AMpd   |PADNAME **|padnamelist_store|NN PADNAMELIST *pnl|SSize_t key \
+Axpd   |PADNAME **|padnamelist_store|NN PADNAMELIST *pnl|SSize_t key \
                                     |NULLOK PADNAME *val
 Xop    |void   |padname_free   |NN PADNAME *pn
 #if defined(USE_ITHREADS)
@@ -3073,7 +3136,7 @@ Apod      |void   |hv_assert      |NN HV *hv
 
 ApdR   |SV*    |hv_scalar      |NN HV *hv
 p      |void   |hv_pushkv      |NN HV *hv|U32 flags
-ApdRM  |SV*    |hv_bucket_ratio|NN HV *hv
+ApdRx  |SV*    |hv_bucket_ratio|NN HV *hv
 ApoR   |I32*   |hv_riter_p     |NN HV *hv
 ApoR   |HE**   |hv_eiter_p     |NN HV *hv
 Apo    |void   |hv_riter_set   |NN HV *hv|I32 riter
@@ -3085,9 +3148,9 @@ p |void   |hv_ename_add   |NN HV *hv|NN const char *name|U32 len \
 p      |void   |hv_ename_delete|NN HV *hv|NN const char *name|U32 len \
                                |U32 flags
 : Used in dump.c and hv.c
-poM    |AV**   |hv_backreferences_p    |NN HV *hv
+pox    |AV**   |hv_backreferences_p    |NN HV *hv
 #if defined(PERL_IN_DUMP_C) || defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_SCOPE_C)
-poM    |void   |hv_kill_backrefs       |NN HV *hv
+pox    |void   |hv_kill_backrefs       |NN HV *hv
 #endif
 Apd    |void   |hv_clear_placeholders  |NN HV *hv
 XpoR   |SSize_t*|hv_placeholders_p     |NN HV *hv
@@ -3098,11 +3161,11 @@ Apo     |void   |hv_placeholders_set    |NN HV *hv|I32 ph
 p      |SV*    |magic_scalarpack|NN HV *hv|NN MAGIC *mg
 
 #if defined(PERL_IN_SV_C)
-s      |SV *   |find_hash_subscript|NULLOK const HV *const hv \
+S      |SV *   |find_hash_subscript|NULLOK const HV *const hv \
                |NN const SV *const val
-s      |SSize_t|find_array_subscript|NULLOK const AV *const av \
+S      |SSize_t|find_array_subscript|NULLOK const AV *const av \
                |NN const SV *const val
-sMd    |SV*    |find_uninit_var|NULLOK const OP *const obase \
+Sxd    |SV*    |find_uninit_var|NULLOK const OP *const obase \
                |NULLOK const SV *const uninit_sv|bool match \
                |NN const char **desc_p
 #endif
@@ -3119,25 +3182,23 @@ p       |void   |dump_sv_child  |NN SV *sv
 Apbm   |GV*    |gv_SVadd       |NULLOK GV *gv
 #endif
 #if defined(PERL_IN_UTIL_C)
-s      |bool   |ckwarn_common  |U32 w
+S      |bool   |ckwarn_common  |U32 w
 #endif
 ApoP   |bool   |ckwarn         |U32 w
 ApoP   |bool   |ckwarn_d       |U32 w
 : FIXME - exported for ByteLoader - public or private?
-XEopMR |STRLEN *|new_warnings_bitfield|NULLOK STRLEN *buffer \
+XEopxR |STRLEN *|new_warnings_bitfield|NULLOK STRLEN *buffer \
                                |NN const char *const bits|STRLEN size
 
-: DON'T REMOVE THE my_sprintf LINE.
-Apnod   |int    |my_sprintf     |NN char *buffer|NN const char *pat|...
-Apnodf |int    |my_snprintf    |NN char *buffer|const Size_t len|NN const char *format|...
-Apnod  |int    |my_vsnprintf   |NN char *buffer|const Size_t len|NN const char *format|va_list ap
+AMpTodf        |int    |my_snprintf    |NN char *buffer|const Size_t len|NN const char *format|...
+AMpTod |int    |my_vsnprintf   |NN char *buffer|const Size_t len|NN const char *format|va_list ap
 #ifdef USE_QUADMATH
-Apnd   |const char*    |quadmath_format_single|NN const char* format
-Apnd   |bool|quadmath_format_needed|NN const char* format
+ApTd   |const char*    |quadmath_format_single|NN const char* format
+ApTd   |bool|quadmath_format_needed|NN const char* format
 #endif
 
 : Used in mg.c, sv.c
-px     |void   |my_clearenv
+pe     |void   |my_clearenv
 
 #ifdef PERL_IMPLICIT_CONTEXT
 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
@@ -3148,42 +3209,42 @@ Apo     |void*  |my_cxt_init    |NN int *indexp|size_t size
 #endif
 #endif
 #if defined(PERL_IN_UTIL_C)
-so     |void   |xs_version_bootcheck|U32 items|U32 ax|NN const char *xs_p \
+So     |void   |xs_version_bootcheck|U32 items|U32 ax|NN const char *xs_p \
                                |STRLEN xs_len
 #endif
-Xpon   |I32    |xs_handshake   |const U32 key|NN void * v_my_perl\
+XpoT   |I32    |xs_handshake   |const U32 key|NN void * v_my_perl\
                                |NN const char * file| ...
 Xp     |void   |xs_boot_epilog |const I32 ax
 #ifndef HAS_STRLCAT
-Apnod  |Size_t |my_strlcat     |NULLOK char *dst|NULLOK const char *src|Size_t size
+ApTd   |Size_t |my_strlcat     |NULLOK char *dst|NULLOK const char *src|Size_t size
 #endif
 
 #ifndef HAS_STRLCPY
-Apnod  |Size_t |my_strlcpy     |NULLOK char *dst|NULLOK const char *src|Size_t size
+ApTd   |Size_t |my_strlcpy     |NULLOK char *dst|NULLOK const char *src|Size_t size
 #endif
 
 #ifndef HAS_STRNLEN
-Apnod  |Size_t |my_strnlen     |NN const char *str|Size_t maxlen
+ApTd   |Size_t |my_strnlen     |NN const char *str|Size_t maxlen
 #endif
 
 #ifndef HAS_MKOSTEMP
-pno    |int    |my_mkostemp    |NN char *templte|int flags
+pTo    |int    |my_mkostemp    |NN char *templte|int flags
 #endif
 #ifndef HAS_MKSTEMP
-pno    |int    |my_mkstemp     |NN char *templte
+pTo    |int    |my_mkstemp     |NN char *templte
 #endif
 
-APpdn  |bool   |isinfnan       |NV nv
+APpdT  |bool   |isinfnan       |NV nv
 p      |bool   |isinfnansv     |NN SV *sv
 
 #if !defined(HAS_SIGNBIT)
-AMdnoP |int    |Perl_signbit   |NV f
+AxdToP |int    |Perl_signbit   |NV f
 #endif
 
 : Used by B
-XEMop  |void   |emulate_cop_io |NN const COP *const c|NN SV *const sv
+XExop  |void   |emulate_cop_io |NN const COP *const c|NN SV *const sv
 : Used by SvRX and SvRXOK
-XEMop  |REGEXP *|get_re_arg|NULLOK SV *sv
+XExop  |REGEXP *|get_re_arg|NULLOK SV *sv
 
 Aop    |SV*    |mro_get_private_data|NN struct mro_meta *const smeta \
                                     |NN const struct mro_alg *const which
@@ -3202,13 +3263,13 @@ p       |struct mro_meta*       |mro_meta_dup   |NN struct mro_meta* smeta|NN CLONE_PARAMS* pa
 #endif
 Apd    |AV*    |mro_get_linear_isa|NN HV* stash
 #if defined(PERL_IN_MRO_C)
-sd     |AV*    |mro_get_linear_isa_dfs|NN HV* stash|U32 level
-s      |void   |mro_clean_isarev|NN HV * const isa   \
+Sd     |AV*    |mro_get_linear_isa_dfs|NN HV* stash|U32 level
+S      |void   |mro_clean_isarev|NN HV * const isa   \
                                 |NN const char * const name \
                                 |const STRLEN len \
                                 |NULLOK HV * const exceptions \
                                 |U32 hash|U32 flags
-s      |void   |mro_gather_and_rename|NN HV * const stashes \
+S      |void   |mro_gather_and_rename|NN HV * const stashes \
                                      |NN HV * const seen_stashes \
                                      |NULLOK HV *stash \
                                      |NULLOK HV *oldstash \
@@ -3217,27 +3278,27 @@ s       |void   |mro_gather_and_rename|NN HV * const stashes \
 : Used in hv.c, mg.c, pp.c, sv.c
 pd     |void   |mro_isa_changed_in|NN HV* stash
 Apd    |void   |mro_method_changed_in  |NN HV* stash
-pdx    |void   |mro_package_moved      |NULLOK HV * const stash|NULLOK HV * const oldstash|NN const GV * const gv|U32 flags
+pde    |void   |mro_package_moved      |NULLOK HV * const stash|NULLOK HV * const oldstash|NN const GV * const gv|U32 flags
 : Only used in perl.c
 p      |void   |boot_core_mro
-Apon   |void   |sys_init       |NN int* argc|NN char*** argv
-Apon   |void   |sys_init3      |NN int* argc|NN char*** argv|NN char*** env
-Apon   |void   |sys_term
-ApoM   |const char *|cop_fetch_label|NN COP *const cop \
+ApoT   |void   |sys_init       |NN int* argc|NN char*** argv
+ApoT   |void   |sys_init3      |NN int* argc|NN char*** argv|NN char*** env
+ApoT   |void   |sys_term
+AMpx   |const char *|cop_fetch_label|NN COP *const cop \
                |NULLOK STRLEN *len|NULLOK U32 *flags
 : Only used  in op.c and the perl compiler
-ApoM   |void|cop_store_label \
+AMpx   |void|cop_store_label \
                |NN COP *const cop|NN const char *label|STRLEN len|U32 flags
 
-xpo    |int    |keyword_plugin_standard|NN char* keyword_ptr|STRLEN keyword_len|NN OP** op_ptr
+epo    |int    |keyword_plugin_standard|NN char* keyword_ptr|STRLEN keyword_len|NN OP** op_ptr
 
 #if defined(USE_ITHREADS)
 #  if defined(PERL_IN_SV_C)
-s      |void   |unreferenced_to_tmp_stack|NN AV *const unreferenced
+S      |void   |unreferenced_to_tmp_stack|NN AV *const unreferenced
 #  endif
-ARnop  |CLONE_PARAMS *|clone_params_new|NN PerlInterpreter *const from \
+ARTop  |CLONE_PARAMS *|clone_params_new|NN PerlInterpreter *const from \
                |NN PerlInterpreter *const to
-Anop   |void   |clone_params_del|NN CLONE_PARAMS *param
+ATop   |void   |clone_params_del|NN CLONE_PARAMS *param
 #endif
 
 : Used in perl.c and toke.c
@@ -3256,32 +3317,32 @@ Ei      |STRLEN |sv_or_pv_pos_u2b|NN SV *sv|NN const char *pv|STRLEN pos \
 
 Ap     |void   |clear_defarray |NN AV* av|bool abandon
 
-ApM    |void   |leave_adjust_stacks|NN SV **from_sp|NN SV **to_sp \
+Apx    |void   |leave_adjust_stacks|NN SV **from_sp|NN SV **to_sp \
                 |U8 gimme|int filter
 
 #ifndef PERL_NO_INLINE_FUNCTIONS
-AiM    |PERL_CONTEXT * |cx_pushblock|U8 type|U8 gimme|NN SV** sp|I32 saveix
-AiM    |void   |cx_popblock|NN PERL_CONTEXT *cx
-AiM    |void   |cx_topblock|NN PERL_CONTEXT *cx
-AiM    |void   |cx_pushsub      |NN PERL_CONTEXT *cx|NN CV *cv \
+Aix    |PERL_CONTEXT * |cx_pushblock|U8 type|U8 gimme|NN SV** sp|I32 saveix
+Aix    |void   |cx_popblock|NN PERL_CONTEXT *cx
+Aix    |void   |cx_topblock|NN PERL_CONTEXT *cx
+Aix    |void   |cx_pushsub      |NN PERL_CONTEXT *cx|NN CV *cv \
                                 |NULLOK OP *retop|bool hasargs
-AiM    |void   |cx_popsub_common|NN PERL_CONTEXT *cx
-AiM    |void   |cx_popsub_args  |NN PERL_CONTEXT *cx
-AiM    |void   |cx_popsub       |NN PERL_CONTEXT *cx
-AiM    |void   |cx_pushformat   |NN PERL_CONTEXT *cx|NN CV *cv \
+Aix    |void   |cx_popsub_common|NN PERL_CONTEXT *cx
+Aix    |void   |cx_popsub_args  |NN PERL_CONTEXT *cx
+Aix    |void   |cx_popsub       |NN PERL_CONTEXT *cx
+Aix    |void   |cx_pushformat   |NN PERL_CONTEXT *cx|NN CV *cv \
                                 |NULLOK OP *retop|NULLOK GV *gv
-AiM    |void   |cx_popformat    |NN PERL_CONTEXT *cx
-AiM    |void   |cx_pusheval     |NN PERL_CONTEXT *cx \
+Aix    |void   |cx_popformat    |NN PERL_CONTEXT *cx
+Aix    |void   |cx_pusheval     |NN PERL_CONTEXT *cx \
                                 |NULLOK OP *retop|NULLOK SV *namesv
-AiM    |void   |cx_popeval      |NN PERL_CONTEXT *cx
-AiM    |void   |cx_pushloop_plain|NN PERL_CONTEXT *cx
-AiM    |void   |cx_pushloop_for |NN PERL_CONTEXT *cx \
+Aix    |void   |cx_popeval      |NN PERL_CONTEXT *cx
+Aix    |void   |cx_pushloop_plain|NN PERL_CONTEXT *cx
+Aix    |void   |cx_pushloop_for |NN PERL_CONTEXT *cx \
                                 |NN void *itervarp|NULLOK SV *itersave
-AiM    |void   |cx_poploop      |NN PERL_CONTEXT *cx
-AiM    |void   |cx_pushwhen     |NN PERL_CONTEXT *cx
-AiM    |void   |cx_popwhen      |NN PERL_CONTEXT *cx
-AiM    |void   |cx_pushgiven    |NN PERL_CONTEXT *cx|NULLOK SV *orig_defsv
-AiM    |void   |cx_popgiven     |NN PERL_CONTEXT *cx
+Aix    |void   |cx_poploop      |NN PERL_CONTEXT *cx
+Aix    |void   |cx_pushwhen     |NN PERL_CONTEXT *cx
+Aix    |void   |cx_popwhen      |NN PERL_CONTEXT *cx
+Aix    |void   |cx_pushgiven    |NN PERL_CONTEXT *cx|NULLOK SV *orig_defsv
+Aix    |void   |cx_popgiven     |NN PERL_CONTEXT *cx
 #endif
 
 #ifdef USE_DTRACE
diff --git a/dist/Devel-PPPort/parts/inc/01_test b/dist/Devel-PPPort/parts/inc/01_test
new file mode 100644 (file)
index 0000000..bf28853
--- /dev/null
@@ -0,0 +1,13 @@
+################################################################################
+##
+##  Copyright (C) 2019, Pali <pali@cpan.org>
+##
+##  This program is free software; you can redistribute it and/or
+##  modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=tests plan => 1
+
+# This test file is used as target dependency for Makefile
+ok 1;
index 4f0ded3..da8d423 100644 (file)
@@ -17,21 +17,8 @@ sv_2pvbyte
 sv_2pv_flags
 sv_pvn_force_flags
 
-=dontwarn
-
-NEED_sv_2pv_flags
-NEED_sv_2pv_flags_GLOBAL
-
 =implementation
 
-/* Backwards compatibility stuff... :-( */
-#if !defined(NEED_sv_2pv_flags) && defined(NEED_sv_2pv_nolen)
-#  define NEED_sv_2pv_flags
-#endif
-#if !defined(NEED_sv_2pv_flags_GLOBAL) && defined(NEED_sv_2pv_nolen_GLOBAL)
-#  define NEED_sv_2pv_flags_GLOBAL
-#endif
-
 /* Hint: sv_2pv_nolen
  * Use the SvPV_nolen() or SvPV_nolen_const() macros instead of sv_2pv_nolen().
  */
@@ -47,16 +34,7 @@ __UNDEFINED__  sv_2pv_nolen(sv)   SvPV_nolen(sv)
 
 #if { VERSION < 5.7.0 }
 
-#if { NEED sv_2pvbyte }
-
-char *
-sv_2pvbyte(pTHX_ SV *sv, STRLEN *lp)
-{
-  sv_utf8_downgrade(sv,0);
-  return SvPV(sv,*lp);
-}
-
-#endif
+__UNDEFINED__ sv_2pvbyte(sv, lp) (sv_utf8_downgrade((sv), 0), SvPV((sv), *(lp)))
 
 /* Hint: sv_2pvbyte
  * Use the SvPVbyte() macro instead of sv_2pvbyte().
@@ -92,7 +70,6 @@ __UNDEFINED__  SV_IMMEDIATE_UNREF       0
 __UNDEFINED__  SV_GMAGIC                0
 __UNDEFINED__  SV_COW_DROP_PV           0
 __UNDEFINED__  SV_UTF8_NO_ENCODING      0
-__UNDEFINED__  SV_NOSTEAL               0
 __UNDEFINED__  SV_CONST_RETURN          0
 __UNDEFINED__  SV_MUTABLE_RETURN        0
 __UNDEFINED__  SV_SMAGIC                0
@@ -101,27 +78,8 @@ __UNDEFINED__  SV_COW_SHARED_HASH_KEYS  0
 
 #if { VERSION < 5.7.2 }
 
-#if { NEED sv_2pv_flags }
-
-char *
-sv_2pv_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
-{
-  STRLEN n_a = (STRLEN) flags;
-  return sv_2pv(sv, lp ? lp : &n_a);
-}
-
-#endif
-
-#if { NEED sv_pvn_force_flags }
-
-char *
-sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
-{
-  STRLEN n_a = (STRLEN) flags;
-  return sv_pvn_force(sv, lp ? lp : &n_a);
-}
-
-#endif
+__UNDEFINED__ sv_2pv_flags(sv, lp, flags) sv_2pv((sv), (lp) ? (lp) : &PL_na)
+__UNDEFINED__ sv_pvn_force_flags(sv, lp, flags) sv_pvn_force((sv), (lp) ? (lp) : &PL_na)
 
 #endif
 
@@ -191,12 +149,6 @@ __UNDEFINED__  SvPV_renew(sv,n) STMT_START { SvLEN_set(sv, n); \
                        (Malloc_t)SvPVX(sv), (MEM_SIZE)((n)))); \
                } STMT_END
 
-=xsinit
-
-#define NEED_sv_2pv_flags
-#define NEED_sv_pvn_force_flags
-#define NEED_sv_2pvbyte
-
 =xsubs
 
 IV
index 30452ae..338b6d3 100644 (file)
 
 __UNDEFINED__
 
+SV_NOSTEAL
+sv_setsv_flags
+newSVsv_nomg
+
 =implementation
 
+#if ( { VERSION >= 5.7.3 } && { VERSION < 5.8.7 } ) || ( { VERSION >= 5.9.0 } && { VERSION < 5.9.2 } )
+#undef sv_setsv_flags
+#define SV_NOSTEAL 16
+#define sv_setsv_flags(dstr, sstr, flags)                                \
+  STMT_START {                                                           \
+    if (((flags) & SV_NOSTEAL) && (SvFLAGS((sstr)) & SVs_TEMP)) {        \
+      SvTEMP_off((sstr));                                                \
+      Perl_sv_setsv_flags(aTHX_ (dstr), (sstr), (flags) & ~SV_NOSTEAL);  \
+      SvTEMP_on((sstr));                                                 \
+    } else {                                                             \
+      Perl_sv_setsv_flags(aTHX_ (dstr), (sstr), (flags) & ~SV_NOSTEAL);  \
+    }                                                                    \
+  } STMT_END
+#endif
+
+#if !defined(newSVsv_nomg) && defined(SV_NOSTEAL)
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+#  define newSVsv_nomg(sv) ({ SV *_sv = newSV(0); sv_setsv_flags(_sv, (sv), SV_NOSTEAL); _sv; })
+#else
+#  define newSVsv_nomg(sv) ((PL_Sv = newSV(0)), sv_setsv_flags(PL_Sv, (sv), SV_NOSTEAL), PL_Sv)
+#endif
+#endif
+
 __UNDEFINED__ SvMAGIC_set(sv, val) \
                 STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
                 (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END
@@ -94,7 +121,35 @@ TestSvSTASH_set(sv, name)
                 SvREFCNT_dec(SvSTASH(sv));
                 SvSTASH_set(sv, (HV*) SvREFCNT_inc(gv_stashpv(name, 0)));
 
-=tests plan => 5
+#ifdef SV_NOSTEAL
+
+IV
+Test_sv_setsv_SV_NOSTEAL()
+        PREINIT:
+                SV *sv1, *sv2;
+        CODE:
+                sv1 = sv_2mortal(newSVpv("test1", 0));
+                sv2 = sv_2mortal(newSVpv("test2", 0));
+                sv_setsv_flags(sv2, sv1, SV_NOSTEAL);
+                RETVAL = (strEQ(SvPV_nolen(sv1), "test1") && strEQ(SvPV_nolen(sv2), "test1"));
+        OUTPUT:
+                RETVAL
+
+#endif
+
+#ifdef newSVsv_nomg
+
+SV *
+newSVsv_nomg(sv)
+        SV *sv
+        CODE:
+                RETVAL = newSVsv_nomg(sv);
+        OUTPUT:
+                RETVAL
+
+#endif
+
+=tests plan => 15
 
 my $foo = 5;
 ok(&Devel::PPPort::TestSvUV_set($foo, 12345), 42);
@@ -109,6 +164,47 @@ ok($bar->x(), 'foobar');
 Devel::PPPort::TestSvSTASH_set($bar, 'bar');
 ok($bar->x(), 'hacker');
 
+if ( "$]" lt '5.007003' ) {
+    skip 'skip: no SV_NOSTEAL support', 0 for 1..10;
+} else {
+    ok(Devel::PPPort::Test_sv_setsv_SV_NOSTEAL());
+
+    tie my $scalar, 'TieScalarCounter', 'string';
+
+    ok tied($scalar)->{fetch}, 0;
+    ok tied($scalar)->{store}, 0;
+    my $copy = Devel::PPPort::newSVsv_nomg($scalar);
+    ok tied($scalar)->{fetch}, 0;
+    ok tied($scalar)->{store}, 0;
+
+    my $fetch = $scalar;
+    ok tied($scalar)->{fetch}, 1;
+    ok tied($scalar)->{store}, 0;
+    my $copy2 = Devel::PPPort::newSVsv_nomg($scalar);
+    ok tied($scalar)->{fetch}, 1;
+    ok tied($scalar)->{store}, 0;
+    ok $copy2, 'string';
+}
+
+package TieScalarCounter;
+
+sub TIESCALAR {
+    my ($class, $value) = @_;
+    return bless { fetch => 0, store => 0, value => $value }, $class;
+}
+
+sub FETCH {
+    my ($self) = @_;
+    $self->{fetch}++;
+    return $self->{value};
+}
+
+sub STORE {
+    my ($self, $value) = @_;
+    $self->{store}++;
+    $self->{value} = $value;
+}
+
 package foo;
 
 sub x { 'foobar' }
index 7c46cbb..126ed2e 100644 (file)
@@ -59,6 +59,7 @@ SV*
 eval_pv(char *p, I32 croak_on_error)
 {
     dSP;
+    SV* errsv;
     SV* sv = newSVpv(p, 0);
 
     PUSHMARK(sp);
@@ -69,8 +70,11 @@ eval_pv(char *p, I32 croak_on_error)
     sv = POPs;
     PUTBACK;
 
-    if (croak_on_error && SvTRUEx(ERRSV))
-        croak_sv(ERRSV);
+    if (croak_on_error) {
+        errsv = ERRSV;
+        if (SvTRUE(errsv))
+            croak_sv(errsv);
+    }
 
     return sv;
 }
index d2f526f..c7e6d89 100644 (file)
 
 =provides
 
+GV_NOADD_MASK
 gv_fetchpvn_flags
+GvSVn
+isGV_with_GP
+gv_fetchsv
+get_cvn_flags
+gv_init_pvn
 
 =implementation
 
-#ifndef gv_fetchpvn_flags
-#if { NEED gv_fetchpvn_flags }
-
-GV*
-gv_fetchpvn_flags(pTHX_ const char* name, STRLEN len, int flags, int types) {
-       char *namepv = savepvn(name, len);
-       GV* stash = gv_fetchpv(namepv, TRUE, SVt_PVHV);
-       Safefree(namepv);
-       return stash;
-}
-
-#endif
+#if { VERSION >= 5.9.2 } && { VERSION <= 5.9.3 } /* 5.9.2 and 5.9.3 ignore the length param */
+#undef gv_fetchpvn_flags
 #endif
 
+__UNDEFINED__ GV_NOADD_MASK 0xE0
+__UNDEFINED__ gv_fetchpvn_flags(name, len, flags, sv_type) gv_fetchpv(SvPVX(sv_2mortal(newSVpvn((name), (len)))), ((flags) & GV_NOADD_MASK) ? FALSE : TRUE, (I32)(sv_type))
+
 __UNDEFINED__ GvSVn(gv)        GvSV(gv)
 __UNDEFINED__ isGV_with_GP(gv) isGV(gv)
 __UNDEFINED__ gv_fetchsv(name, flags, svt) gv_fetchpv(SvPV_nolen_const(name), flags, svt)
@@ -36,10 +35,6 @@ __UNDEFINED__ gv_fetchsv(name, flags, svt) gv_fetchpv(SvPV_nolen_const(name), fl
 __UNDEFINED__ get_cvn_flags(name, namelen, flags) get_cv(name, flags)
 __UNDEFINED__ gv_init_pvn(gv, stash, ptr, len, flags) gv_init(gv, stash, ptr, len, flags & GV_ADDMULTI ? TRUE : FALSE)
 
-=xsinit
-
-#define NEED_gv_fetchpvn_flags
-
 =xsubs
 
 int
@@ -92,11 +87,7 @@ get_cvn_flags()
 SV*
 gv_fetchpvn_flags()
         CODE:
-#if { VERSION < 5.9.2 } || { VERSION > 5.9.3 } /* 5.9.2 and 5.9.3 ignore the length param */
                 RETVAL = newRV_inc((SV*)gv_fetchpvn_flags("Devel::PPPort::VERSIONFAKE", sizeof("Devel::PPPort::VERSIONFAKE")-5, 0, SVt_PV));
-#else
-                RETVAL = newRV_inc((SV*)gv_fetchpvn_flags("Devel::PPPort::VERSION", 0, 0, SVt_PV));
-#endif
         OUTPUT:
                 RETVAL
 
index e9af174..55d1e02 100644 (file)
@@ -50,24 +50,25 @@ NEED_vmess
 #ifndef croak_sv
 #if { VERSION >= 5.7.3 } || ( { VERSION >= 5.6.1 } && { VERSION < 5.7.0 } )
 #  if ( { VERSION >= 5.8.0 } && { VERSION < 5.8.9 } ) || ( { VERSION >= 5.9.0 } && { VERSION < 5.10.1 } )
-#    define D_PPP_FIX_UTF8_ERRSV(errsv, sv)                     \
-        STMT_START {                                            \
-            if (sv != errsv)                                    \
-                SvFLAGS(errsv) = (SvFLAGS(errsv) & ~SVf_UTF8) | \
-                                 (SvFLAGS(sv) & SVf_UTF8);      \
+#    define D_PPP_FIX_UTF8_ERRSV_FOR_SV(sv)                    \
+        STMT_START {                                           \
+            SV *_errsv = ERRSV;                                \
+            SvFLAGS(_errsv) = (SvFLAGS(_errsv) & ~SVf_UTF8) |  \
+                              (SvFLAGS(sv) & SVf_UTF8);        \
         } STMT_END
 #  else
-#    define D_PPP_FIX_UTF8_ERRSV(errsv, sv) STMT_START {} STMT_END
+#    define D_PPP_FIX_UTF8_ERRSV_FOR_SV(sv) STMT_START {} STMT_END
 #  endif
-#  define croak_sv(sv)                        \
-    STMT_START {                              \
-        if (SvROK(sv)) {                      \
-            sv_setsv(ERRSV, sv);              \
-            croak(NULL);                      \
-        } else {                              \
-            D_PPP_FIX_UTF8_ERRSV(ERRSV, sv);  \
-            croak("%" SVf, SVfARG(sv));       \
-        }                                     \
+#  define croak_sv(sv)                         \
+    STMT_START {                               \
+        SV *_sv = (sv);                        \
+        if (SvROK(_sv)) {                      \
+            sv_setsv(ERRSV, _sv);              \
+            croak(NULL);                       \
+        } else {                               \
+            D_PPP_FIX_UTF8_ERRSV_FOR_SV(_sv);  \
+            croak("%" SVf, SVfARG(_sv));       \
+        }                                      \
     } STMT_END
 #elif { VERSION >= 5.4.0 }
 #  define croak_sv(sv) croak("%" SVf, SVfARG(sv))
@@ -236,6 +237,12 @@ croak_xs_usage(const CV *const cv, const char *const params)
 #define NEED_mess_sv
 #define NEED_croak_xs_usage
 
+=xsmisc
+
+static IV counter;
+static void reset_counter(void) { counter = 0; }
+static void inc_counter(void) { counter++; }
+
 =xsubs
 
 void
@@ -245,6 +252,25 @@ CODE:
     croak_sv(sv);
 
 void
+croak_sv_errsv()
+CODE:
+    croak_sv(ERRSV);
+
+void
+croak_sv_with_counter(sv)
+    SV *sv
+CODE:
+    reset_counter();
+    croak_sv((inc_counter(), sv));
+
+IV
+get_counter()
+CODE:
+    RETVAL = counter;
+OUTPUT:
+    RETVAL
+
+void
 die_sv(sv)
     SV *sv
 CODE:
@@ -281,7 +307,7 @@ croak_xs_usage(params)
 CODE:
     croak_xs_usage(cv, params);
 
-=tests plan => 93
+=tests plan => 102
 
 BEGIN { if ($] lt '5.006') { $^W = 0; } }
 
@@ -333,6 +359,29 @@ ok $@, "this must be visible\n";
 ok $die, "this must be visible\n";
 
 undef $die;
+$@ = 'should not be visible';
+ok !defined eval {
+    $@ = 'this must be visible';
+    Devel::PPPort::croak_sv_errsv()
+};
+ok $@ =~ /^this must be visible at $0 line /;
+ok $die =~ /^this must be visible at $0 line /;
+
+undef $die;
+$@ = 'should not be visible';
+ok !defined eval {
+    $@ = "this must be visible\n";
+    Devel::PPPort::croak_sv_errsv()
+};
+ok $@, "this must be visible\n";
+ok $die, "this must be visible\n";
+
+undef $die;
+ok !defined eval { Devel::PPPort::croak_sv_with_counter("message\n") };
+ok $@, "message\n";
+ok Devel::PPPort::get_counter(), 1;
+
+undef $die;
 ok !defined eval { Devel::PPPort::croak_sv('') };
 ok $@ =~ /^ at $0 line /;
 ok $die =~ /^ at $0 line /;
index 23a316f..d7acea5 100644 (file)
@@ -60,26 +60,7 @@ __UNDEFINED__ __ASSERT_(statement)  assert(statement),
 __UNDEFINED__ __ASSERT_(statement)
 #endif
 
-#ifndef SvRX
-#if { NEED SvRX }
-
-void *
-SvRX(pTHX_ SV *rv)
-{
-       if (SvROK(rv)) {
-               SV *sv = SvRV(rv);
-               if (SvMAGICAL(sv)) {
-                       MAGIC *mg = mg_find(sv, PERL_MAGIC_qr);
-                       if (mg && mg->mg_obj) {
-                               return mg->mg_obj;
-                       }
-               }
-       }
-       return 0;
-}
-#endif
-#endif
-
+__UNDEFINED__ SvRX(rv) (SvROK((rv)) ? (SvMAGICAL(SvRV((rv))) ? (mg_find(SvRV((rv)), PERL_MAGIC_qr) ? mg_find(SvRV((rv)), PERL_MAGIC_qr)->mg_obj : NULL) : NULL) : NULL)
 __UNDEFINED__ SvRXOK(sv) (!!SvRX(sv))
 
 #ifndef PERL_UNUSED_DECL
@@ -580,10 +561,6 @@ XS(XS_Devel__PPPort_dAXMARK)
   XSRETURN(1);
 }
 
-=xsinit
-
-#define NEED_SvRX
-
 =xsboot
 
 {
@@ -789,7 +766,7 @@ DEFSV_modify()
 int
 ERRSV()
         CODE:
-                RETVAL = SvTRUE(ERRSV);
+                RETVAL = SvTRUEx(ERRSV);
         OUTPUT:
                 RETVAL
 
index 6db6dfc..739bc21 100644 (file)
@@ -19,21 +19,13 @@ newRV_noinc
 __UNDEFINED__  newRV_inc(sv)  newRV(sv)   /* Replace */
 
 #ifndef newRV_noinc
-#if { NEED newRV_noinc }
-SV *
-newRV_noinc(SV *sv)
-{
-  SV *rv = (SV *)newRV(sv);
-  SvREFCNT_dec(sv);
-  return rv;
-}
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+#  define newRV_noinc(sv) ({ SV *_sv = (SV *)newRV((sv)); SvREFCNT_dec((sv)); _sv; })
+#else
+#  define newRV_noinc(sv) ((PL_Sv = (SV *)newRV((sv))), SvREFCNT_dec((sv)), PL_Sv)
 #endif
 #endif
 
-=xsinit
-
-#define NEED_newRV_noinc
-
 =xsubs
 
 U32
index 039f801..fd462e4 100644 (file)
@@ -16,25 +16,13 @@ newSV_type
 =implementation
 
 #ifndef newSV_type
-
-#if { NEED newSV_type }
-
-SV*
-newSV_type(pTHX_ svtype const t)
-{
-  SV* const sv = newSV(0);
-  sv_upgrade(sv, t);
-  return sv;
-}
-
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+#  define newSV_type(t) ({ SV *_sv = newSV(0); sv_upgrade(_sv, (t)); _sv; })
+#else
+#  define newSV_type(t) ((PL_Sv = newSV(0)), sv_upgrade(PL_Sv, (t)), PL_Sv)
 #endif
-
 #endif
 
-=xsinit
-
-#define NEED_newSV_type
-
 =xsubs
 
 int
index 7dbe5d0..067f6eb 100644 (file)
@@ -31,25 +31,13 @@ __UNDEFINED__  newSVpvn_utf8(s, len, u)  newSVpvn_flags((s), (len), (u) ? SVf_UT
 __UNDEFINED__  SVf_UTF8  0
 
 #ifndef newSVpvn_flags
-
-#if { NEED newSVpvn_flags }
-
-SV *
-newSVpvn_flags(pTHX_ const char *s, STRLEN len, U32 flags)
-{
-  SV *sv = newSVpvn(D_PPP_CONSTPV_ARG(s), len);
-  SvFLAGS(sv) |= (flags & SVf_UTF8);
-  return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv;
-}
-
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define newSVpvn_flags(s, len, flags) ({ SV *_sv = newSVpvn(D_PPP_CONSTPV_ARG((s)), (len)); SvFLAGS(_sv) |= ((flags) & SVf_UTF8); ((flags) & SVs_TEMP) ? sv_2mortal(_sv) : _sv; })
+#else
+# define newSVpvn_flags(s, len, flags) ((PL_Sv = newSVpvn(D_PPP_CONSTPV_ARG((s)), (len))), SvFLAGS(PL_Sv) |= ((flags) & SVf_UTF8), (((flags) & SVs_TEMP) ? sv_2mortal(PL_Sv) : PL_Sv))
 #endif
-
 #endif
 
-=xsinit
-
-#define NEED_newSVpvn_flags
-
 =xsubs
 
 void
index 2be4331..53cac1c 100644 (file)
@@ -350,7 +350,6 @@ ok($o =~ /^\s*$/);
 ---------------------------- file1.xs -----------------------------------------
 
 #define NEED_newCONSTSUB
-#define NEED_sv_2pv_flags
 #define NEED_PL_parser
 #include "ppport.h"
 
@@ -522,7 +521,6 @@ call_pv();
 #define NEED_eval_pv_GLOBAL
 #define NEED_grok_hex
 #define NEED_newCONSTSUB_GLOBAL
-#define NEED_sv_2pv_flags_GLOBAL
 #include "ppport.h"
 
 newCONSTSUB();
@@ -879,8 +877,6 @@ for (qw(file.xs)) {
 
 ---------------------------- file.xs -----------------------------------------
 
-#define NEED_sv_2pv_flags
-#define NEED_vnewSVpvf
 #define NEED_warner
 #include "ppport.h"
 Perl_croak_nocontext("foo");
@@ -894,8 +890,6 @@ warner("foo");
 
 ---------------------------- file.xsr -----------------------------------------
 
-#define NEED_sv_2pv_flags
-#define NEED_vnewSVpvf
 #define NEED_warner
 #include "ppport.h"
 Perl_croak_nocontext("foo");
index 8961284..af78d14 100644 (file)
@@ -26,16 +26,10 @@ sv_vsetpvf_mg
 =implementation
 
 #if { VERSION >= 5.004 } && !defined(vnewSVpvf)
-#if { NEED vnewSVpvf }
-
-SV *
-vnewSVpvf(pTHX_ const char *pat, va_list *args)
-{
-  register SV *sv = newSV(0);
-  sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
-  return sv;
-}
-
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+#  define vnewSVpvf(pat, args) ({ SV *_sv = newSV(0); sv_vsetpvfn(_sv, (pat), strlen((pat)), (args), Null(SV**), 0, Null(bool*)); _sv; })
+#else
+#  define vnewSVpvf(pat, args) ((PL_Sv = newSV(0)), sv_vsetpvfn(PL_Sv, (pat), strlen((pat)), (args), Null(SV**), 0, Null(bool*)), PL_Sv)
 #endif
 #endif
 
@@ -153,7 +147,6 @@ sv_setpvf_mg_nocontext(SV *sv, const char *pat, ...)
 
 =xsinit
 
-#define NEED_vnewSVpvf
 #define NEED_sv_catpvf_mg
 #define NEED_sv_catpvf_mg_nocontext
 #define NEED_sv_setpvf_mg
index 3c03ba5..11b8370 100644 (file)
@@ -16,14 +16,9 @@ my_strnlen
 SvUOK
 utf8_to_uvchr_buf
 
-=dontwarn
-
-_ppport_utf8_to_uvchr_buf_callee
-_ppport_MIN
-
 =implementation
 
-#define _ppport_MIN(a,b) (((a) <= (b)) ? (a) : (b))
+#define D_PPP_MIN(a,b) (((a) <= (b)) ? (a) : (b))
 
 __UNDEFINED__  sv_setuv(sv, uv)                     \
                STMT_START {                         \
@@ -36,11 +31,21 @@ __UNDEFINED__  sv_setuv(sv, uv)                     \
 
 __UNDEFINED__  newSVuv(uv)     ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
 
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+__UNDEFINED__  sv_2uv(sv)      ({ SV *_sv = (sv); (UV) (SvNOK(_sv) ? SvNV(_sv) : sv_2nv(_sv)); })
+#else
 __UNDEFINED__  sv_2uv(sv)      ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
+#endif
+
 __UNDEFINED__  SvUVX(sv)       ((UV)SvIVX(sv))
 __UNDEFINED__  SvUVXx(sv)      SvUVX(sv)
 __UNDEFINED__  SvUV(sv)        (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
+
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+__UNDEFINED__  SvUVx(sv)       ({ SV *_sv = (sv)); SvUV(_sv); })
+#else
 __UNDEFINED__  SvUVx(sv)       ((PL_Sv = (sv)), SvUV(PL_Sv))
+#endif
 
 /* Hint: sv_uv
  * Always use the SvUVx() macro instead of sv_uv().
@@ -65,7 +70,7 @@ __UNDEFINED__  XPUSHu(u)       STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG;
 __UNDEFINED__  UTF8_SAFE_SKIP(s, e)  (                                          \
                                       ((((e) - (s)) <= 0)                       \
                                       ? 0                                       \
-                                      : _ppport_MIN(((e) - (s)), UTF8SKIP(s))))
+                                      : D_PPP_MIN(((e) - (s)), UTF8SKIP(s))))
 #endif
 
 #if !defined(my_strnlen)
@@ -85,7 +90,7 @@ my_strnlen(const char *str, Size_t maxlen)
 #endif
 #endif
 
-#if { VERSION < 5.31.2 }
+#if { VERSION < 5.31.3 }
         /* Versions prior to this accepted things that are now considered
          * malformations, and didn't return -1 on error with warnings enabled
          * */
@@ -96,42 +101,41 @@ my_strnlen(const char *str, Size_t maxlen)
  * utf8_to_uvchr_buf.  Some of these are security related, and clearly must
  * be done.  But its arguable that the others need not, and hence should not.
  * The reason they're here is that a module that intends to play with the
- * latest perls shoud be able to work the same in all releases.  An example is
+ * latest perls should be able to work the same in all releases.  An example is
  * that perl no longer accepts any UV for a code point, but limits them to
  * IV_MAX or below.  This is for future internal use of the larger code points.
  * If it turns out that some of these changes are breaking code that isn't
  * intended to work with modern perls, the tighter restrictions could be
  * relaxed.  khw thinks this is unlikely, but has been wrong in the past. */
 
-#if { VERSION < 5.10.0 }
-#  define D_PPP_CU8 U8
-#else
-#  define D_PPP_CU8 const U8
-#endif
-
-#ifndef utf8_to_uvchr_buf
+/* 5.6.0 is the first release with UTF-8, and we don't implement this function
+ * there due to its likely lack of still being in use, and the underlying
+ * implementation is very different from later ones, without the later
+ * safeguards, so would require extra work to deal with */
+#if { VERSION >= 5.6.1 } && ! defined(utf8_to_uvchr_buf)
    /* Choose which underlying implementation to use.  At least one must be
     * present or the perl is too early to handle this function */
 #  if defined(utf8n_to_uvchr) || defined(utf8_to_uv)
 #    if defined(utf8n_to_uvchr)   /* This is the preferred implementation */
-#      define _ppport_utf8_to_uvchr_buf_callee utf8n_to_uvchr
-#    elif { VERSION >= 5.6.1 }
-#      define _ppport_utf8_to_uvchr_buf_callee utf8_to_uv
+#      define D_PPP_utf8_to_uvchr_buf_callee utf8n_to_uvchr
+#    else     /* Must be at least 5.6.1 from #if above */
+#      define D_PPP_utf8_to_uvchr_buf_callee(s, curlen, retlen, flags) utf8_to_uv((U8 *)(s), (curlen), (retlen), (flags))
 #    endif
-
 #  endif
 
-#ifdef _ppport_utf8_to_uvchr_buf_callee
 #  if { NEED utf8_to_uvchr_buf }
 
 UV
-utf8_to_uvchr_buf(pTHX_ D_PPP_CU8 *s, const U8 *send, STRLEN *retlen)
+utf8_to_uvchr_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen)
 {
     UV ret;
     STRLEN curlen;
     bool overflows = 0;
     const U8 *cur_s = s;
     const bool do_warnings = ckWARN_d(WARN_UTF8);
+#    if { VERSION < 5.26.0 } && ! defined(EBCDIC)
+    STRLEN overflow_length = 0;
+#    endif
 
     if (send > s) {
         curlen = send - s;
@@ -145,35 +149,24 @@ utf8_to_uvchr_buf(pTHX_ D_PPP_CU8 *s, const U8 *send, STRLEN *retlen)
         }
     }
 
-    /* The modern version allows anything that evaluates to a legal UV, but not
-     * overlongs nor an empty input */
-    ret = _ppport_utf8_to_uvchr_buf_callee(
-                s, curlen, retlen,   (UTF8_ALLOW_ANYUV
-                                  & ~(UTF8_ALLOW_LONG|UTF8_ALLOW_EMPTY)));
-
-    /* But actually, modern versions restrict the UV to being no more than what
-     * an IV can hold */
-    if (ret > PERL_INT_MAX) {
-        overflows = 1;
-    }
-
-#    if { VERSION < 5.26.0 }
-#      ifndef EBCDIC
+#    if { VERSION < 5.26.0 } && ! defined(EBCDIC)
 
-        /* There are bugs in versions earlier than this on non-EBCDIC platforms
-         * in which it did not detect all instances of overflow, which could be
-         * a security hole.  Also, earlier versions did not allow the overflow
-         * malformation under any circumstances, and modern ones do.  So we
-         * need to check here.  */
+    /* Perl did not properly detect overflow for much of its history on
+     * non-EBCDIC platforms, often returning an overlong value which may or may
+     * not have been tolerated in the call.  Also, earlier versions, when they
+     * did detect overflow, may have disallowed it completely.  Modern ones can
+     * replace it with the REPLACEMENT CHARACTER, depending on calling
+     * parameters.  Therefore detect it ourselves in  releases it was
+     * problematic in. */
 
-    else if (curlen > 0 && *s >= 0xFE) {
+    if (curlen > 0 && UNLIKELY(*s >= 0xFE)) {
 
-        /* If the main routine detected overflow, great; it returned 0.  But if the
-         * input's first byte indicates it could overflow, we need to verify.
-         * First, on a 32-bit machine the first byte being at least \xFE
-         * automatically is overflow */
+        /* First, on a 32-bit machine the first byte being at least \xFE
+         * automatically is overflow, as it indicates something requiring more
+         * than 31 bits */
         if (sizeof(ret) < 8) {
             overflows = 1;
+            overflow_length = 7;
         }
         else {
             const U8 highest[] =    /* 2*63-1 */
@@ -186,9 +179,9 @@ utf8_to_uvchr_buf(pTHX_ D_PPP_CU8 *s, const U8 *send, STRLEN *retlen)
                 }
 
                 /* If this byte is larger than the corresponding highest UTF-8
-                * byte, the sequence overflows; otherwise the byte is less than
-                * (as we handled the equality case above), and so the sequence
-                * doesn't overflow */
+                 * byte, the sequence overflows; otherwise the byte is less
+                 * than (as we handled the equality case above), and so the
+                 * sequence doesn't overflow */
                 overflows = *cur_s > *cur_h;
                 break;
 
@@ -196,33 +189,59 @@ utf8_to_uvchr_buf(pTHX_ D_PPP_CU8 *s, const U8 *send, STRLEN *retlen)
 
             /* Here, either we set the bool and broke out of the loop, or got
              * to the end and all bytes are the same which indicates it doesn't
-             * overflow. */
+             * overflow.  If it did overflow, it would be this number of bytes
+             * */
+            overflow_length = 13;
         }
     }
 
-#      endif
+    if (UNLIKELY(overflows)) {
+        ret = 0;
+
+        if (! do_warnings && retlen) {
+            *retlen = overflow_length;
+        }
+    }
+    else
+
 #    endif  /* < 5.26 */
 
+        /* Here, we are either in a release that properly detects overflow, or
+         * we have checked for overflow and the next statement is executing as
+         * part of the above conditional where we know we don't have overflow.
+         *
+         * The modern versions allow anything that evaluates to a legal UV, but
+         * not overlongs nor an empty input */
+        ret = D_PPP_utf8_to_uvchr_buf_callee(
+                s, curlen, retlen,   (UTF8_ALLOW_ANYUV
+                                  & ~(UTF8_ALLOW_LONG|UTF8_ALLOW_EMPTY)));
+
+#    if { VERSION >= 5.26.0 } && { VERSION < 5.28.0 }
+
+    /* But actually, more modern versions restrict the UV to being no more than
+     * what * an IV can hold, so it could, so it could still have gotten it
+     * wrong about overflowing. */
+    if (UNLIKELY(ret > IV_MAX)) {
+        overflows = 1;
+    }
+
+#    endif
+
     if (UNLIKELY(overflows)) {
         if (! do_warnings) {
             if (retlen) {
-                *retlen = _ppport_MIN(*retlen, UTF8SKIP(s));
-                *retlen = _ppport_MIN(*retlen, curlen);
+                *retlen = D_PPP_MIN(*retlen, UTF8SKIP(s));
+                *retlen = D_PPP_MIN(*retlen, curlen);
             }
             return UNICODE_REPLACEMENT;
         }
         else {
 
-            /* On versions that correctly detect overflow, but forbid it
-             * always, 0 will be returned, but also a warning will have been
-             * raised.  Don't repeat it */
-            if (ret != 0) {
-                /* We use the error message in use from 5.8-5.14 */
-                Perl_warner(aTHX_ packWARN(WARN_UTF8),
-                    "Malformed UTF-8 character (overflow at 0x%" UVxf
-                    ", byte 0x%02x, after start byte 0x%02x)",
-                    ret, *cur_s, *s);
-            }
+            /* We use the error message in use from 5.8-5.26 */
+            Perl_warner(aTHX_ packWARN(WARN_UTF8),
+                "Malformed UTF-8 character (overflow at 0x%" UVxf
+                ", byte 0x%02x, after start byte 0x%02x)",
+                ret, *cur_s, *s);
             if (retlen) {
                 *retlen = (STRLEN) -1;
             }
@@ -230,34 +249,36 @@ utf8_to_uvchr_buf(pTHX_ D_PPP_CU8 *s, const U8 *send, STRLEN *retlen)
         }
     }
 
-    /* If failed and warnings are off, to emulate the behavior of the real
-     * utf8_to_uvchr(), try again, allowing anything.  (Note a return of 0 is
-     * ok if the input was '\0') */
+    /* Here, did not overflow, but if it failed for some other reason, and
+     * warnings are off, to emulate the behavior of the real utf8_to_uvchr(),
+     * try again, allowing anything.  (Note a return of 0 is ok if the input
+     * was '\0') */
     if (UNLIKELY(ret == 0 && (curlen == 0 || *s != '\0'))) {
 
         /* If curlen is 0, we already handled the case where warnings are
-         * disabled, so this 'if' will be true, and we won't look at the
-         * contents of 's' */
+         * disabled, so this 'if' will be true, and so later on, we know that
+         * 's' is dereferencible */
         if (do_warnings) {
             *retlen = (STRLEN) -1;
         }
         else {
-            ret = _ppport_utf8_to_uvchr_buf_callee(
+            ret = D_PPP_utf8_to_uvchr_buf_callee(
                                             s, curlen, retlen, UTF8_ALLOW_ANY);
             /* Override with the REPLACEMENT character, as that is what the
              * modern version of this function returns */
             ret = UNICODE_REPLACEMENT;
 
-#           if { VERSION < 5.16.0 }
+#    if { VERSION < 5.16.0 }
 
             /* Versions earlier than this don't necessarily return the proper
              * length.  It should not extend past the end of string, nor past
              * what the first byte indicates the length is, nor past the
              * continuation characters */
             if (retlen && *retlen >= 0) {
-                *retlen = _ppport_MIN(*retlen, curlen);
-                *retlen = _ppport_MIN(*retlen, UTF8SKIP(s));
                 unsigned int i = 1;
+
+                *retlen = D_PPP_MIN(*retlen, curlen);
+                *retlen = D_PPP_MIN(*retlen, UTF8SKIP(s));
                 do {
                     if (s[i] < 0x80 || s[i] > 0xBF) {
                         *retlen = i;
@@ -266,7 +287,7 @@ utf8_to_uvchr_buf(pTHX_ D_PPP_CU8 *s, const U8 *send, STRLEN *retlen)
                 } while (++i < *retlen);
             }
 
-#           endif
+#    endif
 
         }
     }
@@ -276,7 +297,6 @@ utf8_to_uvchr_buf(pTHX_ D_PPP_CU8 *s, const U8 *send, STRLEN *retlen)
 
 #  endif
 #endif
-#endif
 
 #if defined(UTF8SKIP) && defined(utf8_to_uvchr_buf)
 #undef utf8_to_uvchr /* Always redefine this unsafe function so that it refuses
@@ -358,20 +378,23 @@ XPUSHu()
                 XPUSHu(43);
                 XSRETURN(1);
 
+#if defined(UTF8_SAFE_SKIP) && defined(UTF8SKIP)
+
 STRLEN
 UTF8_SAFE_SKIP(s, adjustment)
-        unsigned char * s
+        char * s
         int adjustment
+        PREINIT:
+            const char *const_s;
         CODE:
+            const_s = s;
             /* Instead of passing in an 'e' ptr, use the real end, adjusted */
-#if defined(UTF8_SAFE_SKIP) && defined(UTF8SKIP)
-            RETVAL = UTF8_SAFE_SKIP(s, s + UTF8SKIP(s) + adjustment);
-#else
-            RETVAL = 0;
-#endif
+            RETVAL = UTF8_SAFE_SKIP(const_s, s + UTF8SKIP(s) + adjustment);
         OUTPUT:
             RETVAL
 
+#endif
+
 STRLEN
 my_strnlen(s, max)
         char * s
@@ -381,6 +404,8 @@ my_strnlen(s, max)
         OUTPUT:
             RETVAL
 
+#ifdef utf8_to_uvchr_buf
+
 AV *
 utf8_to_uvchr_buf(s, adjustment)
         unsigned char *s
@@ -388,16 +413,13 @@ utf8_to_uvchr_buf(s, adjustment)
         PREINIT:
             AV *av;
             STRLEN len;
+            const unsigned char *const_s;
         CODE:
             av = newAV();
-#ifdef utf8_to_uvchr_buf
-            av_push(av, newSVuv(utf8_to_uvchr_buf(s,
+            const_s = s;
+            av_push(av, newSVuv(utf8_to_uvchr_buf(const_s,
                                                   s + UTF8SKIP(s) + adjustment,
                                                   &len)));
-#else
-            av_push(av, newSVuv(0));
-            len = (STRLEN) -1;
-#endif
             if (len == (STRLEN) -1) {
                 av_push(av, newSViv(-1));
             }
@@ -408,20 +430,21 @@ utf8_to_uvchr_buf(s, adjustment)
         OUTPUT:
                 RETVAL
 
+#endif
+
+#ifdef utf8_to_uvchr
+
 AV *
 utf8_to_uvchr(s)
         unsigned char *s
         PREINIT:
             AV *av;
             STRLEN len;
+            const unsigned char *const_s;
         CODE:
             av = newAV();
-#ifdef utf8_to_uvchr
-            av_push(av, newSVuv(utf8_to_uvchr(s, &len)));
-#else
-            av_push(av, newSVuv(0));
-            len = (STRLEN) -1;
-#endif
+            const_s = s;
+            av_push(av, newSVuv(utf8_to_uvchr(const_s, &len)));
             if (len == (STRLEN) -1) {
                 av_push(av, newSViv(-1));
             }
@@ -432,10 +455,11 @@ utf8_to_uvchr(s)
         OUTPUT:
                 RETVAL
 
-=tests plan => 52
+#endif
 
-# skip tests on 5.6.0 and earlier
-BEGIN { if ("$]" le '5.006') { skip 'skip: broken utf8 support', 0 for 1..52; exit; } }
+=tests plan => 62
+
+BEGIN { require warnings if "$]" gt '5.006' }
 
 ok(&Devel::PPPort::sv_setuv(42), 42);
 ok(&Devel::PPPort::newSVuv(123), 123);
@@ -447,9 +471,16 @@ ok(&Devel::PPPort::SvUVx(0xdeadbeef), 0xdeadbeef);
 ok(&Devel::PPPort::XSRETURN_UV(), 42);
 ok(&Devel::PPPort::PUSHu(), 42);
 ok(&Devel::PPPort::XPUSHu(), 43);
+ok(&Devel::PPPort::my_strnlen("abc\0def", 7), 3);
+
+# skip tests on 5.6.0 and earlier
+if ("$]" le '5.006') {
+    skip 'skip: broken utf8 support', 0 for 1..51;
+    exit;
+}
+
 ok(&Devel::PPPort::UTF8_SAFE_SKIP("A", 0), 1);
 ok(&Devel::PPPort::UTF8_SAFE_SKIP("A", -1), 0);
-ok(&Devel::PPPort::my_strnlen("abc\0def", 7), 3);
 
 my $ret = &Devel::PPPort::utf8_to_uvchr("A");
 ok($ret->[0], ord("A"));
@@ -468,7 +499,7 @@ ok($ret->[0], 0);
 ok($ret->[1], 1);
 
 if (ord("A") != 65) {   # tests not valid for EBCDIC
-    ok(1, 1) for 1 .. (2 + 4 + (5 * 5));
+    ok(1, 1) for 1 .. (2 + 4 + (7 * 5));
 }
 else {
     $ret = &Devel::PPPort::utf8_to_uvchr_buf("\xc4\x80", 0);
@@ -479,12 +510,12 @@ else {
     local $SIG{__WARN__} = sub { push @warnings, @_; };
 
     {
-        use warnings 'utf8';
+        BEGIN { 'warnings'->import('utf8') if "$]" gt '5.006' }
         $ret = &Devel::PPPort::utf8_to_uvchr("\xe0\0\x80");
         ok($ret->[0], 0);
         ok($ret->[1], -1);
 
-        no warnings;
+        BEGIN { 'warnings'->unimport() if "$]" gt '5.006' }
         $ret = &Devel::PPPort::utf8_to_uvchr("\xe0\0\x80");
         ok($ret->[0], 0xFFFD);
         ok($ret->[1], 1);
@@ -515,10 +546,22 @@ else {
             warning    => qr/overlong|2 bytes, need 1/,
             no_warnings_returned_length => 2,
         },
-        {                 # Old algorithm supposedly failed to detect this
+        {
+            input      => "\xe0\x80\x81",
+            adjustment => 0,
+            warning    => qr/overlong|3 bytes, need 1/,
+            no_warnings_returned_length => 3,
+        },
+        {
+            input      => "\xf0\x80\x80\x81",
+            adjustment => 0,
+            warning    => qr/overlong|4 bytes, need 1/,
+            no_warnings_returned_length => 4,
+        },
+        {                 # Old algorithm failed to detect this
             input      => "\xff\x80\x90\x90\x90\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf",
             adjustment => 0,
-            warning    => ("$]" le 5.008006) ? qr/Malformed UTF-8 character/ : qr/overflow/,
+            warning    => qr/overflow/,
             no_warnings_returned_length => 13,
         },
     );
@@ -544,16 +587,17 @@ else {
         my $warning = $test->{'warning'};
 
         undef @warnings;
-        use warnings 'utf8';
+        BEGIN { 'warnings'->import('utf8') if "$]" gt '5.006' }
         $ret = &Devel::PPPort::utf8_to_uvchr_buf($input, $adjustment);
         ok($ret->[0], 0,  "returned value $display; warnings enabled");
         ok($ret->[1], -1, "returned length $display; warnings enabled");
         my $all_warnings = join "; ", @warnings;
         my $contains = grep { $_ =~ $warning } $all_warnings;
-        ok($contains, 1, $display . "; '$all_warnings' contains '$warning'");
+        ok($contains, 1, $display
+                    . "; Got: '$all_warnings', which should contain '$warning'");
 
         undef @warnings;
-        no warnings 'utf8';
+        BEGIN { 'warnings'->unimport('utf8') if "$]" gt '5.006' }
         $ret = &Devel::PPPort::utf8_to_uvchr_buf($input, $adjustment);
         ok($ret->[0], 0xFFFD,  "returned value $display; warnings disabled");
         ok($ret->[1], $test->{'no_warnings_returned_length'},
index df8a385..b4a5695 100644 (file)
@@ -105,7 +105,6 @@ warner(U32 err, const char *pat, ...)
 =xsinit
 
 #define NEED_warner
-#define NEED_vnewSVpvf
 
 =xsubs
 
index e84f646..146438a 100644 (file)
@@ -306,7 +306,12 @@ sub parse_embed
         my @e = split /\s*\|\s*/, $line;
         if( @e >= 3 ) {
           my($flags, $ret, $name, @args) = @e;
-          next if $flags =~ /[DM]/; # Skip entries marked as deprecated or unstable
+          next unless $flags =~ /A/; # Skip non-public entries
+
+          # Skip entries marked as deprecated or unstable, or non-name ones, like
+          #    PL_parser-E<gt>linestr
+          # which documents a struct entry rather than a function
+          next if $flags =~ /[DxN]/;
           if ($name =~ /^[^\W\d]\w*$/) {
             for (@args) {
               $_ = [trim_arg($_)];
@@ -320,11 +325,6 @@ sub parse_embed
               cond  => ppcond(\@pps),
             };
           }
-          elsif ($name =~ /^[^\W\d]\w*-E<gt>[^\W\d]\w*$/) {
-            # silenty ignore entries of the form
-            #    PL_parser-E<gt>linestr
-            # which documents a struct entry rather than a function
-          }
           else {
             warn "mysterious name [$name] in $file, line $.\n";
           }
index 12e4d6d..238415a 100644 (file)
@@ -1,2 +1 @@
 5.015009
-utf8_to_uvchr_buf              # U
diff --git a/dist/Devel-PPPort/t/01_test.t b/dist/Devel-PPPort/t/01_test.t
new file mode 100644 (file)
index 0000000..bce526a
--- /dev/null
@@ -0,0 +1,53 @@
+################################################################################
+#
+#            !!!!!   Do NOT edit this file directly!   !!!!!
+#
+#            Edit mktests.PL and/or parts/inc/01_test instead.
+#
+#  This file was automatically generated from the definition files in the
+#  parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+#  works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+BEGIN {
+  if ($ENV{'PERL_CORE'}) {
+    chdir 't' if -d 't';
+    @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+    require Config; import Config;
+    use vars '%Config';
+    if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+      print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+      exit 0;
+    }
+  }
+  else {
+    unshift @INC, 't';
+  }
+
+  sub load {
+    eval "use Test";
+    require 'testutil.pl' if $@;
+  }
+
+  if (1) {
+    load();
+    plan(tests => 1);
+  }
+}
+
+use Devel::PPPort;
+use strict;
+$^W = 1;
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+# This test file is used as target dependency for Makefile
+ok 1;
+
index 77a7a86..c1d5d05 100644 (file)
@@ -30,9 +30,9 @@ BEGIN {
     require 'testutil.pl' if $@;
   }
 
-  if (5) {
+  if (15) {
     load();
-    plan(tests => 5);
+    plan(tests => 15);
   }
 }
 
@@ -61,6 +61,47 @@ ok($bar->x(), 'foobar');
 Devel::PPPort::TestSvSTASH_set($bar, 'bar');
 ok($bar->x(), 'hacker');
 
+if ( "$]" lt '5.007003' ) {
+    skip 'skip: no SV_NOSTEAL support', 0 for 1..10;
+} else {
+    ok(Devel::PPPort::Test_sv_setsv_SV_NOSTEAL());
+
+    tie my $scalar, 'TieScalarCounter', 'string';
+
+    ok tied($scalar)->{fetch}, 0;
+    ok tied($scalar)->{store}, 0;
+    my $copy = Devel::PPPort::newSVsv_nomg($scalar);
+    ok tied($scalar)->{fetch}, 0;
+    ok tied($scalar)->{store}, 0;
+
+    my $fetch = $scalar;
+    ok tied($scalar)->{fetch}, 1;
+    ok tied($scalar)->{store}, 0;
+    my $copy2 = Devel::PPPort::newSVsv_nomg($scalar);
+    ok tied($scalar)->{fetch}, 1;
+    ok tied($scalar)->{store}, 0;
+    ok $copy2, 'string';
+}
+
+package TieScalarCounter;
+
+sub TIESCALAR {
+    my ($class, $value) = @_;
+    return bless { fetch => 0, store => 0, value => $value }, $class;
+}
+
+sub FETCH {
+    my ($self) = @_;
+    $self->{fetch}++;
+    return $self->{value};
+}
+
+sub STORE {
+    my ($self, $value) = @_;
+    $self->{store}++;
+    $self->{value} = $value;
+}
+
 package foo;
 
 sub x { 'foobar' }
index 9a9822a..76872aa 100644 (file)
@@ -30,9 +30,9 @@ BEGIN {
     require 'testutil.pl' if $@;
   }
 
-  if (93) {
+  if (102) {
     load();
-    plan(tests => 93);
+    plan(tests => 102);
   }
 }
 
@@ -98,6 +98,29 @@ ok $@, "this must be visible\n";
 ok $die, "this must be visible\n";
 
 undef $die;
+$@ = 'should not be visible';
+ok !defined eval {
+    $@ = 'this must be visible';
+    Devel::PPPort::croak_sv_errsv()
+};
+ok $@ =~ /^this must be visible at $0 line /;
+ok $die =~ /^this must be visible at $0 line /;
+
+undef $die;
+$@ = 'should not be visible';
+ok !defined eval {
+    $@ = "this must be visible\n";
+    Devel::PPPort::croak_sv_errsv()
+};
+ok $@, "this must be visible\n";
+ok $die, "this must be visible\n";
+
+undef $die;
+ok !defined eval { Devel::PPPort::croak_sv_with_counter("message\n") };
+ok $@, "message\n";
+ok Devel::PPPort::get_counter(), 1;
+
+undef $die;
 ok !defined eval { Devel::PPPort::croak_sv('') };
 ok $@ =~ /^ at $0 line /;
 ok $die =~ /^ at $0 line /;
index af2db3f..daa5398 100644 (file)
@@ -387,7 +387,6 @@ ok($o =~ /^\s*$/);
 ---------------------------- file1.xs -----------------------------------------
 
 #define NEED_newCONSTSUB
-#define NEED_sv_2pv_flags
 #define NEED_PL_parser
 #include "ppport.h"
 
@@ -559,7 +558,6 @@ call_pv();
 #define NEED_eval_pv_GLOBAL
 #define NEED_grok_hex
 #define NEED_newCONSTSUB_GLOBAL
-#define NEED_sv_2pv_flags_GLOBAL
 #include "ppport.h"
 
 newCONSTSUB();
@@ -916,8 +914,6 @@ for (qw(file.xs)) {
 
 ---------------------------- file.xs -----------------------------------------
 
-#define NEED_sv_2pv_flags
-#define NEED_vnewSVpvf
 #define NEED_warner
 #include "ppport.h"
 Perl_croak_nocontext("foo");
@@ -931,8 +927,6 @@ warner("foo");
 
 ---------------------------- file.xsr -----------------------------------------
 
-#define NEED_sv_2pv_flags
-#define NEED_vnewSVpvf
 #define NEED_warner
 #include "ppport.h"
 Perl_croak_nocontext("foo");
index 5c8d487..7749b1f 100644 (file)
@@ -30,9 +30,9 @@ BEGIN {
     require 'testutil.pl' if $@;
   }
 
-  if (52) {
+  if (62) {
     load();
-    plan(tests => 52);
+    plan(tests => 62);
   }
 }
 
@@ -48,8 +48,7 @@ bootstrap Devel::PPPort;
 
 package main;
 
-# skip tests on 5.6.0 and earlier
-BEGIN { if ("$]" le '5.006') { skip 'skip: broken utf8 support', 0 for 1..52; exit; } }
+BEGIN { require warnings if "$]" gt '5.006' }
 
 ok(&Devel::PPPort::sv_setuv(42), 42);
 ok(&Devel::PPPort::newSVuv(123), 123);
@@ -61,9 +60,16 @@ ok(&Devel::PPPort::SvUVx(0xdeadbeef), 0xdeadbeef);
 ok(&Devel::PPPort::XSRETURN_UV(), 42);
 ok(&Devel::PPPort::PUSHu(), 42);
 ok(&Devel::PPPort::XPUSHu(), 43);
+ok(&Devel::PPPort::my_strnlen("abc\0def", 7), 3);
+
+# skip tests on 5.6.0 and earlier
+if ("$]" le '5.006') {
+    skip 'skip: broken utf8 support', 0 for 1..51;
+    exit;
+}
+
 ok(&Devel::PPPort::UTF8_SAFE_SKIP("A", 0), 1);
 ok(&Devel::PPPort::UTF8_SAFE_SKIP("A", -1), 0);
-ok(&Devel::PPPort::my_strnlen("abc\0def", 7), 3);
 
 my $ret = &Devel::PPPort::utf8_to_uvchr("A");
 ok($ret->[0], ord("A"));
@@ -82,7 +88,7 @@ ok($ret->[0], 0);
 ok($ret->[1], 1);
 
 if (ord("A") != 65) {   # tests not valid for EBCDIC
-    ok(1, 1) for 1 .. (2 + 4 + (5 * 5));
+    ok(1, 1) for 1 .. (2 + 4 + (7 * 5));
 }
 else {
     $ret = &Devel::PPPort::utf8_to_uvchr_buf("\xc4\x80", 0);
@@ -93,12 +99,12 @@ else {
     local $SIG{__WARN__} = sub { push @warnings, @_; };
 
     {
-        use warnings 'utf8';
+        BEGIN { 'warnings'->import('utf8') if "$]" gt '5.006' }
         $ret = &Devel::PPPort::utf8_to_uvchr("\xe0\0\x80");
         ok($ret->[0], 0);
         ok($ret->[1], -1);
 
-        no warnings;
+        BEGIN { 'warnings'->unimport() if "$]" gt '5.006' }
         $ret = &Devel::PPPort::utf8_to_uvchr("\xe0\0\x80");
         ok($ret->[0], 0xFFFD);
         ok($ret->[1], 1);
@@ -129,10 +135,22 @@ else {
             warning    => qr/overlong|2 bytes, need 1/,
             no_warnings_returned_length => 2,
         },
-        {                 # Old algorithm supposedly failed to detect this
+        {
+            input      => "\xe0\x80\x81",
+            adjustment => 0,
+            warning    => qr/overlong|3 bytes, need 1/,
+            no_warnings_returned_length => 3,
+        },
+        {
+            input      => "\xf0\x80\x80\x81",
+            adjustment => 0,
+            warning    => qr/overlong|4 bytes, need 1/,
+            no_warnings_returned_length => 4,
+        },
+        {                 # Old algorithm failed to detect this
             input      => "\xff\x80\x90\x90\x90\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf",
             adjustment => 0,
-            warning    => ("$]" le 5.008006) ? qr/Malformed UTF-8 character/ : qr/overflow/,
+            warning    => qr/overflow/,
             no_warnings_returned_length => 13,
         },
     );
@@ -158,16 +176,17 @@ else {
         my $warning = $test->{'warning'};
 
         undef @warnings;
-        use warnings 'utf8';
+        BEGIN { 'warnings'->import('utf8') if "$]" gt '5.006' }
         $ret = &Devel::PPPort::utf8_to_uvchr_buf($input, $adjustment);
         ok($ret->[0], 0,  "returned value $display; warnings enabled");
         ok($ret->[1], -1, "returned length $display; warnings enabled");
         my $all_warnings = join "; ", @warnings;
         my $contains = grep { $_ =~ $warning } $all_warnings;
-        ok($contains, 1, $display . "; '$all_warnings' contains '$warning'");
+        ok($contains, 1, $display
+                    . "; Got: '$all_warnings', which should contain '$warning'");
 
         undef @warnings;
-        no warnings 'utf8';
+        BEGIN { 'warnings'->unimport('utf8') if "$]" gt '5.006' }
         $ret = &Devel::PPPort::utf8_to_uvchr_buf($input, $adjustment);
         ok($ret->[0], 0xFFFD,  "returned value $display; warnings disabled");
         ok($ret->[1], $test->{'no_warnings_returned_length'},
index 0e8775d..19d7645 100644 (file)
@@ -9,7 +9,7 @@ require 5.006;
 our $Debug = 0;
 our $ExportLevel = 0;
 our $Verbose ||= 0;
-our $VERSION = '5.73';
+our $VERSION = '5.74';
 our (%Cache);
 
 sub as_heavy {
index 21b67c1..004815e 100644 (file)
@@ -148,7 +148,7 @@ sub heavy_export {
                    if (!$export_cache->{$sym}) {
                        # accumulate the non-exports
                        push @carp,
-                         qq["$sym" is not exported by the $pkg module\n];
+                         qq["$sym" is not exported by the $pkg module];
                        $oops++;
                    }
                }
@@ -156,7 +156,7 @@ sub heavy_export {
        }
        if ($oops) {
            require Carp;
-           Carp::croak("@{carp}Can't continue after import errors");
+           Carp::croak(join("\n", @carp, "Can't continue after import errors"));
        }
     }
     else {
index d6ac63f..0518080 100644 (file)
@@ -18,7 +18,7 @@ sub ok ($;$) {
 
 BEGIN {
     $test = 1;
-    print "1..31\n";
+    print "1..33\n";
     require Exporter;
     ok( 1, 'Exporter compiled' );
 }
@@ -129,6 +129,16 @@ Testing->import(@tags);
     'import by tags' );
 
 
+package Err;
+my @missing = qw(first second);
+eval { Testing->import(@missing) };
+
+for my $func (@missing) {
+    ::ok( $@ =~ /^"$func" is not exported by the Testing module$/m,
+          "$func is not exported error message" );
+}
+
+
 package Arrr;
 Testing->import(qw(!lifejacket));
 
index 37c4494..db462a9 100644 (file)
@@ -1,3 +1,6 @@
+5.20190720
+  - Updated for v5.31.2
+
 5.20190620
   - Updated for v5.31.1
 
index 592d9a7..87cf785 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 our ( %released, %version, %families, %upstream, %bug_tracker, %deprecated, %delta );
 
 use version;
-our $VERSION = '5.20190620';
+our $VERSION = '5.20190720';
 
 sub PKG_PATTERN () { q#\A[a-zA-Z_][0-9a-zA-Z_]*(?:(::|')[0-9a-zA-Z_]+)*\z# }
 sub _looks_like_invocant ($) { local $@; !!eval { $_[0]->isa(__PACKAGE__) } }
@@ -351,6 +351,7 @@ sub changes_between {
     5.030000 => '2019-05-22',
     5.031000 => '2019-05-24',
     5.031001 => '2019-06-20',
+    5.031002 => '2019-07-20',
   );
 
 for my $version ( sort { $a <=> $b } keys %released ) {
@@ -16544,6 +16545,53 @@ for my $version ( sort { $a <=> $b } keys %released ) {
             'Pod::Select'           => 1,
         }
     },
+    5.031002 => {
+        delta_from => 5.031001,
+        changed => {
+            'B::Op_private'         => '5.031002',
+            'Config'                => '5.031002',
+            'Devel::PPPort'         => '3.54',
+            'Exporter'              => '5.74',
+            'Exporter::Heavy'       => '5.74',
+            'IPC::Cmd'              => '1.04',
+            'JSON::PP'              => '4.04',
+            'JSON::PP::Boolean'     => '4.04',
+            'Module::CoreList'      => '5.20190720',
+            'Module::CoreList::Utils'=> '5.20190720',
+            'Opcode'                => '1.44',
+            'PerlIO::encoding'      => '0.28',
+            'Pod::Simple'           => '3.39',
+            'Pod::Simple::BlackBox' => '3.39',
+            'Pod::Simple::Checker'  => '3.39',
+            'Pod::Simple::Debug'    => '3.39',
+            'Pod::Simple::DumpAsText'=> '3.39',
+            'Pod::Simple::DumpAsXML'=> '3.39',
+            'Pod::Simple::HTML'     => '3.39',
+            'Pod::Simple::HTMLBatch'=> '3.39',
+            'Pod::Simple::LinkSection'=> '3.39',
+            'Pod::Simple::Methody'  => '3.39',
+            'Pod::Simple::Progress' => '3.39',
+            'Pod::Simple::PullParser'=> '3.39',
+            'Pod::Simple::PullParserEndToken'=> '3.39',
+            'Pod::Simple::PullParserStartToken'=> '3.39',
+            'Pod::Simple::PullParserTextToken'=> '3.39',
+            'Pod::Simple::PullParserToken'=> '3.39',
+            'Pod::Simple::RTF'      => '3.39',
+            'Pod::Simple::Search'   => '3.39',
+            'Pod::Simple::SimpleTree'=> '3.39',
+            'Pod::Simple::Text'     => '3.39',
+            'Pod::Simple::TextContent'=> '3.39',
+            'Pod::Simple::TiedOutFH'=> '3.39',
+            'Pod::Simple::Transcode'=> '3.39',
+            'Pod::Simple::TranscodeDumb'=> '3.39',
+            'Pod::Simple::TranscodeSmart'=> '3.39',
+            'Pod::Simple::XHTML'    => '3.39',
+            'Pod::Simple::XMLOutStream'=> '3.39',
+            'threads::shared'       => '1.61',
+        },
+        removed => {
+        }
+    },
 );
 
 sub is_core
@@ -17560,6 +17608,13 @@ sub is_core
         removed => {
         }
     },
+    5.031002 => {
+        delta_from => 5.031001,
+        changed => {
+        },
+        removed => {
+        }
+    },
 );
 
 %deprecated = _undelta(\%deprecated);
index 90467e1..8defdd4 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use warnings;
 use Module::CoreList;
 
-our $VERSION = '5.20190620';
+our $VERSION = '5.20190720';
 our %utilities;
 
 sub utilities {
@@ -1509,13 +1509,20 @@ my %delta = (
         }
     },
     5.031001 => {
-        delta_from => 5.031000,
+        delta_from => 5.031,
         changed => {
         },
         removed => {
             'podselect'             => 1,
         }
     },
+    5.031002 => {
+        delta_from => 5.031001,
+        changed => {
+        },
+        removed => {
+        }
+    },
 );
 
 %utilities = Module::CoreList::_undelta(\%delta);
index 6b097d7..46965b7 100644 (file)
@@ -1,11 +1,16 @@
 use warnings;
 use strict;
+use Config;
 
 BEGIN {
   unless (my $port = getservbyname('echo', 'tcp')) {
     print "1..0 \# Skip: no echo port\n";
     exit;
   }
+  unless ($Config{d_getpbyname}) {
+    print "1..0 \# Skip: no getprotobyname\n";
+    exit;
+  }
 }
 
 use Test::More qw(no_plan);
index 90a934a..e8a6bb0 100644 (file)
@@ -1,11 +1,16 @@
 use warnings;
 use strict;
+use Config;
 
 BEGIN {
   unless (my $port = getservbyname('echo', 'tcp')) {
     print "1..0 \# Skip: no echo port\n";
     exit;
   }
+  unless ($Config{d_getpbyname}) {
+    print "1..0 \# Skip: no getprotobyname\n";
+    exit;
+  }
 }
 
 use Test::More tests => 2;
index 45ad154..bd0e437 100644 (file)
@@ -8,7 +8,7 @@ use Config;
 
 use Scalar::Util qw(reftype refaddr blessed);
 
-our $VERSION = '1.60'; # Please update the pod, too.
+our $VERSION = '1.61'; # Please update the pod, too.
 my $XS_VERSION = $VERSION;
 $VERSION = eval $VERSION;
 
@@ -196,7 +196,7 @@ threads::shared - Perl extension for sharing data structures between threads
 
 =head1 VERSION
 
-This document describes threads::shared version 1.60
+This document describes threads::shared version 1.61
 
 =head1 SYNOPSIS
 
index 6cdf094..858c6d6 100644 (file)
@@ -818,12 +818,19 @@ sharedsv_scalar_store(pTHX_ SV *sv, SV *ssv)
         SV *obj = SvRV(sv);
         SV *sobj = Perl_sharedsv_find(aTHX_ obj);
         if (sobj) {
+            SV* tmpref;
             SHARED_CONTEXT;
-            (void)SvUPGRADE(ssv, SVt_RV);
-            sv_setsv_nomg(ssv, &PL_sv_undef);
+            /* Creating a tmp ref to sobj then assigning it to ssv ensures
+             * that any previous contents of ssv are correctly freed
+             * by sv_setsv(). Not sure if there is a better, API-legal way
+             * to achieve this */
+            tmpref = newSV_type(SVt_RV);
+            SvRV_set(tmpref, sobj);
+            SvROK_on(tmpref);
+            SvREFCNT_inc_simple_NN(sobj);
+            sv_setsv_nomg(ssv, tmpref);
+            SvREFCNT_dec_NN(tmpref);
 
-            SvRV_set(ssv, SvREFCNT_inc(sobj));
-            SvROK_on(ssv);
             if (SvOBJECT(sobj)) {
                 /* Remove any old blessing */
                 SvREFCNT_dec(SvSTASH(sobj));
diff --git a/doio.c b/doio.c
index 05a0696..424e0e3 100644 (file)
--- a/doio.c
+++ b/doio.c
@@ -265,6 +265,21 @@ Perl_my_mkstemp_cloexec(char *templte)
 #endif
 }
 
+int
+Perl_my_mkostemp_cloexec(char *templte, int flags)
+{
+    dVAR;
+    PERL_ARGS_ASSERT_MY_MKOSTEMP_CLOEXEC;
+#if defined(O_CLOEXEC)
+    DO_ONEOPEN_EXPERIMENTING_CLOEXEC(
+        PL_strategy_mkstemp,
+       Perl_my_mkostemp(templte, flags | O_CLOEXEC),
+       Perl_my_mkostemp(templte, flags));
+#else
+    DO_ONEOPEN_THEN_CLOEXEC(Perl_my_mkostemp(templte, flags));
+#endif
+}
+
 #ifdef HAS_PIPE
 int
 Perl_PerlProc_pipe_cloexec(pTHX_ int *pipefd)
index b8d429a..c2c5669 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -543,6 +543,7 @@ p   |int    |PerlLIO_dup2_cloexec|int oldfd|int newfd
 pR     |int    |PerlLIO_open_cloexec|NN const char *file|int flag
 pR     |int    |PerlLIO_open3_cloexec|NN const char *file|int flag|int perm
 pToR   |int    |my_mkstemp_cloexec|NN char *templte
+pToR   |int    |my_mkostemp_cloexec|NN char *templte|int flags
 #ifdef HAS_PIPE
 pR     |int    |PerlProc_pipe_cloexec|NN int *pipefd
 #endif
@@ -636,7 +637,7 @@ Afpd        |char*  |form           |NN const char* pat|...
 Ap     |char*  |vform          |NN const char* pat|NULLOK va_list* args
 Ap     |void   |free_tmps
 #if defined(PERL_IN_OP_C)
-S      |OP*    |gen_constant_list|NULLOK OP* o
+S      |void   |gen_constant_list|NULLOK OP* o
 #endif
 #if !defined(HAS_GETENV_LEN)
 : Used in hv.c
@@ -1928,6 +1929,7 @@ ApdD      |UV     |utf8_to_uvchr  |NN const U8 *s|NULLOK STRLEN *retlen
 AbpdD  |UV     |utf8_to_uvuni  |NN const U8 *s|NULLOK STRLEN *retlen
 AbpxD  |UV     |valid_utf8_to_uvuni    |NN const U8 *s|NULLOK STRLEN *retlen
 AMpd   |UV     |utf8_to_uvchr_buf      |NN const U8 *s|NN const U8 *send|NULLOK STRLEN *retlen
+Ai     |UV     |_utf8_to_uvchr_buf     |NN const U8 *s|NN const U8 *send|NULLOK STRLEN *retlen
 ApdD   |UV     |utf8_to_uvuni_buf      |NN const U8 *s|NN const U8 *send|NULLOK STRLEN *retlen
 px     |bool   |check_utf8_print       |NN const U8 *s|const STRLEN len
 
diff --git a/embed.h b/embed.h
index 506327f..f72a7ee 100644 (file)
--- a/embed.h
+++ b/embed.h
@@ -46,6 +46,7 @@
 #define _to_utf8_lower_flags(a,b,c,d,e,f,g)    Perl__to_utf8_lower_flags(aTHX_ a,b,c,d,e,f,g)
 #define _to_utf8_title_flags(a,b,c,d,e,f,g)    Perl__to_utf8_title_flags(aTHX_ a,b,c,d,e,f,g)
 #define _to_utf8_upper_flags(a,b,c,d,e,f,g)    Perl__to_utf8_upper_flags(aTHX_ a,b,c,d,e,f,g)
+#define _utf8_to_uvchr_buf(a,b,c)      S__utf8_to_uvchr_buf(aTHX_ a,b,c)
 #define _utf8n_to_uvchr_msgs_helper    Perl__utf8n_to_uvchr_msgs_helper
 #define amagic_call(a,b,c,d)   Perl_amagic_call(aTHX_ a,b,c,d)
 #define amagic_deref_call(a,b) Perl_amagic_deref_call(aTHX_ a,b)
index 9d97ef1..4178179 100644 (file)
@@ -6,7 +6,7 @@ use strict;
 
 our($VERSION, @ISA, @EXPORT_OK);
 
-$VERSION = "1.43";
+$VERSION = "1.44";
 
 use Carp;
 use Exporter ();
@@ -493,7 +493,7 @@ A handy tag name for a I<reasonable> default set of ops beyond the
 :default optag.  Like :default (and indeed all the other optags) its
 current definition is unstable while development continues. It will change.
 
-The :browse tag represents the next step beyond :default. It it a
+The :browse tag represents the next step beyond :default. It is a
 superset of the :default ops and adds :filesys_read the :sys_db.
 The intent being that scripts can access more (possibly sensitive)
 information about your system but not be able to change it.
index e4f9a3d..cab1501 100644 (file)
@@ -468,7 +468,7 @@ integer value less than or equal to the numerical argument.
 
 Returns the current floating point rounding mode, one of
 
-  FE_TONEAREST FE_TOWARDZERO FE_UPWARD FE_UPWARD
+  FE_TONEAREST FE_TOWARDZERO FE_UPWARD FE_DOWNWARD
 
 C<FE_TONEAREST> is like L</round>, C<FE_TOWARDZERO> is like L</trunc> [C99].
 
index 35ad712..daf4457 100644 (file)
@@ -1,7 +1,7 @@
 package PerlIO::encoding;
 
 use strict;
-our $VERSION = '0.27';
+our $VERSION = '0.28';
 our $DEBUG = 0;
 $DEBUG and warn __PACKAGE__, " called by ", join(", ", caller), "\n";
 
index 941d786..9d98d87 100644 (file)
@@ -361,7 +361,7 @@ PerlIOEncode_fill(pTHX_ PerlIO * f)
            if (!SvPOKp(e->dataSV)) (void)SvPV_force_nolen(e->dataSV);
            use -= SvCUR(e->dataSV);
            PerlIO_set_ptrcnt(n, ptr+use, (avail-use));
-           /* and as we did not take it it isn't pending */
+           /* and as we did not take it, it isn't pending */
            SvCUR_set(e->dataSV,0);
        } else {
            /* Got nothing - assume partial character so we need some more */
index 41cefcb..367b0cf 100644 (file)
@@ -207,13 +207,10 @@ package Globber {
 # important.
 # We need a double eval, as scope unwinding will close the handle,
 # which croaks.
-# Under debugging builds with PERL_DESTRUCT_LEVEL set, we have to skip this
+# With PERL_DESTRUCT_LEVEL set, we have to skip this
 # test, as it triggers bug #115692, resulting in string table warnings.
-require Config;
 SKIP: {
-skip "produces string table warnings", 2
-  if "@{[Config::non_bincompat_options()]}" =~ /\bDEBUGGING\b/
-   && $ENV{PERL_DESTRUCT_LEVEL};
+skip "produces string table warnings", 2 if $ENV{PERL_DESTRUCT_LEVEL};
 
 eval { eval {
     open my $fh, ">:encoding(globber)", \$buf;
index d79ba11..3fe5e39 100644 (file)
@@ -23,7 +23,7 @@ WriteMakefile(
 my @names = (qw(HV_DELETE HV_DISABLE_UVAR_XKEY HV_FETCH_ISSTORE
                HV_FETCH_ISEXISTS HV_FETCH_LVALUE HV_FETCH_JUST_SV
                G_SCALAR G_ARRAY G_VOID G_DISCARD G_EVAL G_NOARGS
-               G_KEEPERR G_NODEBUG G_METHOD G_FAKINGEVAL
+               G_KEEPERR G_NODEBUG G_METHOD G_FAKINGEVAL G_RETHROW
                GV_NOADD_NOINIT
                IS_NUMBER_IN_UV IS_NUMBER_GREATER_THAN_UV_MAX
                IS_NUMBER_NOT_INT IS_NUMBER_NEG IS_NUMBER_INFINITY
index 632a421..e422807 100644 (file)
@@ -11,7 +11,7 @@ use strict;
 
 BEGIN {
     require '../../t/test.pl';
-    plan(530);
+    plan(538);
     use_ok('XS::APItest')
 };
 
@@ -228,6 +228,30 @@ is(eval { eval_pv(q/die $obj/, 1) }, undef,
 ok(ref $@, "object thrown");
 is($@, $obj, "check object rethrown");
 
+package False {
+    use overload
+      bool => sub { 0 },
+      '""' => sub { "Foo" };
+    sub new { bless {}, shift }
+};
+my $false = False->new;
+ok(!$false, "our false object is actually false");
+is(eval { eval_pv(q/die $false;/, 1); 1 }, undef,
+   "check false objects are rethrown");
+is(overload::StrVal($@), overload::StrVal($false),
+   "check we got the expected object");
+
+is(eval { eval_sv(q/die $false/, G_RETHROW); 1 }, undef,
+   "check G_RETHROW for thrown object");
+is(overload::StrVal($@), overload::StrVal($false),
+   "check we got the expected object");
+is(eval { eval_sv(q/"unterminated/, G_RETHROW); 1 }, undef,
+   "check G_RETHROW for syntax error");
+like($@, qr/Can't find string terminator/,
+     "check error rethrown");
+ok(eq_array([ eval { eval_sv(q/"working code"/, G_RETHROW) } ], [ "working code", 1 ]),
+   "check for spurious rethrow");
+
 # #3719 - check that the eval call variants handle exceptions correctly,
 # and do the right thing with $@, both with and without G_KEEPERR set.
 
diff --git a/handy.h b/handy.h
index 51f79ef..c436383 100644 (file)
--- a/handy.h
+++ b/handy.h
 /*
 =head1 Handy Values
 
-=for apidoc AmU||Nullch
+=for apidoc AmnU||Nullch
 Null character pointer.  (No longer available when C<PERL_CORE> is
 defined.)
 
-=for apidoc AmU||Nullsv
+=for apidoc AmnU||Nullsv
 Null SV pointer.  (No longer available when C<PERL_CORE> is defined.)
 
 =cut
@@ -317,7 +317,7 @@ string/length pair.
 Like C<sv_setpvn_mg>, but takes a literal string instead of a
 string/length pair.
 
-=for apidoc Am|SV *|sv_setref_pvs|"literal string" s
+=for apidoc Am|SV *|sv_setref_pvs|SV *const rv|const char *const classname|"literal string" s
 Like C<sv_setref_pvn>, but takes a literal string instead of
 a string/length pair.
 
index 33403e5..7f7623b 100644 (file)
 # mkdir -p /opt/perl-catamount
 # mkdir -p /opt/perl-catamount/include
 # mkdir -p /opt/perl-catamount/lib
-# mkdir -p /opt/perl-catamount/lib/perl5/5.31.1
+# mkdir -p /opt/perl-catamount/lib/perl5/5.31.2
 # mkdir -p /opt/perl-catamount/bin
 # cp *.h /opt/perl-catamount/include
 # cp libperl.a /opt/perl-catamount/lib
-# cp -pr lib/* /opt/perl-catamount/lib/perl5/5.31.1
+# cp -pr lib/* /opt/perl-catamount/lib/perl5/5.31.2
 # cp miniperl perl run.sh cc.sh /opt/perl-catamount/lib
 #
 # With the headers and the libperl.a you can embed Perl to your Catamount
index 9f7196f..cd22876 100644 (file)
@@ -43,27 +43,37 @@ libswanted="$libswanted m log"
 # https://code.google.com/p/android-source-browsing/source/browse/libc/netbsd/net/getservent_r.c?repo=platform--bionic&r=ca6fe7bebe3cc6ed7e2db5a3ede2de0fcddf411d#95
 d_getservent_r='undef'
 
-# Bionic defines several stubs that just warn and return NULL
+# Bionic defines several stubs that warn (in older releases) and return NULL
 # https://gitorious.org/0xdroid/bionic/blobs/70b2ef0ec89a9c9d4c2d4bcab728a0e72bafb18e/libc/bionic/stubs.c
 # https://android.googlesource.com/platform/bionic/+/master/libc/bionic/stubs.cpp
 
-# If they warn with 'FIX' or 'Android', assume they are the stubs
-# we want to avoid.
+# These tests originally looked for 'FIX' or 'Android' warnings, as they
+# indicated stubs to avoid. At some point, Android stopped emitting
+# those warnings; the tests were adapted to check function return values
+# and hopefully now detect stubs on both older and newer Androids.
 
 # These are all stubs as well, but the core doesn't use them:
 # getusershell setusershell endusershell
 
 # This script UU/archname.cbu will get 'called-back' by Configure.
 $cat > UU/archname.cbu <<'EOCBU'
-# egrep pattern to detect a stub warning on Android.
+# original egrep pattern to detect a stub warning on Android.
 # Right now we're checking for:
 # Android 2.x: FIX ME! implement FUNC
 # Android 4.x: FUNC is not implemented on Android
+# Android 8.x: <no warnings; tests now printf a compatible warning>
 android_stub='FIX|Android'
 
 $cat > try.c << 'EOM'
 #include <netdb.h>
-int main() { (void) getnetbyname("foo"); return(0); }
+#include <stdio.h>
+int main() {
+  struct netent* test = getnetbyname("loopback");
+  if (test == NULL) {
+    printf("getnetbyname is still a stub function on Android");
+  }
+  return(0);
+}
 EOM
 $cc $ccflags try.c -o try
 android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
@@ -73,7 +83,14 @@ fi
 
 $cat > try.c << 'EOM'
 #include <netdb.h>
-int main() { (void) getnetbyaddr((uint32_t)1, AF_INET); return(0); }
+#include <stdio.h>
+int main() {
+  struct netent* test = getnetbyaddr(127, AF_INET);
+  if (test == NULL) {
+    printf("getnetbyaddr is still a stub function on Android");
+  }
+  return(0);
+}
 EOM
 $cc $ccflags try.c -o try
 android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
@@ -95,7 +112,14 @@ fi
 
 $cat > try.c << 'EOM'
 #include <netdb.h>
-int main() { (void) getprotobyname("foo"); return(0); }
+#include <stdio.h>
+int main() {
+  struct protoent* test = getprotobyname("tcp");
+  if (test == NULL) {
+    printf("getprotobyname is still a stub function on Android");
+  }
+  return(0);
+}
 EOM
 $cc $ccflags try.c -o try
 android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
@@ -105,7 +129,14 @@ fi
 
 $cat > try.c << 'EOM'
 #include <netdb.h>
-int main() { (void) getprotobynumber(1); return(0); }
+#include <stdio.h>
+int main() {
+  struct protoent* test = getprotobynumber(1);
+  if (test == NULL) {
+    printf("getprotobynumber is still a stub function on Android");
+  }
+  return(0);
+}
 EOM
 $cc $ccflags try.c -o try
 android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
@@ -126,7 +157,14 @@ fi
 
 $cat > try.c << 'EOM'
 #include <unistd.h>
-int main() { (void) ttyname(STDIN_FILENO); return(0); }
+#include <stdio.h>
+int main() {
+  char *tty = ttyname(STDIN_FILENO);
+  if (tty == NULL) {
+    printf("ttyname is still a stub function on Android");
+  }
+  return(0);
+}
 EOM
 $cc $ccflags try.c -o try
 android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
index a985a8e..8cbe7dc 100644 (file)
@@ -165,6 +165,9 @@ esac
 # plibpth to bypass this check.
 if [ -x /usr/bin/gcc ] ; then
     gcc=/usr/bin/gcc
+# clang also provides -print-search-dirs
+elif ${cc:-cc} --version 2>/dev/null | grep -q '^clang ' ; then
+    gcc=${cc:-cc}
 else
     gcc=gcc
 fi
diff --git a/hv.h b/hv.h
index dcc6eb1..96a710f 100644 (file)
--- a/hv.h
+++ b/hv.h
@@ -142,14 +142,14 @@ struct xpvhv {
 /*
 =head1 Hash Manipulation Functions
 
-=for apidoc AmU||HEf_SVKEY
+=for apidoc AmnU||HEf_SVKEY
 This flag, used in the length slot of hash entries and magic structures,
 specifies the structure contains an C<SV*> pointer where a C<char*> pointer
 is to be expected.  (For information only--not to be used).
 
 =head1 Handy Values
 
-=for apidoc AmU||Nullhv
+=for apidoc ADmnU||Nullhv
 Null HV pointer.
 
 (deprecated - use C<(HV *)NULL> instead)
index 442c08e..7d81da6 100644 (file)
--- a/inline.h
+++ b/inline.h
@@ -1842,6 +1842,27 @@ S_utf8n_to_uvchr_msgs(const U8 *s,
     return _utf8n_to_uvchr_msgs_helper(s0, curlen, retlen, flags, errors, msgs);
 }
 
+PERL_STATIC_INLINE UV
+S__utf8_to_uvchr_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen)
+{
+    PERL_ARGS_ASSERT__UTF8_TO_UVCHR_BUF;
+
+    assert(s < send);
+
+    if (! ckWARN_d(WARN_UTF8)) {
+        return utf8n_to_uvchr(s, send - s, retlen,
+                              (UTF8_ALLOW_ANY & ~UTF8_ALLOW_EMPTY));
+    }
+    else {
+        UV ret = utf8n_to_uvchr(s, send - s, retlen, 0);
+        if (retlen && ret == 0 && *s != '\0') {
+            *retlen = (STRLEN) -1;
+        }
+
+        return ret;
+    }
+}
+
 /* ------------------------------- perl.h ----------------------------- */
 
 /*
index 34ca1a7..77ca2ca 100644 (file)
@@ -118,7 +118,7 @@ package B::Op_private;
 our %bits;
 
 
-our $VERSION = "5.031001";
+our $VERSION = "5.031002";
 
 $bits{$_}{3} = 'OPpENTERSUB_AMPER' for qw(entersub rv2cv);
 $bits{$_}{6} = 'OPpENTERSUB_DB' for qw(entersub rv2cv);
index 368794d..9cecad3 100644 (file)
@@ -16594,7 +16594,7 @@ sub make_re_pod_entries($) {
                     my $standard_short = standardize($proposed_short);
 
                     # If the short name is shorter than the standard one, or
-                    # even it it's not, but the combination of it and its
+                    # even if it's not, but the combination of it and its
                     # short property name (as in \p{prop=short} ($perl doesn't
                     # have this form)) saves at least two characters, then,
                     # cause it to be listed as a shorter synonym.
index 5c2f2a9..a4183fc 100644 (file)
 # 78e2600e24fa7d5ab62117de50b382f8b31b08401c37a0782c38dacb340b64e7 lib/unicore/extracted/DLineBreak.txt
 # 1bde4ad73e271c6349fbd1972e54f38bba5cc1900c28f678e79b9e8909b31793 lib/unicore/extracted/DNumType.txt
 # 6278722699123f3890e4b1cc42011e96d8960e4958a3b93484361530983d2611 lib/unicore/extracted/DNumValues.txt
-# a53648677d262457dda0b22efba8820d2a45ca6ebae01f8c73d30db380eb83b5 lib/unicore/mktables
+# a74b5e334b78d45bfc61718c8ef302d19884bdcfe348d0f24ddcbf4fa0a17118 lib/unicore/mktables
 # a712c758275b460d18fa77a26ed3589689bb3f69dcc1ea99b913e32db92a5cd2 lib/unicore/version
 # 2680b9254eb236c5c090f11b149605043e8c8433661b96efc4a42fb4709342a5 regen/charset_translations.pl
 # 03e51b0f07beebd5da62ab943899aa4934eee1f792fa27c1fb638c33bf4ac6ea regen/mk_PL_charclass.pl
index dffedad..db83d99 100644 (file)
--- a/locale.c
+++ b/locale.c
@@ -1238,7 +1238,7 @@ S_locking_setlocale(pTHX_
      * ones.  This is because as described earlier.  If we know on input the
      * index corresponding to the category into the array where we store the
      * current locales, we don't have to calculate it.  If the caller knows at
-     * compile time what the index is, it it can pass it, setting
+     * compile time what the index is, it can pass it, setting
      * 'is_index_valid' to TRUE; otherwise the index parameter is ignored.
      *
      */
diff --git a/op.c b/op.c
index 7aa002c..7081f7d 100644 (file)
--- a/op.c
+++ b/op.c
@@ -171,44 +171,6 @@ recursive, but it's recursive on basic blocks, not on tree nodes.
 
 static const char array_passed_to_stat[] = "Array passed to stat will be coerced to a scalar";
 
-/* Used to avoid recursion through the op tree in scalarvoid() and
-   op_free()
-*/
-
-#define dDEFER_OP  \
-    SSize_t defer_stack_alloc = 0; \
-    SSize_t defer_ix = -1; \
-    OP **defer_stack = NULL;
-#define DEFER_OP_CLEANUP Safefree(defer_stack)
-#define DEFERRED_OP_STEP 100
-#define DEFER_OP(o) \
-  STMT_START { \
-    if (UNLIKELY(defer_ix == (defer_stack_alloc-1))) {    \
-        defer_stack_alloc += DEFERRED_OP_STEP; \
-        assert(defer_stack_alloc > 0); \
-        Renew(defer_stack, defer_stack_alloc, OP *); \
-    } \
-    defer_stack[++defer_ix] = o; \
-  } STMT_END
-#define DEFER_REVERSE(count)                            \
-    STMT_START {                                        \
-        UV cnt = (count);                               \
-        if (cnt > 1) {                                  \
-            OP **top = defer_stack + defer_ix;          \
-            /* top - (cnt) + 1 isn't safe here */       \
-            OP **bottom = top - (cnt - 1);              \
-            OP *tmp;                                    \
-            assert(bottom >= defer_stack);              \
-            while (top > bottom) {                      \
-                tmp = *top;                             \
-                *top-- = *bottom;                       \
-                *bottom++ = tmp;                        \
-            }                                           \
-        }                                               \
-    } STMT_END;
-
-#define POP_DEFERRED_OP() (defer_ix >= 0 ? defer_stack[defer_ix--] : (OP *)NULL)
-
 /* remove any leading "empty" ops from the op_next chain whose first
  * node's address is stored in op_p. Store the updated address of the
  * first node in op_p.
@@ -807,8 +769,8 @@ S_op_destroy(pTHX_ OP *o)
 /*
 =for apidoc op_free
 
-Free an op.  Only use this when an op is no longer linked to from any
-optree.
+Free an op and its children. Only use this when an op is no longer linked
+to from any optree.
 
 =cut
 */
@@ -818,13 +780,68 @@ Perl_op_free(pTHX_ OP *o)
 {
     dVAR;
     OPCODE type;
-    dDEFER_OP;
+    OP *top_op = o;
+    OP *next_op = o;
+    bool went_up = FALSE; /* whether we reached the current node by
+                            following the parent pointer from a child, and
+                            so have already seen this node */
 
-    do {
+    if (!o || o->op_type == OP_FREED)
+        return;
+
+    if (o->op_private & OPpREFCOUNTED) {
+        /* if base of tree is refcounted, just decrement */
+        switch (o->op_type) {
+        case OP_LEAVESUB:
+        case OP_LEAVESUBLV:
+        case OP_LEAVEEVAL:
+        case OP_LEAVE:
+        case OP_SCOPE:
+        case OP_LEAVEWRITE:
+            {
+                PADOFFSET refcnt;
+                OP_REFCNT_LOCK;
+                refcnt = OpREFCNT_dec(o);
+                OP_REFCNT_UNLOCK;
+                if (refcnt) {
+                    /* Need to find and remove any pattern match ops from
+                     * the list we maintain for reset().  */
+                    find_and_forget_pmops(o);
+                    return;
+                }
+            }
+            break;
+        default:
+            break;
+        }
+    }
+
+    while (next_op) {
+        o = next_op;
+
+        /* free child ops before ourself, (then free ourself "on the
+         * way back up") */
+
+        if (!went_up && o->op_flags & OPf_KIDS) {
+            next_op = cUNOPo->op_first;
+            continue;
+        }
+
+        /* find the next node to visit, *then* free the current node
+         * (can't rely on o->op_* fields being valid after o has been
+         * freed) */
+
+        /* The next node to visit will be either the sibling, or the
+         * parent if no siblings left, or NULL if we've worked our way
+         * back up to the top node in the tree */
+        next_op = (o == top_op) ? NULL : o->op_sibparent;
+        went_up = cBOOL(!OpHAS_SIBLING(o)); /* parents are already visited */
+
+        /* Now process the current node */
 
         /* Though ops may be freed twice, freeing the op after its slab is a
            big no-no. */
-        assert(!o || !o->op_slabbed || OpSLAB(o)->opslab_refcnt != ~(size_t)0);
+        assert(!o->op_slabbed || OpSLAB(o)->opslab_refcnt != ~(size_t)0);
         /* During the forced freeing of ops after compilation failure, kidops
            may be freed before their parents. */
         if (!o || o->op_type == OP_FREED)
@@ -843,7 +860,7 @@ Perl_op_free(pTHX_ OP *o)
          *     we can't spot faults in the main code, only
          *     evaled/required code */
 #ifdef DEBUGGING
-        if (   o->op_ppaddr == PL_ppaddr[o->op_type]
+        if (   o->op_ppaddr == PL_ppaddr[type]
             && PL_parser
             && !PL_parser->error_count)
         {
@@ -851,54 +868,12 @@ Perl_op_free(pTHX_ OP *o)
         }
 #endif
 
-        if (o->op_private & OPpREFCOUNTED) {
-            switch (type) {
-            case OP_LEAVESUB:
-            case OP_LEAVESUBLV:
-            case OP_LEAVEEVAL:
-            case OP_LEAVE:
-            case OP_SCOPE:
-            case OP_LEAVEWRITE:
-                {
-                PADOFFSET refcnt;
-                OP_REFCNT_LOCK;
-                refcnt = OpREFCNT_dec(o);
-                OP_REFCNT_UNLOCK;
-                if (refcnt) {
-                    /* Need to find and remove any pattern match ops from the list
-                       we maintain for reset().  */
-                    find_and_forget_pmops(o);
-                    continue;
-                }
-                }
-                break;
-            default:
-                break;
-            }
-        }
 
         /* Call the op_free hook if it has been set. Do it now so that it's called
          * at the right time for refcounted ops, but still before all of the kids
          * are freed. */
         CALL_OPFREEHOOK(o);
 
-        if (o->op_flags & OPf_KIDS) {
-            OP *kid, *nextkid;
-            assert(cUNOPo->op_first); /* OPf_KIDS implies op_first non-null */
-            for (kid = cUNOPo->op_first; kid; kid = nextkid) {
-                nextkid = OpSIBLING(kid); /* Get before next freeing kid */
-                if (kid->op_type == OP_FREED)
-                    /* During the forced freeing of ops after
-                       compilation failure, kidops may be freed before
-                       their parents. */
-                    continue;
-                if (!(kid->op_flags & OPf_KIDS))
-                    /* If it has no kids, just free it now */
-                    op_free(kid);
-                else
-                    DEFER_OP(kid);
-            }
-        }
         if (type == OP_NULL)
             type = (OPCODE)o->op_targ;
 
@@ -915,11 +890,10 @@ Perl_op_free(pTHX_ OP *o)
         FreeOp(o);
         if (PL_op == o)
             PL_op = NULL;
-    } while ( (o = POP_DEFERRED_OP()) );
-
-    DEFER_OP_CLEANUP;
+    }
 }
 
+
 /* S_op_clear_gv(): free a GV attached to an OP */
 
 STATIC
@@ -1301,27 +1275,41 @@ S_forget_pmop(pTHX_ PMOP *const o)
        PL_curpm = NULL;
 }
 
+
 STATIC void
 S_find_and_forget_pmops(pTHX_ OP *o)
 {
+    OP* top_op = o;
+
     PERL_ARGS_ASSERT_FIND_AND_FORGET_PMOPS;
 
-    if (o->op_flags & OPf_KIDS) {
-        OP *kid = cUNOPo->op_first;
-       while (kid) {
-           switch (kid->op_type) {
-           case OP_SUBST:
-           case OP_SPLIT:
-           case OP_MATCH:
-           case OP_QR:
-               forget_pmop((PMOP*)kid);
-           }
-           find_and_forget_pmops(kid);
-           kid = OpSIBLING(kid);
-       }
+    while (1) {
+        switch (o->op_type) {
+        case OP_SUBST:
+        case OP_SPLIT:
+        case OP_MATCH:
+        case OP_QR:
+            forget_pmop((PMOP*)o);
+        }
+
+        if (o->op_flags & OPf_KIDS) {
+            o = cUNOPo->op_first;
+            continue;
+        }
+
+        while (1) {
+            if (o == top_op)
+                return; /* at top; no parents/siblings to try */
+            if (OpHAS_SIBLING(o)) {
+                o = o->op_sibparent; /* process next sibling */
+                break;
+            }
+            o = o->op_sibparent; /*try parent's next sibling */
+        }
     }
 }
 
+
 /*
 =for apidoc op_null
 
@@ -1626,39 +1614,58 @@ not be called directly.
 =cut
 */
 
+
 OP *
 Perl_op_linklist(pTHX_ OP *o)
 {
-    OP *first;
+
+    OP **prevp;
+    OP *kid;
+    OP * top_op = o;
 
     PERL_ARGS_ASSERT_OP_LINKLIST;
 
-    if (o->op_next)
-       return o->op_next;
+    while (1) {
+        /* Descend down the tree looking for any unprocessed subtrees to
+         * do first */
+        if (!o->op_next) {
+            if (o->op_flags & OPf_KIDS) {
+                o = cUNOPo->op_first;
+                continue;
+            }
+            o->op_next = o; /* leaf node; link to self initially */
+        }
 
-    /* establish postfix order */
-    first = cUNOPo->op_first;
-    if (first) {
-        OP *kid;
-       o->op_next = LINKLIST(first);
-       kid = first;
-       for (;;) {
-            OP *sibl = OpSIBLING(kid);
-            if (sibl) {
-                kid->op_next = LINKLIST(sibl);
-                kid = sibl;
-           } else {
-               kid->op_next = o;
-               break;
-           }
-       }
-    }
-    else
-       o->op_next = o;
+        /* if we're at the top level, there either weren't any children
+         * to process, or we've worked our way back to the top. */
+        if (o == top_op)
+            return o->op_next;
+
+        /* o is now processed. Next, process any sibling subtrees */
+
+        if (OpHAS_SIBLING(o)) {
+            o = OpSIBLING(o);
+            continue;
+        }
 
-    return o->op_next;
+        /* Done all the subtrees at this level. Go back up a level and
+         * link the parent in with all its (processed) children.
+         */
+
+        o = o->op_sibparent;
+        assert(!o->op_next);
+        prevp = &(o->op_next);
+        kid   = (o->op_flags & OPf_KIDS) ? cUNOPo->op_first : NULL;
+        while (kid) {
+            *prevp = kid->op_next;
+            prevp = &(kid->op_next);
+            kid = OpSIBLING(kid);
+        }
+        *prevp = o;
+    }
 }
 
+
 static OP *
 S_scalarkids(pTHX_ OP *o)
 {
@@ -1815,122 +1822,181 @@ S_scalar_slice_warning(pTHX_ const OP *o)
                    SVfARG(name), lbrack, SVfARG(keysv), rbrack);
 }
 
+
+
+/* apply scalar context to the o subtree */
+
 OP *
 Perl_scalar(pTHX_ OP *o)
 {
-    OP *kid;
+    OP * top_op = o;
 
-    /* assumes no premature commitment */
-    if (!o || (PL_parser && PL_parser->error_count)
-        || (o->op_flags & OPf_WANT)
-        || o->op_type == OP_RETURN)
-    {
-       return o;
-    }
+    while (1) {
+        OP *next_kid = NULL; /* what op (if any) to process next */
+        OP *kid;
 
-    o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_SCALAR;
+        /* assumes no premature commitment */
+        if (!o || (PL_parser && PL_parser->error_count)
+             || (o->op_flags & OPf_WANT)
+             || o->op_type == OP_RETURN)
+        {
+            goto do_next;
+        }
 
-    switch (o->op_type) {
-    case OP_REPEAT:
-       scalar(cBINOPo->op_first);
-       if (o->op_private & OPpREPEAT_DOLIST) {
-           kid = cLISTOPx(cUNOPo->op_first)->op_first;
-           assert(kid->op_type == OP_PUSHMARK);
-           if (OpHAS_SIBLING(kid) && !OpHAS_SIBLING(OpSIBLING(kid))) {
-               op_null(cLISTOPx(cUNOPo->op_first)->op_first);
-               o->op_private &=~ OPpREPEAT_DOLIST;
-           }
-       }
-       break;
-    case OP_OR:
-    case OP_AND:
-    case OP_COND_EXPR:
-       for (kid = OpSIBLING(cUNOPo->op_first); kid; kid = OpSIBLING(kid))
-           scalar(kid);
-       break;
-       /* FALLTHROUGH */
-    case OP_SPLIT:
-    case OP_MATCH:
-    case OP_QR:
-    case OP_SUBST:
-    case OP_NULL:
-    default:
-       if (o->op_flags & OPf_KIDS) {
-           for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
-               scalar(kid);
-       }
-       break;
-    case OP_LEAVE:
-    case OP_LEAVETRY:
-       kid = cLISTOPo->op_first;
-       scalar(kid);
-       kid = OpSIBLING(kid);
-    do_kids:
-       while (kid) {
-           OP *sib = OpSIBLING(kid);
-           if (sib && kid->op_type != OP_LEAVEWHEN
-            && (  OpHAS_SIBLING(sib) || sib->op_type != OP_NULL
-               || (  sib->op_targ != OP_NEXTSTATE
-                  && sib->op_targ != OP_DBSTATE  )))
-               scalarvoid(kid);
-           else
-               scalar(kid);
-           kid = sib;
-       }
-       PL_curcop = &PL_compiling;
-       break;
-    case OP_SCOPE:
-    case OP_LINESEQ:
-    case OP_LIST:
-       kid = cLISTOPo->op_first;
-       goto do_kids;
-    case OP_SORT:
-       Perl_ck_warner(aTHX_ packWARN(WARN_VOID), "Useless use of sort in scalar context");
-       break;
-    case OP_KVHSLICE:
-    case OP_KVASLICE:
-    {
-       /* Warn about scalar context */
-       const char lbrack = o->op_type == OP_KVHSLICE ? '{' : '[';
-       const char rbrack = o->op_type == OP_KVHSLICE ? '}' : ']';
-       SV *name;
-       SV *keysv;
-       const char *key = NULL;
+        o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_SCALAR;
 
-       /* This warning can be nonsensical when there is a syntax error. */
-       if (PL_parser && PL_parser->error_count)
-           break;
+        switch (o->op_type) {
+        case OP_REPEAT:
+            scalar(cBINOPo->op_first);
+            /* convert what initially looked like a list repeat into a
+             * scalar repeat, e.g. $s = (1) x $n
+             */
+            if (o->op_private & OPpREPEAT_DOLIST) {
+                kid = cLISTOPx(cUNOPo->op_first)->op_first;
+                assert(kid->op_type == OP_PUSHMARK);
+                if (OpHAS_SIBLING(kid) && !OpHAS_SIBLING(OpSIBLING(kid))) {
+                    op_null(cLISTOPx(cUNOPo->op_first)->op_first);
+                    o->op_private &=~ OPpREPEAT_DOLIST;
+                }
+            }
+            break;
+
+        case OP_OR:
+        case OP_AND:
+        case OP_COND_EXPR:
+            /* impose scalar context on everything except the condition */
+            next_kid = OpSIBLING(cUNOPo->op_first);
+            break;
 
-       if (!ckWARN(WARN_SYNTAX)) break;
+        default:
+            if (o->op_flags & OPf_KIDS)
+                next_kid = cUNOPo->op_first; /* do all kids */
+            break;
 
-       kid = cLISTOPo->op_first;
-       kid = OpSIBLING(kid); /* get past pushmark */
-       assert(OpSIBLING(kid));
-       name = S_op_varname(aTHX_ OpSIBLING(kid));
-       if (!name) /* XS module fiddling with the op tree */
-           break;
-       S_op_pretty(aTHX_ kid, &keysv, &key);
-       assert(SvPOK(name));
-       sv_chop(name,SvPVX(name)+1);
-       if (key)
-  /* diag_listed_as: %%s[%s] in scalar context better written as $%s[%s] */
-           Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                      "%%%" SVf "%c%s%c in scalar context better written "
-                      "as $%" SVf "%c%s%c",
-                       SVfARG(name), lbrack, key, rbrack, SVfARG(name),
-                       lbrack, key, rbrack);
-       else
-  /* diag_listed_as: %%s[%s] in scalar context better written as $%s[%s] */
-           Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                      "%%%" SVf "%c%" SVf "%c in scalar context better "
-                      "written as $%" SVf "%c%" SVf "%c",
-                       SVfARG(name), lbrack, SVfARG(keysv), rbrack,
-                       SVfARG(name), lbrack, SVfARG(keysv), rbrack);
-    }
-    }
-    return o;
+        /* the children of these ops are usually a list of statements,
+         * except the leaves, whose first child is a corresponding enter
+         */
+        case OP_SCOPE:
+        case OP_LINESEQ:
+        case OP_LIST:
+            kid = cLISTOPo->op_first;
+            goto do_kids;
+        case OP_LEAVE:
+        case OP_LEAVETRY:
+            kid = cLISTOPo->op_first;
+            scalar(kid);
+            kid = OpSIBLING(kid);
+        do_kids:
+            while (kid) {
+                OP *sib = OpSIBLING(kid);
+                /* Apply void context to all kids except the last, which
+                 * is scalar (ignoring a trailing ex-nextstate in determining
+                 * if it's the last kid). E.g.
+                 *      $scalar = do { void; void; scalar }
+                 * Except that 'when's are always scalar, e.g.
+                 *      $scalar = do { given(..) {
+                    *                 when (..) { scalar }
+                    *                 when (..) { scalar }
+                    *                 ...
+                    *                }}
+                    */
+                if (!sib
+                     || (  !OpHAS_SIBLING(sib)
+                         && sib->op_type == OP_NULL
+                         && (   sib->op_targ == OP_NEXTSTATE
+                             || sib->op_targ == OP_DBSTATE  )
+                        )
+                )
+                {
+                    /* tail call optimise calling scalar() on the last kid */
+                    next_kid = kid;
+                    goto do_next;
+                }
+                else if (kid->op_type == OP_LEAVEWHEN)
+                    scalar(kid);
+                else
+                    scalarvoid(kid);
+                kid = sib;
+            }
+            NOT_REACHED; /* NOTREACHED */
+            break;
+
+        case OP_SORT:
+            Perl_ck_warner(aTHX_ packWARN(WARN_VOID), "Useless use of sort in scalar context");
+            break;
+
+        case OP_KVHSLICE:
+        case OP_KVASLICE:
+        {
+            /* Warn about scalar context */
+            const char lbrack = o->op_type == OP_KVHSLICE ? '{' : '[';
+            const char rbrack = o->op_type == OP_KVHSLICE ? '}' : ']';
+            SV *name;
+            SV *keysv;
+            const char *key = NULL;
+
+            /* This warning can be nonsensical when there is a syntax error. */
+            if (PL_parser && PL_parser->error_count)
+                break;
+
+            if (!ckWARN(WARN_SYNTAX)) break;
+
+            kid = cLISTOPo->op_first;
+            kid = OpSIBLING(kid); /* get past pushmark */
+            assert(OpSIBLING(kid));
+            name = S_op_varname(aTHX_ OpSIBLING(kid));
+            if (!name) /* XS module fiddling with the op tree */
+                break;
+            S_op_pretty(aTHX_ kid, &keysv, &key);
+            assert(SvPOK(name));
+            sv_chop(name,SvPVX(name)+1);
+            if (key)
+      /* diag_listed_as: %%s[%s] in scalar context better written as $%s[%s] */
+                Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
+                           "%%%" SVf "%c%s%c in scalar context better written "
+                           "as $%" SVf "%c%s%c",
+                            SVfARG(name), lbrack, key, rbrack, SVfARG(name),
+                            lbrack, key, rbrack);
+            else
+      /* diag_listed_as: %%s[%s] in scalar context better written as $%s[%s] */
+                Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
+                           "%%%" SVf "%c%" SVf "%c in scalar context better "
+                           "written as $%" SVf "%c%" SVf "%c",
+                            SVfARG(name), lbrack, SVfARG(keysv), rbrack,
+                            SVfARG(name), lbrack, SVfARG(keysv), rbrack);
+        }
+        } /* switch */
+
+        /* If next_kid is set, someone in the code above wanted us to process
+         * that kid and all its remaining siblings.  Otherwise, work our way
+         * back up the tree */
+      do_next:
+        while (!next_kid) {
+            if (o == top_op)
+                return top_op; /* at top; no parents/siblings to try */
+            if (OpHAS_SIBLING(o))
+                next_kid = o->op_sibparent;
+            else {
+                o = o->op_sibparent; /*try parent's next sibling */
+                switch (o->op_type) {
+                case OP_SCOPE:
+                case OP_LINESEQ:
+                case OP_LIST:
+                case OP_LEAVE:
+                case OP_LEAVETRY:
+                    /* should really restore PL_curcop to its old value, but
+                     * setting it to PL_compiling is better than do nothing */
+                    PL_curcop = &PL_compiling;
+                }
+            }
+        }
+        o = next_kid;
+    } /* while */
 }
 
+
+/* apply void context to the optree arg */
+
 OP *
 Perl_scalarvoid(pTHX_ OP *arg)
 {
@@ -1938,14 +2004,14 @@ Perl_scalarvoid(pTHX_ OP *arg)
     OP *kid;
     SV* sv;
     OP *o = arg;
-    dDEFER_OP;
 
     PERL_ARGS_ASSERT_SCALARVOID;
 
-    do {
+    while (1) {
         U8 want;
         SV *useless_sv = NULL;
         const char* useless = NULL;
+        OP * next_kid = NULL;
 
         if (o->op_type == OP_NEXTSTATE
             || o->op_type == OP_DBSTATE
@@ -1959,7 +2025,7 @@ Perl_scalarvoid(pTHX_ OP *arg)
             || (PL_parser && PL_parser->error_count)
             || o->op_type == OP_RETURN || o->op_type == OP_REQUIRE || o->op_type == OP_LEAVEWHEN)
         {
-            continue;
+            goto get_next_op;
         }
 
         if ((o->op_private & OPpTARGET_MY)
@@ -1967,7 +2033,7 @@ Perl_scalarvoid(pTHX_ OP *arg)
         {
             /* newASSIGNOP has already applied scalar context, which we
                leave, as if this op is inside SASSIGN.  */
-            continue;
+            goto get_next_op;
         }
 
         o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_VOID;
@@ -2226,11 +2292,7 @@ Perl_scalarvoid(pTHX_ OP *arg)
         case OP_COND_EXPR:
         case OP_ENTERGIVEN:
         case OP_ENTERWHEN:
-            for (kid = OpSIBLING(cUNOPo->op_first); kid; kid = OpSIBLING(kid))
-                if (!(kid->op_flags & OPf_KIDS))
-                    scalarvoid(kid);
-                else
-                    DEFER_OP(kid);
+            next_kid = OpSIBLING(cUNOPo->op_first);
         break;
 
         case OP_NULL:
@@ -2252,11 +2314,7 @@ Perl_scalarvoid(pTHX_ OP *arg)
         case OP_LEAVEGIVEN:
         case OP_LEAVEWHEN:
         kids:
-            for (kid = cLISTOPo->op_first; kid; kid = OpSIBLING(kid))
-                if (!(kid->op_flags & OPf_KIDS))
-                    scalarvoid(kid);
-                else
-                    DEFER_OP(kid);
+            next_kid = cLISTOPo->op_first;
             break;
         case OP_LIST:
             /* If the first kid after pushmark is something that the padrange
@@ -2297,13 +2355,27 @@ Perl_scalarvoid(pTHX_ OP *arg)
                            "Useless use of %s in void context",
                            useless);
         }
-    } while ( (o = POP_DEFERRED_OP()) );
 
-    DEFER_OP_CLEANUP;
+      get_next_op:
+        /* if a kid hasn't been nominated to process, continue with the
+         * next sibling, or if no siblings left, go back to the parent's
+         * siblings and so on
+         */
+        while (!next_kid) {
+            if (o == arg)
+                return arg; /* at top; no parents/siblings to try */
+            if (OpHAS_SIBLING(o))
+                next_kid = o->op_sibparent;
+            else
+                o = o->op_sibparent; /*try parent's next sibling */
+        }
+        o = next_kid;
+    }
 
     return arg;
 }
 
+
 static OP *
 S_listkids(pTHX_ OP *o)
 {
@@ -2315,97 +2387,153 @@ S_listkids(pTHX_ OP *o)
     return o;
 }
 
+
+/* apply list context to the o subtree */
+
 OP *
 Perl_list(pTHX_ OP *o)
 {
-    OP *kid;
+    OP * top_op = o;
 
-    /* assumes no premature commitment */
-    if (!o || (o->op_flags & OPf_WANT)
-        || (PL_parser && PL_parser->error_count)
-        || o->op_type == OP_RETURN)
-    {
-       return o;
-    }
+    while (1) {
+        OP *next_kid = NULL; /* what op (if any) to process next */
 
-    if ((o->op_private & OPpTARGET_MY)
-       && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
-    {
-       return o;                               /* As if inside SASSIGN */
-    }
+        OP *kid;
 
-    o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_LIST;
+        /* assumes no premature commitment */
+        if (!o || (o->op_flags & OPf_WANT)
+             || (PL_parser && PL_parser->error_count)
+             || o->op_type == OP_RETURN)
+        {
+            goto do_next;
+        }
 
-    switch (o->op_type) {
-    case OP_FLOP:
-       list(cBINOPo->op_first);
-       break;
-    case OP_REPEAT:
-       if (o->op_private & OPpREPEAT_DOLIST
-        && !(o->op_flags & OPf_STACKED))
-       {
-           list(cBINOPo->op_first);
-           kid = cBINOPo->op_last;
-           if (kid->op_type == OP_CONST && SvIOK(kSVOP_sv)
-            && SvIVX(kSVOP_sv) == 1)
-           {
-               op_null(o); /* repeat */
-               op_null(cUNOPx(cBINOPo->op_first)->op_first);/* pushmark */
-               /* const (rhs): */
-               op_free(op_sibling_splice(o, cBINOPo->op_first, 1, NULL));
-           }
-       }
-       break;
-    case OP_OR:
-    case OP_AND:
-    case OP_COND_EXPR:
-       for (kid = OpSIBLING(cUNOPo->op_first); kid; kid = OpSIBLING(kid))
-           list(kid);
-       break;
-    default:
-    case OP_MATCH:
-    case OP_QR:
-    case OP_SUBST:
-    case OP_NULL:
-       if (!(o->op_flags & OPf_KIDS))
-           break;
-       if (!o->op_next && cUNOPo->op_first->op_type == OP_FLOP) {
-           list(cBINOPo->op_first);
-           return gen_constant_list(o);
-       }
-       listkids(o);
-       break;
-    case OP_LIST:
-       listkids(o);
-       if (cLISTOPo->op_first->op_type == OP_PUSHMARK) {
-           op_null(cUNOPo->op_first); /* NULL the pushmark */
-           op_null(o); /* NULL the list */
-       }
-       break;
-    case OP_LEAVE:
-    case OP_LEAVETRY:
-       kid = cLISTOPo->op_first;
-       list(kid);
-       kid = OpSIBLING(kid);
-    do_kids:
-       while (kid) {
-           OP *sib = OpSIBLING(kid);
-           if (sib && kid->op_type != OP_LEAVEWHEN)
-               scalarvoid(kid);
-           else
-               list(kid);
-           kid = sib;
-       }
-       PL_curcop = &PL_compiling;
-       break;
-    case OP_SCOPE:
-    case OP_LINESEQ:
-       kid = cLISTOPo->op_first;
-       goto do_kids;
-    }
-    return o;
+        if ((o->op_private & OPpTARGET_MY)
+            && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
+        {
+            goto do_next;                              /* As if inside SASSIGN */
+        }
+
+        o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_LIST;
+
+        switch (o->op_type) {
+        case OP_REPEAT:
+            if (o->op_private & OPpREPEAT_DOLIST
+             && !(o->op_flags & OPf_STACKED))
+            {
+                list(cBINOPo->op_first);
+                kid = cBINOPo->op_last;
+                /* optimise away (.....) x 1 */
+                if (kid->op_type == OP_CONST && SvIOK(kSVOP_sv)
+                 && SvIVX(kSVOP_sv) == 1)
+                {
+                    op_null(o); /* repeat */
+                    op_null(cUNOPx(cBINOPo->op_first)->op_first);/* pushmark */
+                    /* const (rhs): */
+                    op_free(op_sibling_splice(o, cBINOPo->op_first, 1, NULL));
+                }
+            }
+            break;
+
+        case OP_OR:
+        case OP_AND:
+        case OP_COND_EXPR:
+            /* impose list context on everything except the condition */
+            next_kid = OpSIBLING(cUNOPo->op_first);
+            break;
+
+        default:
+            if (!(o->op_flags & OPf_KIDS))
+                break;
+            /* possibly flatten 1..10 into a constant array */
+            if (!o->op_next && cUNOPo->op_first->op_type == OP_FLOP) {
+                list(cBINOPo->op_first);
+                gen_constant_list(o);
+                goto do_next;
+            }
+            next_kid = cUNOPo->op_first; /* do all kids */
+            break;
+
+        case OP_LIST:
+            if (cLISTOPo->op_first->op_type == OP_PUSHMARK) {
+                op_null(cUNOPo->op_first); /* NULL the pushmark */
+                op_null(o); /* NULL the list */
+            }
+            if (o->op_flags & OPf_KIDS)
+                next_kid = cUNOPo->op_first; /* do all kids */
+            break;
+
+        /* the children of these ops are usually a list of statements,
+         * except the leaves, whose first child is a corresponding enter
+         */
+        case OP_SCOPE:
+        case OP_LINESEQ:
+            kid = cLISTOPo->op_first;
+            goto do_kids;
+        case OP_LEAVE:
+        case OP_LEAVETRY:
+            kid = cLISTOPo->op_first;
+            list(kid);
+            kid = OpSIBLING(kid);
+        do_kids:
+            while (kid) {
+                OP *sib = OpSIBLING(kid);
+                /* Apply void context to all kids except the last, which
+                 * is list. E.g.
+                 *      @a = do { void; void; list }
+                 * Except that 'when's are always list context, e.g.
+                 *      @a = do { given(..) {
+                    *                 when (..) { list }
+                    *                 when (..) { list }
+                    *                 ...
+                    *                }}
+                    */
+                if (!sib) {
+                    /* tail call optimise calling list() on the last kid */
+                    next_kid = kid;
+                    goto do_next;
+                }
+                else if (kid->op_type == OP_LEAVEWHEN)
+                    list(kid);
+                else
+                    scalarvoid(kid);
+                kid = sib;
+            }
+            NOT_REACHED; /* NOTREACHED */
+            break;
+
+        }
+
+        /* If next_kid is set, someone in the code above wanted us to process
+         * that kid and all its remaining siblings.  Otherwise, work our way
+         * back up the tree */
+      do_next:
+        while (!next_kid) {
+            if (o == top_op)
+                return top_op; /* at top; no parents/siblings to try */
+            if (OpHAS_SIBLING(o))
+                next_kid = o->op_sibparent;
+            else {
+                o = o->op_sibparent; /*try parent's next sibling */
+                switch (o->op_type) {
+                case OP_SCOPE:
+                case OP_LINESEQ:
+                case OP_LIST:
+                case OP_LEAVE:
+                case OP_LEAVETRY:
+                    /* should really restore PL_curcop to its old value, but
+                     * setting it to PL_compiling is better than do nothing */
+                    PL_curcop = &PL_compiling;
+                }
+            }
+
+
+        }
+        o = next_kid;
+    } /* while */
 }
 
+
 static OP *
 S_scalarseq(pTHX_ OP *o)
 {
@@ -3492,17 +3620,20 @@ Perl_optimize_optree(pTHX_ OP* o)
 }
 
 
-/* helper for optimize_optree() which optimises on op then recurses
+/* helper for optimize_optree() which optimises one op then recurses
  * to optimise any children.
  */
 
 STATIC void
 S_optimize_op(pTHX_ OP* o)
 {
-    dDEFER_OP;
+    OP *top_op = o;
 
     PERL_ARGS_ASSERT_OPTIMIZE_OP;
-    do {
+
+    while (1) {
+        OP * next_kid = NULL;
+
         assert(o->op_type != OP_FREED);
 
         switch (o->op_type) {
@@ -3520,26 +3651,44 @@ S_optimize_op(pTHX_ OP* o)
             break;
 
         case OP_SUBST:
-            if (cPMOPo->op_pmreplrootu.op_pmreplroot)
-                DEFER_OP(cPMOPo->op_pmreplrootu.op_pmreplroot);
+            if (cPMOPo->op_pmreplrootu.op_pmreplroot) {
+                /* we can't assume that op_pmreplroot->op_sibparent == o
+                 * and that it is thus possible to walk back up the tree
+                 * past op_pmreplroot. So, although we try to avoid
+                 * recursing through op trees, do it here. After all,
+                 * there are unlikely to be many nested s///e's within
+                 * the replacement part of a s///e.
+                 */
+                optimize_op(cPMOPo->op_pmreplrootu.op_pmreplroot);
+            }
             break;
 
         default:
             break;
         }
 
-        if (o->op_flags & OPf_KIDS) {
-            OP *kid;
-            IV child_count = 0;
-            for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid)) {
-                DEFER_OP(kid);
-                ++child_count;
-            }
-            DEFER_REVERSE(child_count);
+        if (o->op_flags & OPf_KIDS)
+            next_kid = cUNOPo->op_first;
+
+        /* if a kid hasn't been nominated to process, continue with the
+         * next sibling, or if no siblings left, go back to the parent's
+         * siblings and so on
+         */
+        while (!next_kid) {
+            if (o == top_op)
+                return; /* at top; no parents/siblings to try */
+            if (OpHAS_SIBLING(o))
+                next_kid = o->op_sibparent;
+            else
+                o = o->op_sibparent; /*try parent's next sibling */
         }
-    } while ( ( o = POP_DEFERRED_OP() ) );
 
-    DEFER_OP_CLEANUP;
+      /* this label not yet used. Goto here if any code above sets
+       * next-kid
+       get_next_op:
+       */
+        o = next_kid;
+    }
 }
 
 
@@ -3799,25 +3948,6 @@ S_finalize_op(pTHX_ OP* o)
     } while (( o = traverse_op_tree(top, o)) != NULL);
 }
 
-/*
-=for apidoc op_lvalue
-
-Propagate lvalue ("modifiable") context to an op and its children.
-C<type> represents the context type, roughly based on the type of op that
-would do the modifying, although C<local()> is represented by C<OP_NULL>,
-because it has no op type of its own (it is signalled by a flag on
-the lvalue op).
-
-This function detects things that can't be modified, such as C<$x+1>, and
-generates errors for them.  For example, C<$x+1 = 2> would cause it to be
-called with an op of type C<OP_ADD> and a C<type> argument of C<OP_SASSIGN>.
-
-It also flags things that need to behave specially in an lvalue context,
-such as C<$$x = 5> which might have to vivify a reference in C<$x>.
-
-=cut
-*/
-
 static void
 S_mark_padname_lvalue(pTHX_ PADNAME *pn)
 {
@@ -3855,126 +3985,160 @@ S_vivifies(const OPCODE type)
     return 0;
 }
 
+
+/* apply lvalue reference (aliasing) context to the optree o.
+ * E.g. in
+ *     \($x,$y) = (...)
+ * o would be the list ($x,$y) and type would be OP_AASSIGN.
+ * It may descend and apply this to children too, for example in
+ * \( $cond ? $x, $y) = (...)
+ */
+
 static void
 S_lvref(pTHX_ OP *o, I32 type)
-{
-    dVAR;
-    OP *kid;
-    switch (o->op_type) {
-    case OP_COND_EXPR:
-       for (kid = OpSIBLING(cUNOPo->op_first); kid;
-            kid = OpSIBLING(kid))
-           S_lvref(aTHX_ kid, type);
-       /* FALLTHROUGH */
-    case OP_PUSHMARK:
-       return;
-    case OP_RV2AV:
-       if (cUNOPo->op_first->op_type != OP_GV) goto badref;
-       o->op_flags |= OPf_STACKED;
-       if (o->op_flags & OPf_PARENS) {
-           if (o->op_private & OPpLVAL_INTRO) {
-                yyerror(Perl_form(aTHX_ "Can't modify reference to "
-                     "localized parenthesized array in list assignment"));
-               return;
-           }
-         slurpy:
-            OpTYPE_set(o, OP_LVAVREF);
-           o->op_private &= OPpLVAL_INTRO|OPpPAD_STATE;
-           o->op_flags |= OPf_MOD|OPf_REF;
-           return;
-       }
-       o->op_private |= OPpLVREF_AV;
-       goto checkgv;
-    case OP_RV2CV:
-       kid = cUNOPo->op_first;
-       if (kid->op_type == OP_NULL)
-           kid = cUNOPx(OpSIBLING(kUNOP->op_first))
-               ->op_first;
-       o->op_private = OPpLVREF_CV;
-       if (kid->op_type == OP_GV)
-           o->op_flags |= OPf_STACKED;
-       else if (kid->op_type == OP_PADCV) {
-           o->op_targ = kid->op_targ;
-           kid->op_targ = 0;
-           op_free(cUNOPo->op_first);
-           cUNOPo->op_first = NULL;
-           o->op_flags &=~ OPf_KIDS;
-       }
-       else goto badref;
-       break;
-    case OP_RV2HV:
-       if (o->op_flags & OPf_PARENS) {
-         parenhash:
-           yyerror(Perl_form(aTHX_ "Can't modify reference to "
-                                "parenthesized hash in list assignment"));
-               return;
-       }
-       o->op_private |= OPpLVREF_HV;
-       /* FALLTHROUGH */
-    case OP_RV2SV:
-      checkgv:
-       if (cUNOPo->op_first->op_type != OP_GV) goto badref;
-       o->op_flags |= OPf_STACKED;
-       break;
-    case OP_PADHV:
-       if (o->op_flags & OPf_PARENS) goto parenhash;
-       o->op_private |= OPpLVREF_HV;
-       /* FALLTHROUGH */
-    case OP_PADSV:
-       PAD_COMPNAME_GEN_set(o->op_targ, PERL_INT_MAX);
-       break;
-    case OP_PADAV:
-       PAD_COMPNAME_GEN_set(o->op_targ, PERL_INT_MAX);
-       if (o->op_flags & OPf_PARENS) goto slurpy;
-       o->op_private |= OPpLVREF_AV;
-       break;
-    case OP_AELEM:
-    case OP_HELEM:
-       o->op_private |= OPpLVREF_ELEM;
-       o->op_flags   |= OPf_STACKED;
-       break;
-    case OP_ASLICE:
-    case OP_HSLICE:
-        OpTYPE_set(o, OP_LVREFSLICE);
-       o->op_private &= OPpLVAL_INTRO;
-       return;
-    case OP_NULL:
-       if (o->op_flags & OPf_SPECIAL)          /* do BLOCK */
-           goto badref;
-       else if (!(o->op_flags & OPf_KIDS))
-           return;
-       if (o->op_targ != OP_LIST) {
-           S_lvref(aTHX_ cBINOPo->op_first, type);
-           return;
-       }
-       /* FALLTHROUGH */
-    case OP_LIST:
-       for (kid = cLISTOPo->op_first; kid; kid = OpSIBLING(kid)) {
-           assert((kid->op_flags & OPf_WANT) != OPf_WANT_VOID);
-           S_lvref(aTHX_ kid, type);
-       }
-       return;
-    case OP_STUB:
-       if (o->op_flags & OPf_PARENS)
-           return;
-       /* FALLTHROUGH */
-    default:
-      badref:
-       /* diag_listed_as: Can't modify reference to %s in %s assignment */
-       yyerror(Perl_form(aTHX_ "Can't modify reference to %s in %s",
-                    o->op_type == OP_NULL && o->op_flags & OPf_SPECIAL
-                     ? "do block"
-                     : OP_DESC(o),
-                    PL_op_desc[type]));
-       return;
-    }
-    OpTYPE_set(o, OP_LVREF);
-    o->op_private &=
-       OPpLVAL_INTRO|OPpLVREF_ELEM|OPpLVREF_TYPE|OPpPAD_STATE;
-    if (type == OP_ENTERLOOP)
-       o->op_private |= OPpLVREF_ITER;
+{
+    dVAR;
+    OP *kid;
+    OP * top_op = o;
+
+    while (1) {
+        switch (o->op_type) {
+        case OP_COND_EXPR:
+            o = OpSIBLING(cUNOPo->op_first);
+            continue;
+
+        case OP_PUSHMARK:
+            goto do_next;
+
+        case OP_RV2AV:
+            if (cUNOPo->op_first->op_type != OP_GV) goto badref;
+            o->op_flags |= OPf_STACKED;
+            if (o->op_flags & OPf_PARENS) {
+                if (o->op_private & OPpLVAL_INTRO) {
+                     yyerror(Perl_form(aTHX_ "Can't modify reference to "
+                          "localized parenthesized array in list assignment"));
+                    goto do_next;
+                }
+              slurpy:
+                OpTYPE_set(o, OP_LVAVREF);
+                o->op_private &= OPpLVAL_INTRO|OPpPAD_STATE;
+                o->op_flags |= OPf_MOD|OPf_REF;
+                goto do_next;
+            }
+            o->op_private |= OPpLVREF_AV;
+            goto checkgv;
+
+        case OP_RV2CV:
+            kid = cUNOPo->op_first;
+            if (kid->op_type == OP_NULL)
+                kid = cUNOPx(OpSIBLING(kUNOP->op_first))
+                    ->op_first;
+            o->op_private = OPpLVREF_CV;
+            if (kid->op_type == OP_GV)
+                o->op_flags |= OPf_STACKED;
+            else if (kid->op_type == OP_PADCV) {
+                o->op_targ = kid->op_targ;
+                kid->op_targ = 0;
+                op_free(cUNOPo->op_first);
+                cUNOPo->op_first = NULL;
+                o->op_flags &=~ OPf_KIDS;
+            }
+            else goto badref;
+            break;
+
+        case OP_RV2HV:
+            if (o->op_flags & OPf_PARENS) {
+              parenhash:
+                yyerror(Perl_form(aTHX_ "Can't modify reference to "
+                                     "parenthesized hash in list assignment"));
+                    goto do_next;
+            }
+            o->op_private |= OPpLVREF_HV;
+            /* FALLTHROUGH */
+        case OP_RV2SV:
+          checkgv:
+            if (cUNOPo->op_first->op_type != OP_GV) goto badref;
+            o->op_flags |= OPf_STACKED;
+            break;
+
+        case OP_PADHV:
+            if (o->op_flags & OPf_PARENS) goto parenhash;
+            o->op_private |= OPpLVREF_HV;
+            /* FALLTHROUGH */
+        case OP_PADSV:
+            PAD_COMPNAME_GEN_set(o->op_targ, PERL_INT_MAX);
+            break;
+
+        case OP_PADAV:
+            PAD_COMPNAME_GEN_set(o->op_targ, PERL_INT_MAX);
+            if (o->op_flags & OPf_PARENS) goto slurpy;
+            o->op_private |= OPpLVREF_AV;
+            break;
+
+        case OP_AELEM:
+        case OP_HELEM:
+            o->op_private |= OPpLVREF_ELEM;
+            o->op_flags   |= OPf_STACKED;
+            break;
+
+        case OP_ASLICE:
+        case OP_HSLICE:
+            OpTYPE_set(o, OP_LVREFSLICE);
+            o->op_private &= OPpLVAL_INTRO;
+            goto do_next;
+
+        case OP_NULL:
+            if (o->op_flags & OPf_SPECIAL)             /* do BLOCK */
+                goto badref;
+            else if (!(o->op_flags & OPf_KIDS))
+                goto do_next;
+
+            /* the code formerly only recursed into the first child of
+             * a non ex-list OP_NULL. if we ever encounter such a null op with
+             * more than one child, need to decide whether its ok to process
+             * *all* its kids or not */
+            assert(o->op_targ == OP_LIST
+                    || !(OpHAS_SIBLING(cBINOPo->op_first)));
+            /* FALLTHROUGH */
+        case OP_LIST:
+            o = cLISTOPo->op_first;
+            continue;
+
+        case OP_STUB:
+            if (o->op_flags & OPf_PARENS)
+                goto do_next;
+            /* FALLTHROUGH */
+        default:
+          badref:
+            /* diag_listed_as: Can't modify reference to %s in %s assignment */
+            yyerror(Perl_form(aTHX_ "Can't modify reference to %s in %s",
+                         o->op_type == OP_NULL && o->op_flags & OPf_SPECIAL
+                          ? "do block"
+                          : OP_DESC(o),
+                         PL_op_desc[type]));
+            goto do_next;
+        }
+
+        OpTYPE_set(o, OP_LVREF);
+        o->op_private &=
+            OPpLVAL_INTRO|OPpLVREF_ELEM|OPpLVREF_TYPE|OPpPAD_STATE;
+        if (type == OP_ENTERLOOP)
+            o->op_private |= OPpLVREF_ITER;
+
+      do_next:
+        while (1) {
+            if (o == top_op)
+                return; /* at top; no parents/siblings to try */
+            if (OpHAS_SIBLING(o)) {
+                o = o->op_sibparent;
+                break;
+            }
+            o = o->op_sibparent; /*try parent's next sibling */
+        }
+    } /* while */
 }
 
+
 PERL_STATIC_INLINE bool
 S_potential_mod_type(I32 type)
 {
@@ -3983,35 +4147,69 @@ S_potential_mod_type(I32 type)
        || type == OP_REFGEN    || type == OP_LEAVESUBLV;
 }
 
+
+/*
+=for apidoc op_lvalue
+
+Propagate lvalue ("modifiable") context to an op and its children.
+C<type> represents the context type, roughly based on the type of op that
+would do the modifying, although C<local()> is represented by C<OP_NULL>,
+because it has no op type of its own (it is signalled by a flag on
+the lvalue op).
+
+This function detects things that can't be modified, such as C<$x+1>, and
+generates errors for them.  For example, C<$x+1 = 2> would cause it to be
+called with an op of type C<OP_ADD> and a C<type> argument of C<OP_SASSIGN>.
+
+It also flags things that need to behave specially in an lvalue context,
+such as C<$$x = 5> which might have to vivify a reference in C<$x>.
+
+=cut
+
+Perl_op_lvalue_flags() is a non-API lower-level interface to
+op_lvalue().  The flags param has these bits:
+    OP_LVALUE_NO_CROAK:  return rather than croaking on error
+
+*/
+
 OP *
 Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
 {
     dVAR;
-    OP *kid;
-    /* -1 = error on localize, 0 = ignore localize, 1 = ok to localize */
-    int localize = -1;
+    OP *top_op = o;
 
     if (!o || (PL_parser && PL_parser->error_count))
        return o;
 
+    while (1) {
+    OP *kid;
+    /* -1 = error on localize, 0 = ignore localize, 1 = ok to localize */
+    int localize = -1;
+    OP *next_kid = NULL;
+
     if ((o->op_private & OPpTARGET_MY)
        && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
     {
-       return o;
+       goto do_next;
     }
 
-    assert( (o->op_flags & OPf_WANT) != OPf_WANT_VOID );
+    /* elements of a list might be in void context because the list is
+       in scalar context or because they are attribute sub calls */
+    if ((o->op_flags & OPf_WANT) == OPf_WANT_VOID)
+        goto do_next;
 
     if (type == OP_PRTF || type == OP_SPRINTF) type = OP_ENTERSUB;
 
     switch (o->op_type) {
     case OP_UNDEF:
        PL_modcount++;
-       return o;
+       goto do_next;
+
     case OP_STUB:
        if ((o->op_flags & OPf_PARENS))
            break;
        goto nomod;
+
     case OP_ENTERSUB:
        if ((type == OP_UNDEF || type == OP_REFGEN || type == OP_LOCK) &&
            !(o->op_flags & OPf_STACKED)) {
@@ -4077,7 +4275,7 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
                                      "subroutine call of &%" SVf " in %s",
                                      SVfARG(namesv), PL_op_desc[type]),
                            SvUTF8(namesv));
-                return o;
+                goto do_next;
            }
        }
        /* FALLTHROUGH */
@@ -4092,7 +4290,7 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
                      ? "do block"
                      : OP_DESC(o)),
                     type ? PL_op_desc[type] : "local"));
-       return o;
+       goto do_next;
 
     case OP_PREINC:
     case OP_PREDEC:
@@ -4127,6 +4325,12 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
            goto nomod;
        else {
            const I32 mods = PL_modcount;
+            /* we recurse rather than iterate here because we need to
+             * calculate and use the delta applied to PL_modcount by the
+             * first child. So in something like
+             *     ($x, ($y) x 3) = split;
+             * split knows that 4 elements are wanted
+             */
            modkids(cBINOPo->op_first, type);
            if (type != OP_AASSIGN)
                goto nomod;
@@ -4144,8 +4348,7 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
 
     case OP_COND_EXPR:
        localize = 1;
-       for (kid = OpSIBLING(cUNOPo->op_first); kid; kid = OpSIBLING(kid))
-           op_lvalue(kid, type);
+        next_kid = OpSIBLING(cUNOPo->op_first);
        break;
 
     case OP_RV2AV:
@@ -4155,7 +4358,7 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
            /* Treat \(@foo) like ordinary list, but still mark it as modi-
               fiable since some contexts need to know.  */
            o->op_flags |= OPf_MOD;
-           return o;
+           goto do_next;
        }
        /* FALLTHROUGH */
     case OP_RV2GV:
@@ -4179,23 +4382,27 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
     case OP_DBSTATE:
        PL_modcount = RETURN_UNLIMITED_NUMBER;
        break;
+
     case OP_KVHSLICE:
     case OP_KVASLICE:
     case OP_AKEYS:
        if (type == OP_LEAVESUBLV)
            o->op_private |= OPpMAYBE_LVSUB;
         goto nomod;
+
     case OP_AVHVSWITCH:
        if (type == OP_LEAVESUBLV
         && (o->op_private & OPpAVHVSWITCH_MASK) + OP_EACH == OP_KEYS)
            o->op_private |= OPpMAYBE_LVSUB;
         goto nomod;
+
     case OP_AV2ARYLEN:
        PL_hints |= HINT_BLOCK_SCOPE;
        if (type == OP_LEAVESUBLV)
            o->op_private |= OPpMAYBE_LVSUB;
        PL_modcount++;
        break;
+
     case OP_RV2SV:
        ref(cUNOPo->op_first, o->op_type);
        localize = 1;
@@ -4224,7 +4431,7 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
            /* Treat \(@foo) like ordinary list, but still mark it as modi-
               fiable since some contexts need to know.  */
            o->op_flags |= OPf_MOD;
-           return o;
+           goto do_next;
        }
        if (scalar_mod_type(o, type))
            goto nomod;
@@ -4261,6 +4468,9 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
        if (type == OP_LEAVESUBLV)
            o->op_private |= OPpMAYBE_LVSUB;
        if (o->op_flags & OPf_KIDS && OpHAS_SIBLING(cBINOPo->op_first)) {
+            /* we recurse rather than iterate here because the child
+             * needs to be processed with a different 'type' parameter */
+
            /* substr and vec */
            /* If this op is in merely potential (non-fatal) modifiable
               context, then apply OP_ENTERSUB context to
@@ -4295,7 +4505,7 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
     case OP_LINESEQ:
        localize = 0;
        if (o->op_flags & OPf_KIDS)
-           op_lvalue(cLISTOPo->op_last, type);
+           next_kid = cLISTOPo->op_last;
        break;
 
     case OP_NULL:
@@ -4328,30 +4538,31 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
                 /* this should trigger a "Can't modify transliteration" err */
                 op_lvalue(sib, type);
             }
-            op_lvalue(cBINOPo->op_first, type);
+            next_kid = cBINOPo->op_first;
+            /* we assume OP_NULLs which aren't ex-list have no more than 2
+             * children. If this assumption is wrong, increase the scan
+             * limit below */
+            assert(   !OpHAS_SIBLING(next_kid)
+                   || !OpHAS_SIBLING(OpSIBLING(next_kid)));
             break;
        }
        /* FALLTHROUGH */
     case OP_LIST:
        localize = 0;
-       for (kid = cLISTOPo->op_first; kid; kid = OpSIBLING(kid))
-           /* elements might be in void context because the list is
-              in scalar context or because they are attribute sub calls */
-           if ( (kid->op_flags & OPf_WANT) != OPf_WANT_VOID )
-               op_lvalue(kid, type);
+       next_kid = cLISTOPo->op_first;
        break;
 
     case OP_COREARGS:
-       return o;
+       goto do_next;
 
     case OP_AND:
     case OP_OR:
        if (type == OP_LEAVESUBLV
         || !S_vivifies(cLOGOPo->op_first->op_type))
-           op_lvalue(cLOGOPo->op_first, type);
-       if (type == OP_LEAVESUBLV
+           next_kid = cLOGOPo->op_first;
+       else if (type == OP_LEAVESUBLV
         || !S_vivifies(OpSIBLING(cLOGOPo->op_first)->op_type))
-           op_lvalue(OpSIBLING(cLOGOPo->op_first), type);
+           next_kid = OpSIBLING(cLOGOPo->op_first);
        goto nomod;
 
     case OP_SREFGEN:
@@ -4363,8 +4574,8 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
            Perl_ck_warner_d(aTHX_
                     packWARN(WARN_EXPERIMENTAL__DECLARED_REFS),
                    "Declaring references is experimental");
-           op_lvalue(cUNOPo->op_first, OP_NULL);
-           return o;
+           next_kid = cUNOPo->op_first;
+           goto do_next;
        }
        if (type != OP_AASSIGN && type != OP_SASSIGN
         && type != OP_ENTERLOOP)
@@ -4394,7 +4605,7 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
        if (o->op_type == OP_REFGEN)
            op_null(cUNOPx(cUNOPo->op_first)->op_first); /* pushmark */
        op_null(o);
-       return o;
+       goto do_next;
 
     case OP_SPLIT:
         if ((o->op_private & OPpSPLIT_ASSIGN)) {
@@ -4413,7 +4624,7 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
        their argument is a filehandle; thus \stat(".") should not set
        it. AMS 20011102 */
     if (type == OP_REFGEN && OP_IS_STAT(o->op_type))
-        return o;
+        goto do_next;
 
     if (type != OP_LEAVESUBLV)
         o->op_flags |= OPf_MOD;
@@ -4438,9 +4649,40 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
     else if (type != OP_GREPSTART && type != OP_ENTERSUB
              && type != OP_LEAVESUBLV && o->op_type != OP_ENTERSUB)
        o->op_flags |= OPf_REF;
-    return o;
+
+  do_next:
+    while (!next_kid) {
+        if (o == top_op)
+            return top_op; /* at top; no parents/siblings to try */
+        if (OpHAS_SIBLING(o)) {
+            next_kid = o->op_sibparent;
+            if (!OpHAS_SIBLING(next_kid)) {
+                /* a few node types don't recurse into their second child */
+                OP *parent = next_kid->op_sibparent;
+                I32 ptype  = parent->op_type;
+                if (   (ptype == OP_NULL && parent->op_targ != OP_LIST)
+                    || (   (ptype == OP_AND || ptype == OP_OR)
+                        && (type != OP_LEAVESUBLV 
+                            && S_vivifies(next_kid->op_type))
+                       )
+                )  {
+                    /*try parent's next sibling */
+                    o = parent;
+                    next_kid =  NULL;
+                }
+            }
+        }
+        else
+            o = o->op_sibparent; /*try parent's next sibling */
+
+    }
+    o = next_kid;
+
+    } /* while */
+
 }
 
+
 STATIC bool
 S_scalar_mod_type(const OP *o, I32 type)
 {
@@ -4535,104 +4777,143 @@ S_refkids(pTHX_ OP *o, I32 type)
     return o;
 }
 
+
+/* Apply reference (autovivification) context to the subtree at o.
+ * For example in
+ *     push @{expression}, ....;
+ * o will be the head of 'expression' and type will be OP_RV2AV.
+ * It marks the op o (or a suitable child) as autovivifying, e.g. by
+ * setting  OPf_MOD.
+ * For OP_RV2AV/OP_PADAV and OP_RV2HV/OP_PADHV sets OPf_REF too if
+ * set_op_ref is true.
+ *
+ * Also calls scalar(o).
+ */
+
 OP *
 Perl_doref(pTHX_ OP *o, I32 type, bool set_op_ref)
 {
     dVAR;
-    OP *kid;
+    OP * top_op = o;
 
     PERL_ARGS_ASSERT_DOREF;
 
     if (PL_parser && PL_parser->error_count)
        return o;
 
-    switch (o->op_type) {
-    case OP_ENTERSUB:
-       if ((type == OP_EXISTS || type == OP_DEFINED) &&
-           !(o->op_flags & OPf_STACKED)) {
-            OpTYPE_set(o, OP_RV2CV);             /* entersub => rv2cv */
-           assert(cUNOPo->op_first->op_type == OP_NULL);
-           op_null(((LISTOP*)cUNOPo->op_first)->op_first);     /* disable pushmark */
-           o->op_flags |= OPf_SPECIAL;
-       }
-       else if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV){
-           o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV
-                             : type == OP_RV2HV ? OPpDEREF_HV
-                             : OPpDEREF_SV);
-           o->op_flags |= OPf_MOD;
-       }
+    while (1) {
+        switch (o->op_type) {
+        case OP_ENTERSUB:
+            if ((type == OP_EXISTS || type == OP_DEFINED) &&
+                !(o->op_flags & OPf_STACKED)) {
+                OpTYPE_set(o, OP_RV2CV);             /* entersub => rv2cv */
+                assert(cUNOPo->op_first->op_type == OP_NULL);
+                /* disable pushmark */
+                op_null(((LISTOP*)cUNOPo->op_first)->op_first);
+                o->op_flags |= OPf_SPECIAL;
+            }
+            else if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV){
+                o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV
+                                  : type == OP_RV2HV ? OPpDEREF_HV
+                                  : OPpDEREF_SV);
+                o->op_flags |= OPf_MOD;
+            }
 
-       break;
+            break;
 
-    case OP_COND_EXPR:
-       for (kid = OpSIBLING(cUNOPo->op_first); kid; kid = OpSIBLING(kid))
-           doref(kid, type, set_op_ref);
-       break;
-    case OP_RV2SV:
-       if (type == OP_DEFINED)
-           o->op_flags |= OPf_SPECIAL;         /* don't create GV */
-       doref(cUNOPo->op_first, o->op_type, set_op_ref);
-       /* FALLTHROUGH */
-    case OP_PADSV:
-       if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV) {
-           o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV
-                             : type == OP_RV2HV ? OPpDEREF_HV
-                             : OPpDEREF_SV);
-           o->op_flags |= OPf_MOD;
-       }
-       break;
+        case OP_COND_EXPR:
+            o = OpSIBLING(cUNOPo->op_first);
+            continue;
 
-    case OP_RV2AV:
-    case OP_RV2HV:
-       if (set_op_ref)
-           o->op_flags |= OPf_REF;
-       /* FALLTHROUGH */
-    case OP_RV2GV:
-       if (type == OP_DEFINED)
-           o->op_flags |= OPf_SPECIAL;         /* don't create GV */
-       doref(cUNOPo->op_first, o->op_type, set_op_ref);
-       break;
+        case OP_RV2SV:
+            if (type == OP_DEFINED)
+                o->op_flags |= OPf_SPECIAL;            /* don't create GV */
+            /* FALLTHROUGH */
+        case OP_PADSV:
+            if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV) {
+                o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV
+                                  : type == OP_RV2HV ? OPpDEREF_HV
+                                  : OPpDEREF_SV);
+                o->op_flags |= OPf_MOD;
+            }
+            if (o->op_flags & OPf_KIDS) {
+                type = o->op_type;
+                o = cUNOPo->op_first;
+                continue;
+            }
+            break;
 
-    case OP_PADAV:
-    case OP_PADHV:
-       if (set_op_ref)
-           o->op_flags |= OPf_REF;
-       break;
+        case OP_RV2AV:
+        case OP_RV2HV:
+            if (set_op_ref)
+                o->op_flags |= OPf_REF;
+            /* FALLTHROUGH */
+        case OP_RV2GV:
+            if (type == OP_DEFINED)
+                o->op_flags |= OPf_SPECIAL;            /* don't create GV */
+            type = o->op_type;
+            o = cUNOPo->op_first;
+            continue;
 
-    case OP_SCALAR:
-    case OP_NULL:
-       if (!(o->op_flags & OPf_KIDS) || type == OP_DEFINED)
-           break;
-       doref(cBINOPo->op_first, type, set_op_ref);
-       break;
-    case OP_AELEM:
-    case OP_HELEM:
-       doref(cBINOPo->op_first, o->op_type, set_op_ref);
-       if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV) {
-           o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV
-                             : type == OP_RV2HV ? OPpDEREF_HV
-                             : OPpDEREF_SV);
-           o->op_flags |= OPf_MOD;
-       }
-       break;
+        case OP_PADAV:
+        case OP_PADHV:
+            if (set_op_ref)
+                o->op_flags |= OPf_REF;
+            break;
 
-    case OP_SCOPE:
-    case OP_LEAVE:
-       set_op_ref = FALSE;
-       /* FALLTHROUGH */
-    case OP_ENTER:
-    case OP_LIST:
-       if (!(o->op_flags & OPf_KIDS))
-           break;
-       doref(cLISTOPo->op_last, type, set_op_ref);
-       break;
-    default:
-       break;
-    }
-    return scalar(o);
+        case OP_SCALAR:
+        case OP_NULL:
+            if (!(o->op_flags & OPf_KIDS) || type == OP_DEFINED)
+                break;
+             o = cBINOPo->op_first;
+            continue;
 
+        case OP_AELEM:
+        case OP_HELEM:
+            if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV) {
+                o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV
+                                  : type == OP_RV2HV ? OPpDEREF_HV
+                                  : OPpDEREF_SV);
+                o->op_flags |= OPf_MOD;
+            }
+            type = o->op_type;
+            o = cBINOPo->op_first;
+            continue;;
+
+        case OP_SCOPE:
+        case OP_LEAVE:
+            set_op_ref = FALSE;
+            /* FALLTHROUGH */
+        case OP_ENTER:
+        case OP_LIST:
+            if (!(o->op_flags & OPf_KIDS))
+                break;
+            o = cLISTOPo->op_last;
+            continue;
+
+        default:
+            break;
+        } /* switch */
+
+        while (1) {
+            if (o == top_op)
+                return scalar(top_op); /* at top; no parents/siblings to try */
+            if (OpHAS_SIBLING(o)) {
+                o = o->op_sibparent;
+                /* Normally skip all siblings and go straight to the parent;
+                 * the only op that requires two children to be processed
+                 * is OP_COND_EXPR */
+                if (!OpHAS_SIBLING(o)
+                        && o->op_sibparent->op_type == OP_COND_EXPR)
+                    break;
+                continue;
+            }
+            o = o->op_sibparent; /*try parent's next sibling */
+        }
+    } /* while */
 }
 
+
 STATIC OP *
 S_dup_attrlist(pTHX_ OP *o)
 {
@@ -5744,7 +6025,11 @@ S_fold_constants(pTHX_ OP *const o)
     return o;
 }
 
-static OP *
+/* convert a constant range in list context into an OP_RV2AV, OP_CONST pair;
+ * the constant value being an AV holding the flattened range.
+ */
+
+static void
 S_gen_constant_list(pTHX_ OP *o)
 {
     dVAR;
@@ -5763,7 +6048,7 @@ S_gen_constant_list(pTHX_ OP *o)
 
     list(o);
     if (PL_parser && PL_parser->error_count)
-       return o;               /* Don't attempt to run with errors */
+       return;         /* Don't attempt to run with errors */
 
     curop = LINKLIST(o);
     old_next = o->op_next;
@@ -5830,7 +6115,7 @@ S_gen_constant_list(pTHX_ OP *o)
         delete_eval_scope();
     }
     if (ret)
-       return o;
+       return;
 
     OpTYPE_set(o, OP_RV2AV);
     o->op_flags &= ~OPf_REF;   /* treat \(1..2) like an ordinary list */
@@ -5850,7 +6135,8 @@ S_gen_constant_list(pTHX_ OP *o)
            SvREADONLY_on(*svp);
        }
     LINKLIST(o);
-    return list(o);
+    list(o);
+    return;
 }
 
 /*
@@ -7806,9 +8092,16 @@ Perl_newSLICEOP(pTHX_ I32 flags, OP *subscript, OP *listval)
            list(force_list(listval,   1)) );
 }
 
+#define ASSIGN_SCALAR 0
 #define ASSIGN_LIST   1
 #define ASSIGN_REF    2
 
+/* given the optree o on the LHS of an assignment, determine whether its:
+ *  ASSIGN_SCALAR   $x  = ...
+ *  ASSIGN_LIST    ($x) = ...
+ *  ASSIGN_REF     \$x  = ...
+ */
+
 STATIC I32
 S_assignment_type(pTHX_ const OP *o)
 {
@@ -7817,7 +8110,7 @@ S_assignment_type(pTHX_ const OP *o)
     U8 ret;
 
     if (!o)
-       return TRUE;
+       return ASSIGN_LIST;
 
     if (o->op_type == OP_SREFGEN)
     {
@@ -7834,7 +8127,7 @@ S_assignment_type(pTHX_ const OP *o)
            o = cUNOPo->op_first;
        flags = o->op_flags;
        type = o->op_type;
-       ret = 0;
+       ret = ASSIGN_SCALAR;
     }
 
     if (type == OP_COND_EXPR) {
@@ -7846,7 +8139,7 @@ S_assignment_type(pTHX_ const OP *o)
            return ASSIGN_LIST;
        if ((t == ASSIGN_LIST) ^ (f == ASSIGN_LIST))
            yyerror("Assignment to both a list and a scalar");
-       return FALSE;
+       return ASSIGN_SCALAR;
     }
 
     if (type == OP_LIST &&
@@ -7858,10 +8151,10 @@ S_assignment_type(pTHX_ const OP *o)
        type == OP_RV2AV || type == OP_RV2HV ||
        type == OP_ASLICE || type == OP_HSLICE ||
         type == OP_KVASLICE || type == OP_KVHSLICE || type == OP_REFGEN)
-       return TRUE;
+       return ASSIGN_LIST;
 
     if (type == OP_PADAV || type == OP_PADHV)
-       return TRUE;
+       return ASSIGN_LIST;
 
     if (type == OP_RV2SV)
        return ret;
@@ -8228,17 +8521,26 @@ Perl_newLOGOP(pTHX_ I32 type, I32 flags, OP *first, OP *other)
     return new_logop(type, flags, &first, &other);
 }
 
+
+/* See if the optree o contains a single OP_CONST (plus possibly
+ * surrounding enter/nextstate/null etc). If so, return it, else return
+ * NULL.
+ */
+
 STATIC OP *
 S_search_const(pTHX_ OP *o)
 {
     PERL_ARGS_ASSERT_SEARCH_CONST;
 
+  redo:
     switch (o->op_type) {
        case OP_CONST:
            return o;
        case OP_NULL:
-           if (o->op_flags & OPf_KIDS)
-               return search_const(cUNOPo->op_first);
+           if (o->op_flags & OPf_KIDS) {
+               o = cUNOPo->op_first;
+                goto redo;
+            }
            break;
        case OP_LEAVE:
        case OP_SCOPE:
@@ -8248,6 +8550,7 @@ S_search_const(pTHX_ OP *o)
            if (!(o->op_flags & OPf_KIDS))
                return NULL;
            kid = cLISTOPo->op_first;
+
            do {
                switch (kid->op_type) {
                    case OP_ENTER:
@@ -8261,16 +8564,19 @@ S_search_const(pTHX_ OP *o)
                        goto last;
                }
            } while (kid);
+
            if (!kid)
                kid = cLISTOPo->op_last;
           last:
-           return search_const(kid);
+            o = kid;
+             goto redo;
        }
     }
 
     return NULL;
 }
 
+
 STATIC OP *
 S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp)
 {
@@ -9120,7 +9426,10 @@ S_newGIVWHENOP(pTHX_ OP *cond, OP *block,
     return o;
 }
 
-/* Does this look like a boolean operation? For these purposes
+
+/* For the purposes of 'when(implied_smartmatch)'
+ *              versus 'when(boolean_expression)',
+ * does this look like a boolean operation? For these purposes
    a boolean operation is:
      - a subroutine call [*]
      - a logical connective
@@ -9208,6 +9517,7 @@ S_looks_like_bool(pTHX_ const OP *o)
     }
 }
 
+
 /*
 =for apidoc newGIVENOP
 
@@ -14296,7 +14606,6 @@ S_aassign_padcheck(pTHX_ OP* o, bool rhs)
   'rhs' indicates whether we're scanning the LHS or RHS. If the former, we
   set PL_generation on lexical vars; if the latter, we see if
   PL_generation matches.
-  'top' indicates whether we're recursing or at the top level.
   'scalars_p' is a pointer to a counter of the number of scalar SVs seen.
   This fn will increment it by the number seen. It's not intended to
   be an accurate count (especially as many ops can push a variable
@@ -14305,10 +14614,16 @@ S_aassign_padcheck(pTHX_ OP* o, bool rhs)
 */
 
 static int
-S_aassign_scan(pTHX_ OP* o, bool rhs, bool top, int *scalars_p)
+S_aassign_scan(pTHX_ OP* o, bool rhs, int *scalars_p)
 {
+    OP *top_op           = o;
+    OP *effective_top_op = o;
+    int all_flags = 0;
+
+    while (1) {
+    bool top = o == effective_top_op;
     int flags = 0;
-    bool kid_top = FALSE;
+    OP* next_kid = NULL;
 
     /* first, look for a solitary @_ on the RHS */
     if (   rhs
@@ -14329,50 +14644,58 @@ S_aassign_scan(pTHX_ OP* o, bool rhs, bool top, int *scalars_p)
             && kid->op_type == OP_GV
             && cGVOPx_gv(kid) == PL_defgv
         )
-            flags |= AAS_DEFAV;
+            flags = AAS_DEFAV;
     }
 
     switch (o->op_type) {
     case OP_GVSV:
         (*scalars_p)++;
-        return AAS_PKG_SCALAR;
+        all_flags |= AAS_PKG_SCALAR;
+        goto do_next;
 
     case OP_PADAV:
     case OP_PADHV:
         (*scalars_p) += 2;
         /* if !top, could be e.g. @a[0,1] */
-        if (top && (o->op_flags & OPf_REF))
-            return (o->op_private & OPpLVAL_INTRO)
-                ? AAS_MY_AGG : AAS_LEX_AGG;
-        return AAS_DANGEROUS;
+        all_flags |=  (top && (o->op_flags & OPf_REF))
+                        ? ((o->op_private & OPpLVAL_INTRO)
+                            ? AAS_MY_AGG : AAS_LEX_AGG)
+                        : AAS_DANGEROUS;
+        goto do_next;
 
     case OP_PADSV:
         {
             int comm = S_aassign_padcheck(aTHX_ o, rhs)
                         ?  AAS_LEX_SCALAR_COMM : 0;
             (*scalars_p)++;
-            return (o->op_private & OPpLVAL_INTRO)
+            all_flags |= (o->op_private & OPpLVAL_INTRO)
                 ? (AAS_MY_SCALAR|comm) : (AAS_LEX_SCALAR|comm);
+            goto do_next;
+
         }
 
     case OP_RV2AV:
     case OP_RV2HV:
         (*scalars_p) += 2;
         if (cUNOPx(o)->op_first->op_type != OP_GV)
-            return AAS_DANGEROUS; /* @{expr}, %{expr} */
+            all_flags |= AAS_DANGEROUS; /* @{expr}, %{expr} */
         /* @pkg, %pkg */
         /* if !top, could be e.g. @a[0,1] */
-        if (top && (o->op_flags & OPf_REF))
-            return AAS_PKG_AGG;
-        return AAS_DANGEROUS;
+        else if (top && (o->op_flags & OPf_REF))
+            all_flags |= AAS_PKG_AGG;
+        else
+            all_flags |= AAS_DANGEROUS;
+        goto do_next;
 
     case OP_RV2SV:
         (*scalars_p)++;
         if (cUNOPx(o)->op_first->op_type != OP_GV) {
             (*scalars_p) += 2;
-            return AAS_DANGEROUS; /* ${expr} */
+            all_flags |= AAS_DANGEROUS; /* ${expr} */
         }
-        return AAS_PKG_SCALAR; /* $pkg */
+        else
+            all_flags |= AAS_PKG_SCALAR; /* $pkg */
+        goto do_next;
 
     case OP_SPLIT:
         if (o->op_private & OPpSPLIT_ASSIGN) {
@@ -14384,23 +14707,25 @@ S_aassign_scan(pTHX_ OP* o, bool rhs, bool top, int *scalars_p)
              *    ... = @a;
              */
 
-            if (o->op_flags & OPf_STACKED)
+            if (o->op_flags & OPf_STACKED) {
                 /* @{expr} = split() - the array expression is tacked
                  * on as an extra child to split - process kid */
-                return S_aassign_scan(aTHX_ cLISTOPo->op_last, rhs,
-                                        top, scalars_p);
+                next_kid = cLISTOPo->op_last;
+                goto do_next;
+            }
 
             /* ... else array is directly attached to split op */
             (*scalars_p) += 2;
-            if (PL_op->op_private & OPpSPLIT_LEX)
-                return (o->op_private & OPpLVAL_INTRO)
-                    ? AAS_MY_AGG : AAS_LEX_AGG;
-            else
-                return AAS_PKG_AGG;
+            all_flags |= (PL_op->op_private & OPpSPLIT_LEX)
+                            ? ((o->op_private & OPpLVAL_INTRO)
+                                ? AAS_MY_AGG : AAS_LEX_AGG)
+                            : AAS_PKG_AGG;
+            goto do_next;
         }
         (*scalars_p)++;
         /* other args of split can't be returned */
-        return AAS_SAFE_SCALAR;
+        all_flags |= AAS_SAFE_SCALAR;
+        goto do_next;
 
     case OP_UNDEF:
         /* undef counts as a scalar on the RHS:
@@ -14417,16 +14742,14 @@ S_aassign_scan(pTHX_ OP* o, bool rhs, bool top, int *scalars_p)
         /* these are all no-ops; they don't push a potentially common SV
          * onto the stack, so they are neither AAS_DANGEROUS nor
          * AAS_SAFE_SCALAR */
-        return 0;
+        goto do_next;
 
     case OP_PADRANGE: /* Ignore padrange; checking its siblings is enough */
         break;
 
     case OP_NULL:
     case OP_LIST:
-        /* these do nothing but may have children; but their children
-         * should also be treated as top-level */
-        kid_top = top;
+        /* these do nothing, but may have children */
         break;
 
     default:
@@ -14440,8 +14763,9 @@ S_aassign_scan(pTHX_ OP* o, bool rhs, bool top, int *scalars_p)
             && (o->op_private & OPpTARGET_MY))
         {
             (*scalars_p)++;
-            return S_aassign_padcheck(aTHX_ o, rhs)
-                ? AAS_LEX_SCALAR_COMM : AAS_LEX_SCALAR;
+            all_flags |= S_aassign_padcheck(aTHX_ o, rhs)
+                            ? AAS_LEX_SCALAR_COMM : AAS_LEX_SCALAR;
+            goto do_next;
         }
 
         /* if its an unrecognised, non-dangerous op, assume that it
@@ -14451,17 +14775,46 @@ S_aassign_scan(pTHX_ OP* o, bool rhs, bool top, int *scalars_p)
         break;
     }
 
-    /* XXX this assumes that all other ops are "transparent" - i.e. that
+    all_flags |= flags;
+
+    /* by default, process all kids next
+     * XXX this assumes that all other ops are "transparent" - i.e. that
      * they can return some of their children. While this true for e.g.
      * sort and grep, it's not true for e.g. map. We really need a
      * 'transparent' flag added to regen/opcodes
      */
     if (o->op_flags & OPf_KIDS) {
-        OP *kid;
-        for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid))
-            flags |= S_aassign_scan(aTHX_ kid, rhs, kid_top, scalars_p);
+        next_kid = cUNOPo->op_first;
+        /* these ops do nothing but may have children; but their
+         * children should also be treated as top-level */
+        if (   o == effective_top_op
+            && (o->op_type == OP_NULL || o->op_type == OP_LIST)
+        )
+            effective_top_op = next_kid;
+    }
+
+
+    /* If next_kid is set, someone in the code above wanted us to process
+     * that kid and all its remaining siblings.  Otherwise, work our way
+     * back up the tree */
+  do_next:
+    while (!next_kid) {
+        if (o == top_op)
+            return all_flags; /* at top; no parents/siblings to try */
+        if (OpHAS_SIBLING(o)) {
+            next_kid = o->op_sibparent;
+            if (o == effective_top_op)
+                effective_top_op = next_kid;
+        }
+        else
+            if (o == effective_top_op)
+                effective_top_op = o->op_sibparent;
+            o = o->op_sibparent; /* try parent's next sibling */
+
     }
-    return flags;
+    o = next_kid;
+    } /* while */
+
 }
 
 
@@ -16524,10 +16877,10 @@ Perl_rpeep(pTHX_ OP *o)
             PL_generation++;
             /* scan LHS */
             lscalars = 0;
-            l = S_aassign_scan(aTHX_ cLISTOPo->op_last,  FALSE, 1, &lscalars);
+            l = S_aassign_scan(aTHX_ cLISTOPo->op_last,  FALSE, &lscalars);
             /* scan RHS */
             rscalars = 0;
-            r = S_aassign_scan(aTHX_ cLISTOPo->op_first, TRUE, 1, &rscalars);
+            r = S_aassign_scan(aTHX_ cLISTOPo->op_first, TRUE, &rscalars);
             lr = (l|r);
 
 
diff --git a/pad.c b/pad.c
index 7d54172..c0098be 100644 (file)
--- a/pad.c
+++ b/pad.c
@@ -121,12 +121,12 @@ to be generated in evals, such as
 For state vars, C<SVs_PADSTALE> is overloaded to mean 'not yet initialised',
 but this internal state is stored in a separate pad entry.
 
-=for apidoc AmxU|PADNAMELIST *|PL_comppad_name
+=for apidoc AmnxU|PADNAMELIST *|PL_comppad_name
 
 During compilation, this points to the array containing the names part
 of the pad for the currently-compiling code.
 
-=for apidoc AmxU|PAD *|PL_comppad
+=for apidoc AmnxU|PAD *|PL_comppad
 
 During compilation, this points to the array containing the values
 part of the pad for the currently-compiling code.  (At runtime a CV may
@@ -134,7 +134,7 @@ have many such value arrays; at compile time just one is constructed.)
 At runtime, this points to the array containing the currently-relevant
 values for the pad for the currently-executing code.
 
-=for apidoc AmxU|SV **|PL_curpad
+=for apidoc AmnxU|SV **|PL_curpad
 
 Points directly to the body of the L</PL_comppad> array.
 (I.e., this is C<PadARRAY(PL_comppad)>.)
index 8f5949b..28e6d6d 100644 (file)
@@ -15,7 +15,7 @@
 
 #define PERL_REVISION  5               /* age */
 #define PERL_VERSION   31              /* epoch */
-#define PERL_SUBVERSION        1               /* generation */
+#define PERL_SUBVERSION        2               /* generation */
 
 /* The following numbers describe the earliest compatible version of
    Perl ("compatibility" here being defined as sufficient binary/API
@@ -36,7 +36,7 @@
 */
 #define PERL_API_REVISION      5
 #define PERL_API_VERSION       31
-#define PERL_API_SUBVERSION    1
+#define PERL_API_SUBVERSION    2
 /*
    XXX Note:  The selection of non-default Configure options, such
    as -Duselonglong may invalidate these settings.  Currently, Configure
diff --git a/perl.c b/perl.c
index e71ecaf..a84a0a9 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -627,7 +627,6 @@ perl_destruct(pTHXx)
     PERL_WAIT_FOR_CHILDREN;
 
     destruct_level = PL_perl_destruct_level;
-#if defined(DEBUGGING) || defined(PERL_TRACK_MEMPOOL)
     {
        const char * const s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL");
        if (s) {
@@ -641,16 +640,13 @@ perl_destruct(pTHXx)
                 else
                     i = 0;
             }
-#ifdef DEBUGGING
            if (destruct_level < i) destruct_level = i;
-#endif
 #ifdef PERL_TRACK_MEMPOOL
             /* RT #114496, for perl_free */
             PL_perl_destruct_level = i;
 #endif
        }
     }
-#endif
 
     if (PL_exit_flags & PERL_EXIT_DESTRUCT_END) {
         dJMPENV;
@@ -1628,16 +1624,13 @@ For historical reasons, the non-zero return value also attempts to
 be a suitable value to pass to the C library function C<exit> (or to
 return from C<main>), to serve as an exit code indicating the nature
 of the way initialisation terminated.  However, this isn't portable,
-due to differing exit code conventions.  A historical bug is preserved
-for the time being: if the Perl built-in C<exit> is called during this
-function's execution, with a type of exit entailing a zero exit code
-under the host operating system's conventions, then this function
-returns zero rather than a non-zero value.  This bug, [perl #2754],
-leads to C<perl_run> being called (and therefore C<INIT> blocks and the
-main program running) despite a call to C<exit>.  It has been preserved
-because a popular module-installing module has come to rely on it and
-needs time to be fixed.  This issue is [perl #132577], and the original
-bug is due to be fixed in Perl 5.30.
+due to differing exit code conventions.  An attempt is made to return
+an exit code of the type required by the host operating system, but
+because it is constrained to be non-zero, it is not necessarily possible
+to indicate every type of exit.  It is only reliable on Unix, where a
+zero exit code can be augmented with a set bit that will be ignored.
+In any case, this function is not the correct place to acquire an exit
+code: one should get that from L</perl_destruct>.
 
 =cut
 */
@@ -1846,15 +1839,7 @@ perl_parse(pTHXx_ XSINIT_t xsinit, int argc, char **argv, char **env)
            call_list(oldscope, PL_checkav);
        }
        ret = STATUS_EXIT;
-       if (ret == 0) {
-           /*
-            * At this point we should do
-            *     ret = 0x100;
-            * to avoid [perl #2754], but that bugfix has been postponed
-            * because of the Module::Install breakage it causes
-            * [perl #132577].
-            */
-       }
+       if (ret == 0) ret = 0x100;
        break;
     case 3:
        PerlIO_printf(Perl_error_log, "panic: top_env\n");
@@ -3101,6 +3086,9 @@ Perl_call_sv(pTHX_ SV *sv, volatile I32 flags)
 Tells Perl to C<eval> the string in the SV.  It supports the same flags
 as C<call_sv>, with the obvious exception of C<G_EVAL>.  See L<perlcall>.
 
+The C<G_RETHROW> flag can be used if you only need eval_sv() to
+execute code specified by a string, but not catch any errors.
+
 =cut
 */
 
@@ -3182,6 +3170,11 @@ Perl_eval_sv(pTHX_ SV *sv, I32 flags)
            goto redo_body;
        }
       fail:
+        if (flags & G_RETHROW) {
+            JMPENV_POP;
+            croak_sv(ERRSV);
+        }
+
        PL_stack_sp = PL_stack_base + oldmark;
        if ((flags & G_WANT) == G_ARRAY)
            retval = 0;
@@ -3218,8 +3211,14 @@ Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
 
     PERL_ARGS_ASSERT_EVAL_PV;
 
-    eval_sv(sv, G_SCALAR);
-    SvREFCNT_dec(sv);
+    if (croak_on_error) {
+        sv_2mortal(sv);
+        eval_sv(sv, G_SCALAR | G_RETHROW);
+    }
+    else {
+        eval_sv(sv, G_SCALAR);
+        SvREFCNT_dec(sv);
+    }
 
     {
         dSP;
@@ -3227,13 +3226,6 @@ Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error)
         PUTBACK;
     }
 
-    /* just check empty string or undef? */
-    if (croak_on_error) {
-       SV * const errsv = ERRSV;
-       if(SvTRUE_NN(errsv))
-            croak_sv(errsv);
-    }
-
     return sv;
 }
 
diff --git a/perl.h b/perl.h
index fda9255..37b2637 100644 (file)
--- a/perl.h
+++ b/perl.h
                                     taint_proper(NULL, s);                  \
                                 }
 #   define TAINT_set(s)                (PL_tainted = (s))
-#   define TAINT_get           (PL_tainted)
+#   define TAINT_get           (PL_tainted)    /* Is something tainted? */
 #   define TAINTING_get                (PL_tainting)   /* Is taint checking enabled? */
 #   define TAINTING_set(s)     (PL_tainting = (s))
 #   define TAINT_WARN_get       (PL_taint_warn) /* FALSE => tainting violations
@@ -1264,6 +1264,38 @@ EXTERN_C char *crypt(const char *, const char *);
 EXTERN_C char *crypt(const char *, const char *);
 #endif
 
+/*
+=head1 Errno
+
+=for apidoc m|void|SETERRNO|int errcode|int vmserrcode
+
+Set C<errno>, and on VMS set C<vaxc$errno>.
+
+=for apidoc mn|void|dSAVEDERRNO
+
+Declare variables needed to save C<errno> and any operating system
+specific error number.
+
+=for apidoc mn|void|dSAVE_ERRNO
+
+Declare variables needed to save C<errno> and any operating system
+specific error number, and save them for optional later restoration
+by C<RESTORE_ERRNO>.
+
+=for apidoc mn|void|SAVE_ERRNO
+
+Save C<errno> and any operating system specific error number for
+optional later restoration by C<RESTORE_ERRNO>.  Requires
+C<dSAVEDERRNO> or C<dSAVE_ERRNO> in scope.
+
+=for apidoc mn|void|RESTORE_ERRNO
+
+Restore C<errno> and any operating system specific error number that
+was saved by C<dSAVE_ERRNO> or C<RESTORE_ERRNO>.
+
+=cut
+*/
+
 #ifdef SETERRNO
 # undef SETERRNO  /* SOCKS might have defined this */
 #endif
@@ -1335,6 +1367,22 @@ EXTERN_C char *crypt(const char *, const char *);
 #   define RESTORE_ERRNO  (errno = saved_errno)
 #endif
 
+/*
+=head1 Warning and Dieing
+
+=for apidoc Amn|SV *|ERRSV
+
+Returns the SV for C<$@>, creating it if needed.
+
+=for apidoc Am|void|CLEAR_ERRSV
+
+Clear the contents of C<$@>, setting it to the empty string.
+
+This replaces any read-only SV with a fresh SV and removes any magic.
+
+=cut
+*/
+
 #define ERRSV GvSVn(PL_errgv)
 
 /* contains inlined gv_add_by_type */
@@ -3509,9 +3557,9 @@ EXTERN_C int perl_tsa_mutex_unlock(perl_mutex* mutex)
 #  define NOT_REACHED
 #elif defined(DEBUGGING) && (__has_builtin(__builtin_unreachable) \
      || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5 || __GNUC__ > 4)) /* 4.5 -> */
-#  define NOT_REACHED STMT_START { ASSUME(0); __builtin_unreachable(); } STMT_END
+#  define NOT_REACHED STMT_START { ASSUME(!"UNREACHABLE"); __builtin_unreachable(); } STMT_END
 #else
-#  define NOT_REACHED ASSUME(0)
+#  define NOT_REACHED ASSUME(!"UNREACHABLE")
 #endif
 
 /* Some unistd.h's give a prototype for pause() even though
index d32aed0..805959f 100644 (file)
--- a/perlio.c
+++ b/perlio.c
@@ -1490,7 +1490,9 @@ PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
             int imode, int perm, PerlIO *f, int narg, SV **args)
 {
     if (!f && narg == 1 && *args == &PL_sv_undef) {
-       if ((f = PerlIO_tmpfile())) {
+        int imode = PerlIOUnix_oflags(mode);
+
+       if (imode != -1 && (f = PerlIO_tmpfile_flags(imode))) {
            if (!layers || !*layers)
                layers = Perl_PerlIO_context_layers(aTHX_ mode);
            if (layers && *layers)
@@ -5043,44 +5045,60 @@ PerlIO_stdoutf(const char *fmt, ...)
 PerlIO *
 PerlIO_tmpfile(void)
 {
+    return PerlIO_tmpfile_flags(0);
+}
+
+#define MKOSTEMP_MODES ( O_RDWR | O_CREAT | O_EXCL )
+#define MKOSTEMP_MODE_MASK ( O_ACCMODE | O_CREAT | O_EXCL | O_TRUNC )
+
+PerlIO *
+PerlIO_tmpfile_flags(int imode)
+{
 #ifndef WIN32
      dTHX;
 #endif
      PerlIO *f = NULL;
 #ifdef WIN32
-     const int fd = win32_tmpfd();
+     const int fd = win32_tmpfd_mode(imode);
      if (fd >= 0)
          f = PerlIO_fdopen(fd, "w+b");
-#elif ! defined(VMS) && ! defined(OS2)
+#elif ! defined(OS2)
      int fd = -1;
      char tempname[] = "/tmp/PerlIO_XXXXXX";
      const char * const tmpdir = TAINTING_get ? NULL : PerlEnv_getenv("TMPDIR");
      SV * sv = NULL;
      int old_umask = umask(0177);
+     imode &= ~MKOSTEMP_MODE_MASK;
      if (tmpdir && *tmpdir) {
         /* if TMPDIR is set and not empty, we try that first */
         sv = newSVpv(tmpdir, 0);
         sv_catpv(sv, tempname + 4);
-        fd = Perl_my_mkstemp_cloexec(SvPVX(sv));
+        fd = Perl_my_mkostemp_cloexec(SvPVX(sv), imode | O_VMS_DELETEONCLOSE);
      }
      if (fd < 0) {
         SvREFCNT_dec(sv);
         sv = NULL;
         /* else we try /tmp */
-        fd = Perl_my_mkstemp_cloexec(tempname);
+        fd = Perl_my_mkostemp_cloexec(tempname, imode | O_VMS_DELETEONCLOSE);
      }
      if (fd < 0) {
          /* Try cwd */
          sv = newSVpvs(".");
          sv_catpv(sv, tempname + 4);
-         fd = Perl_my_mkstemp_cloexec(SvPVX(sv));
+         fd = Perl_my_mkostemp_cloexec(SvPVX(sv), imode | O_VMS_DELETEONCLOSE);
      }
      umask(old_umask);
      if (fd >= 0) {
-         f = PerlIO_fdopen(fd, "w+");
+         /* fdopen() with a numeric mode */
+         char mode[8];
+         int writing = 1;
+         (void)PerlIO_intmode2str(imode | MKOSTEMP_MODES, mode, &writing);
+         f = PerlIO_fdopen(fd, mode);
          if (f)
               PerlIOBase(f)->flags |= PERLIO_F_TEMP;
+#   ifndef VMS
          PerlLIO_unlink(sv ? SvPVX_const(sv) : tempname);
+#   endif
      }
      SvREFCNT_dec(sv);
 #else  /* !HAS_MKSTEMP, fallback to stdio tmpfile(). */
index d515020..ee16ab8 100644 (file)
--- a/perlio.h
+++ b/perlio.h
@@ -286,6 +286,9 @@ PERL_CALLCONV SSize_t PerlIO_get_bufsiz(PerlIO *);
 #ifndef PerlIO_tmpfile
 PERL_CALLCONV PerlIO *PerlIO_tmpfile(void);
 #endif
+#ifndef PerlIO_tmpfile_flags
+PERL_CALLCONV PerlIO *PerlIO_tmpfile_flags(int flags);
+#endif
 #ifndef PerlIO_stdin
 PERL_CALLCONV PerlIO *PerlIO_stdin(void);
 #endif
index 466c515..df5b2f8 100644 (file)
@@ -114,7 +114,7 @@ PERLVAR(G, C_locale_obj, locale_t)
 PERLVARI(G, watch_pvx, char *, NULL)
 
 /*
-=for apidoc AmU|Perl_check_t *|PL_check
+=for apidoc AmnU|Perl_check_t *|PL_check
 
 Array, indexed by opcode, of functions that will be called for the "check"
 phase of optree building during compilation of Perl code.  For most (but
@@ -176,7 +176,7 @@ PERLVARI(G, my_cxt_index, int,      0)
 PERLVARI(G, veto_cleanup, int, FALSE)  /* exit without cleanup */
 
 /*
-=for apidoc AmUx|Perl_keyword_plugin_t|PL_keyword_plugin
+=for apidoc AmnUx|Perl_keyword_plugin_t|PL_keyword_plugin
 
 Function pointer, pointing at a function used to handle extended keywords.
 The function should be declared as
index 7dcbe20..b4b50c7 100644 (file)
--- a/perly.act
+++ b/perly.act
@@ -5,7 +5,7 @@
  */
 
 case 2:
-#line 120 "perly.y" /* yacc.c:1646  */
+#line 120 "perly.y"
     {
                          parser->expect = XSTATE;
                           (yyval.ival) = 0;
@@ -14,7 +14,7 @@ case 2:
     break;
 
   case 3:
-#line 125 "perly.y" /* yacc.c:1646  */
+#line 125 "perly.y"
     {
                          newPROG(block_end((ps[-1].val.ival),(ps[0].val.opval)));
                          PL_compiling.cop_seq = 0;
@@ -24,7 +24,7 @@ case 2:
     break;
 
   case 4:
-#line 131 "perly.y" /* yacc.c:1646  */
+#line 131 "perly.y"
     {
                          parser->expect = XTERM;
                           (yyval.ival) = 0;
@@ -33,7 +33,7 @@ case 2:
     break;
 
   case 5:
-#line 136 "perly.y" /* yacc.c:1646  */
+#line 136 "perly.y"
     {
                          PL_eval_root = (ps[0].val.opval);
                          (yyval.ival) = 0;
@@ -42,7 +42,7 @@ case 2:
     break;
 
   case 6:
-#line 141 "perly.y" /* yacc.c:1646  */
+#line 141 "perly.y"
     {
                          parser->expect = XBLOCK;
                           (yyval.ival) = 0;
@@ -51,7 +51,7 @@ case 2:
     break;
 
   case 7:
-#line 146 "perly.y" /* yacc.c:1646  */
+#line 146 "perly.y"
     {
                          PL_pad_reset_pending = TRUE;
                          PL_eval_root = (ps[0].val.opval);
@@ -63,7 +63,7 @@ case 2:
     break;
 
   case 8:
-#line 154 "perly.y" /* yacc.c:1646  */
+#line 154 "perly.y"
     {
                          parser->expect = XSTATE;
                           (yyval.ival) = 0;
@@ -72,7 +72,7 @@ case 2:
     break;
 
   case 9:
-#line 159 "perly.y" /* yacc.c:1646  */
+#line 159 "perly.y"
     {
                          PL_pad_reset_pending = TRUE;
                          PL_eval_root = (ps[0].val.opval);
@@ -84,7 +84,7 @@ case 2:
     break;
 
   case 10:
-#line 167 "perly.y" /* yacc.c:1646  */
+#line 167 "perly.y"
     {
                          parser->expect = XSTATE;
                           (yyval.ival) = 0;
@@ -93,7 +93,7 @@ case 2:
     break;
 
   case 11:
-#line 172 "perly.y" /* yacc.c:1646  */
+#line 172 "perly.y"
     {
                          PL_pad_reset_pending = TRUE;
                          PL_eval_root = (ps[0].val.opval);
@@ -105,7 +105,7 @@ case 2:
     break;
 
   case 12:
-#line 180 "perly.y" /* yacc.c:1646  */
+#line 180 "perly.y"
     {
                          parser->expect = XSTATE;
                           (yyval.ival) = 0;
@@ -114,7 +114,7 @@ case 2:
     break;
 
   case 13:
-#line 185 "perly.y" /* yacc.c:1646  */
+#line 185 "perly.y"
     {
                          PL_eval_root = (ps[0].val.opval);
                          (yyval.ival) = 0;
@@ -123,7 +123,7 @@ case 2:
     break;
 
   case 14:
-#line 193 "perly.y" /* yacc.c:1646  */
+#line 193 "perly.y"
     { if (parser->copline > (line_t)(ps[-3].val.ival))
                              parser->copline = (line_t)(ps[-3].val.ival);
                          (yyval.opval) = block_end((ps[-2].val.ival), (ps[-1].val.opval));
@@ -132,7 +132,7 @@ case 2:
     break;
 
   case 15:
-#line 201 "perly.y" /* yacc.c:1646  */
+#line 201 "perly.y"
     { if (parser->copline > (line_t)(ps[-6].val.ival))
                              parser->copline = (line_t)(ps[-6].val.ival);
                          (yyval.opval) = block_end((ps[-5].val.ival), (ps[-2].val.opval));
@@ -141,14 +141,14 @@ case 2:
     break;
 
   case 16:
-#line 208 "perly.y" /* yacc.c:1646  */
+#line 208 "perly.y"
     { (yyval.ival) = block_start(TRUE);
                          parser->parsed_sub = 0; }
 
     break;
 
   case 17:
-#line 213 "perly.y" /* yacc.c:1646  */
+#line 213 "perly.y"
     { if (parser->copline > (line_t)(ps[-3].val.ival))
                              parser->copline = (line_t)(ps[-3].val.ival);
                          (yyval.opval) = block_end((ps[-2].val.ival), (ps[-1].val.opval));
@@ -157,20 +157,20 @@ case 2:
     break;
 
   case 18:
-#line 220 "perly.y" /* yacc.c:1646  */
+#line 220 "perly.y"
     { (yyval.ival) = block_start(FALSE);
                          parser->parsed_sub = 0; }
 
     break;
 
   case 19:
-#line 226 "perly.y" /* yacc.c:1646  */
+#line 226 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 20:
-#line 228 "perly.y" /* yacc.c:1646  */
+#line 228 "perly.y"
     {   (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), (ps[0].val.opval));
                            PL_pad_reset_pending = TRUE;
                            if ((ps[-1].val.opval) && (ps[0].val.opval))
@@ -180,13 +180,13 @@ case 2:
     break;
 
   case 21:
-#line 237 "perly.y" /* yacc.c:1646  */
+#line 237 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 22:
-#line 239 "perly.y" /* yacc.c:1646  */
+#line 239 "perly.y"
     {   (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), (ps[0].val.opval));
                            PL_pad_reset_pending = TRUE;
                            if ((ps[-1].val.opval) && (ps[0].val.opval))
@@ -196,7 +196,7 @@ case 2:
     break;
 
   case 23:
-#line 248 "perly.y" /* yacc.c:1646  */
+#line 248 "perly.y"
     {
                          (yyval.opval) = (ps[0].val.opval) ? newSTATEOP(0, NULL, (ps[0].val.opval)) : NULL;
                        }
@@ -204,13 +204,13 @@ case 2:
     break;
 
   case 24:
-#line 252 "perly.y" /* yacc.c:1646  */
+#line 252 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 25:
-#line 256 "perly.y" /* yacc.c:1646  */
+#line 256 "perly.y"
     {
                           SV *label = cSVOPx_sv((ps[-1].val.opval));
                          (yyval.opval) = newSTATEOP(SvFLAGS(label) & SVf_UTF8,
@@ -221,7 +221,7 @@ case 2:
     break;
 
   case 26:
-#line 263 "perly.y" /* yacc.c:1646  */
+#line 263 "perly.y"
     {
                           SV *label = cSVOPx_sv((ps[-1].val.opval));
                          (yyval.opval) = newSTATEOP(SvFLAGS(label) & SVf_UTF8,
@@ -232,13 +232,13 @@ case 2:
     break;
 
   case 27:
-#line 273 "perly.y" /* yacc.c:1646  */
+#line 273 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 28:
-#line 275 "perly.y" /* yacc.c:1646  */
+#line 275 "perly.y"
     {
                          CV *fmtcv = PL_compcv;
                          newFORM((ps[-2].val.ival), (ps[-1].val.opval), (ps[0].val.opval));
@@ -252,7 +252,7 @@ case 2:
     break;
 
   case 29:
-#line 287 "perly.y" /* yacc.c:1646  */
+#line 287 "perly.y"
     {
                           init_named_cv(PL_compcv, (ps[-1].val.opval));
                          parser->in_my = 0;
@@ -262,7 +262,7 @@ case 2:
     break;
 
   case 30:
-#line 293 "perly.y" /* yacc.c:1646  */
+#line 293 "perly.y"
     {
                          SvREFCNT_inc_simple_void(PL_compcv);
                          (ps[-5].val.opval)->op_type == OP_CONST
@@ -277,7 +277,7 @@ case 2:
     break;
 
   case 31:
-#line 308 "perly.y" /* yacc.c:1646  */
+#line 308 "perly.y"
     {
                           init_named_cv(PL_compcv, (ps[-1].val.opval));
                          parser->in_my = 0;
@@ -287,7 +287,7 @@ case 2:
     break;
 
   case 32:
-#line 314 "perly.y" /* yacc.c:1646  */
+#line 314 "perly.y"
     {
                          SvREFCNT_inc_simple_void(PL_compcv);
                          (ps[-4].val.opval)->op_type == OP_CONST
@@ -302,7 +302,7 @@ case 2:
     break;
 
   case 33:
-#line 325 "perly.y" /* yacc.c:1646  */
+#line 325 "perly.y"
     {
                          package((ps[-1].val.opval));
                          if ((ps[-2].val.opval))
@@ -313,13 +313,13 @@ case 2:
     break;
 
   case 34:
-#line 332 "perly.y" /* yacc.c:1646  */
+#line 332 "perly.y"
     { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ }
 
     break;
 
   case 35:
-#line 334 "perly.y" /* yacc.c:1646  */
+#line 334 "perly.y"
     {
                          SvREFCNT_inc_simple_void(PL_compcv);
                          utilize((ps[-6].val.ival), (ps[-5].val.ival), (ps[-3].val.opval), (ps[-2].val.opval), (ps[-1].val.opval));
@@ -330,7 +330,7 @@ case 2:
     break;
 
   case 36:
-#line 341 "perly.y" /* yacc.c:1646  */
+#line 341 "perly.y"
     {
                          (yyval.opval) = block_end((ps[-4].val.ival),
                              newCONDOP(0, (ps[-3].val.opval), op_scope((ps[-1].val.opval)), (ps[0].val.opval)));
@@ -340,7 +340,7 @@ case 2:
     break;
 
   case 37:
-#line 347 "perly.y" /* yacc.c:1646  */
+#line 347 "perly.y"
     {
                          (yyval.opval) = block_end((ps[-4].val.ival),
                               newCONDOP(0, (ps[-3].val.opval), (ps[0].val.opval), op_scope((ps[-1].val.opval))));
@@ -350,7 +350,7 @@ case 2:
     break;
 
   case 38:
-#line 353 "perly.y" /* yacc.c:1646  */
+#line 353 "perly.y"
     {
                          (yyval.opval) = block_end((ps[-3].val.ival), newGIVENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)), 0));
                          parser->copline = (line_t)(ps[-5].val.ival);
@@ -359,19 +359,19 @@ case 2:
     break;
 
   case 39:
-#line 358 "perly.y" /* yacc.c:1646  */
+#line 358 "perly.y"
     { (yyval.opval) = block_end((ps[-3].val.ival), newWHENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)))); }
 
     break;
 
   case 40:
-#line 360 "perly.y" /* yacc.c:1646  */
+#line 360 "perly.y"
     { (yyval.opval) = newWHENOP(0, op_scope((ps[0].val.opval))); }
 
     break;
 
   case 41:
-#line 362 "perly.y" /* yacc.c:1646  */
+#line 362 "perly.y"
     {
                          (yyval.opval) = block_end((ps[-5].val.ival),
                                  newWHILEOP(0, 1, NULL,
@@ -382,7 +382,7 @@ case 2:
     break;
 
   case 42:
-#line 369 "perly.y" /* yacc.c:1646  */
+#line 369 "perly.y"
     {
                          (yyval.opval) = block_end((ps[-5].val.ival),
                                  newWHILEOP(0, 1, NULL,
@@ -393,19 +393,19 @@ case 2:
     break;
 
   case 43:
-#line 376 "perly.y" /* yacc.c:1646  */
+#line 376 "perly.y"
     { parser->expect = XTERM; }
 
     break;
 
   case 44:
-#line 378 "perly.y" /* yacc.c:1646  */
+#line 378 "perly.y"
     { parser->expect = XTERM; }
 
     break;
 
   case 45:
-#line 381 "perly.y" /* yacc.c:1646  */
+#line 381 "perly.y"
     {
                          OP *initop = (ps[-9].val.opval);
                          OP *forop = newWHILEOP(0, 1, NULL,
@@ -424,7 +424,7 @@ case 2:
     break;
 
   case 46:
-#line 396 "perly.y" /* yacc.c:1646  */
+#line 396 "perly.y"
     {
                          (yyval.opval) = block_end((ps[-6].val.ival), newFOROP(0, (ps[-5].val.opval), (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval)));
                          parser->copline = (line_t)(ps[-8].val.ival);
@@ -433,7 +433,7 @@ case 2:
     break;
 
   case 47:
-#line 401 "perly.y" /* yacc.c:1646  */
+#line 401 "perly.y"
     {
                          (yyval.opval) = block_end((ps[-4].val.ival), newFOROP(0,
                                      op_lvalue((ps[-6].val.opval), OP_ENTERLOOP), (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval)));
@@ -443,13 +443,13 @@ case 2:
     break;
 
   case 48:
-#line 407 "perly.y" /* yacc.c:1646  */
+#line 407 "perly.y"
     { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); }
 
     break;
 
   case 49:
-#line 409 "perly.y" /* yacc.c:1646  */
+#line 409 "perly.y"
     {
                          (yyval.opval) = block_end(
                                (ps[-7].val.ival),
@@ -466,7 +466,7 @@ case 2:
     break;
 
   case 50:
-#line 422 "perly.y" /* yacc.c:1646  */
+#line 422 "perly.y"
     {
                          (yyval.opval) = block_end((ps[-4].val.ival), newFOROP(
                                0, op_lvalue(newUNOP(OP_REFGEN, 0,
@@ -478,7 +478,7 @@ case 2:
     break;
 
   case 51:
-#line 430 "perly.y" /* yacc.c:1646  */
+#line 430 "perly.y"
     {
                          (yyval.opval) = block_end((ps[-4].val.ival),
                                  newFOROP(0, NULL, (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval)));
@@ -488,7 +488,7 @@ case 2:
     break;
 
   case 52:
-#line 436 "perly.y" /* yacc.c:1646  */
+#line 436 "perly.y"
     {
                          /* a block is a loop that happens once */
                          (yyval.opval) = newWHILEOP(0, 1, NULL,
@@ -498,7 +498,7 @@ case 2:
     break;
 
   case 53:
-#line 442 "perly.y" /* yacc.c:1646  */
+#line 442 "perly.y"
     {
                          package((ps[-2].val.opval));
                          if ((ps[-3].val.opval)) {
@@ -509,7 +509,7 @@ case 2:
     break;
 
   case 54:
-#line 449 "perly.y" /* yacc.c:1646  */
+#line 449 "perly.y"
     {
                          /* a block is a loop that happens once */
                          (yyval.opval) = newWHILEOP(0, 1, NULL,
@@ -521,7 +521,7 @@ case 2:
     break;
 
   case 55:
-#line 457 "perly.y" /* yacc.c:1646  */
+#line 457 "perly.y"
     {
                          (yyval.opval) = (ps[-1].val.opval);
                        }
@@ -529,7 +529,7 @@ case 2:
     break;
 
   case 56:
-#line 461 "perly.y" /* yacc.c:1646  */
+#line 461 "perly.y"
     {
                          (yyval.opval) = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0),
                                newSVOP(OP_CONST, 0, newSVpvs("Unimplemented")));
@@ -538,7 +538,7 @@ case 2:
     break;
 
   case 57:
-#line 466 "perly.y" /* yacc.c:1646  */
+#line 466 "perly.y"
     {
                          (yyval.opval) = NULL;
                          parser->copline = NOLINE;
@@ -547,7 +547,7 @@ case 2:
     break;
 
   case 58:
-#line 474 "perly.y" /* yacc.c:1646  */
+#line 474 "perly.y"
     { OP *list;
                          if ((ps[0].val.opval)) {
                              OP *term = (ps[0].val.opval);
@@ -566,74 +566,74 @@ case 2:
     break;
 
   case 59:
-#line 491 "perly.y" /* yacc.c:1646  */
+#line 491 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 60:
-#line 493 "perly.y" /* yacc.c:1646  */
+#line 493 "perly.y"
     { (yyval.opval) = op_unscope((ps[-1].val.opval)); }
 
     break;
 
   case 61:
-#line 498 "perly.y" /* yacc.c:1646  */
+#line 498 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 62:
-#line 500 "perly.y" /* yacc.c:1646  */
+#line 500 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 63:
-#line 502 "perly.y" /* yacc.c:1646  */
+#line 502 "perly.y"
     { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[0].val.opval), (ps[-2].val.opval)); }
 
     break;
 
   case 64:
-#line 504 "perly.y" /* yacc.c:1646  */
+#line 504 "perly.y"
     { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[0].val.opval), (ps[-2].val.opval)); }
 
     break;
 
   case 65:
-#line 506 "perly.y" /* yacc.c:1646  */
+#line 506 "perly.y"
     { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[0].val.opval)), (ps[-2].val.opval)); }
 
     break;
 
   case 66:
-#line 508 "perly.y" /* yacc.c:1646  */
+#line 508 "perly.y"
     { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[0].val.opval), (ps[-2].val.opval)); }
 
     break;
 
   case 67:
-#line 510 "perly.y" /* yacc.c:1646  */
+#line 510 "perly.y"
     { (yyval.opval) = newFOROP(0, NULL, (ps[0].val.opval), (ps[-2].val.opval), NULL);
                          parser->copline = (line_t)(ps[-1].val.ival); }
 
     break;
 
   case 68:
-#line 513 "perly.y" /* yacc.c:1646  */
+#line 513 "perly.y"
     { (yyval.opval) = newWHENOP((ps[0].val.opval), op_scope((ps[-2].val.opval))); }
 
     break;
 
   case 69:
-#line 518 "perly.y" /* yacc.c:1646  */
+#line 518 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 70:
-#line 520 "perly.y" /* yacc.c:1646  */
+#line 520 "perly.y"
     {
                          ((ps[0].val.opval))->op_flags |= OPf_PARENS;
                          (yyval.opval) = op_scope((ps[0].val.opval));
@@ -642,7 +642,7 @@ case 2:
     break;
 
   case 71:
-#line 525 "perly.y" /* yacc.c:1646  */
+#line 525 "perly.y"
     { parser->copline = (line_t)(ps[-5].val.ival);
                            (yyval.opval) = newCONDOP(0,
                                newSTATEOP(OPf_SPECIAL,NULL,(ps[-3].val.opval)),
@@ -653,19 +653,19 @@ case 2:
     break;
 
   case 72:
-#line 535 "perly.y" /* yacc.c:1646  */
+#line 535 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 73:
-#line 537 "perly.y" /* yacc.c:1646  */
+#line 537 "perly.y"
     { (yyval.opval) = op_scope((ps[0].val.opval)); }
 
     break;
 
   case 74:
-#line 542 "perly.y" /* yacc.c:1646  */
+#line 542 "perly.y"
     { (yyval.ival) = (PL_min_intro_pending &&
                            PL_max_intro_pending >=  PL_min_intro_pending);
                          intro_my(); }
@@ -673,13 +673,13 @@ case 2:
     break;
 
   case 75:
-#line 548 "perly.y" /* yacc.c:1646  */
+#line 548 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 77:
-#line 554 "perly.y" /* yacc.c:1646  */
+#line 554 "perly.y"
     { YYSTYPE tmplval;
                          (void)scan_num("1", &tmplval);
                          (yyval.opval) = tmplval.opval; }
@@ -687,118 +687,118 @@ case 2:
     break;
 
   case 79:
-#line 562 "perly.y" /* yacc.c:1646  */
+#line 562 "perly.y"
     { (yyval.opval) = invert(scalar((ps[0].val.opval))); }
 
     break;
 
   case 80:
-#line 567 "perly.y" /* yacc.c:1646  */
+#line 567 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); intro_my(); }
 
     break;
 
   case 81:
-#line 571 "perly.y" /* yacc.c:1646  */
+#line 571 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); intro_my(); }
 
     break;
 
   case 82:
-#line 574 "perly.y" /* yacc.c:1646  */
+#line 574 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 83:
-#line 575 "perly.y" /* yacc.c:1646  */
+#line 575 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 84:
-#line 579 "perly.y" /* yacc.c:1646  */
+#line 579 "perly.y"
     { (yyval.ival) = start_subparse(FALSE, 0);
                            SAVEFREESV(PL_compcv); }
 
     break;
 
   case 85:
-#line 585 "perly.y" /* yacc.c:1646  */
+#line 585 "perly.y"
     { (yyval.ival) = start_subparse(FALSE, CVf_ANON);
                            SAVEFREESV(PL_compcv); }
 
     break;
 
   case 86:
-#line 590 "perly.y" /* yacc.c:1646  */
+#line 590 "perly.y"
     { (yyval.ival) = start_subparse(TRUE, 0);
                            SAVEFREESV(PL_compcv); }
 
     break;
 
   case 89:
-#line 601 "perly.y" /* yacc.c:1646  */
+#line 601 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 91:
-#line 607 "perly.y" /* yacc.c:1646  */
+#line 607 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 92:
-#line 609 "perly.y" /* yacc.c:1646  */
+#line 609 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 93:
-#line 611 "perly.y" /* yacc.c:1646  */
+#line 611 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 94:
-#line 616 "perly.y" /* yacc.c:1646  */
+#line 616 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 95:
-#line 618 "perly.y" /* yacc.c:1646  */
+#line 618 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 96:
-#line 629 "perly.y" /* yacc.c:1646  */
+#line 629 "perly.y"
     { parser->in_my = 0; (yyval.opval) = NULL; }
 
     break;
 
   case 97:
-#line 631 "perly.y" /* yacc.c:1646  */
+#line 631 "perly.y"
     { parser->in_my = 0; (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 98:
-#line 636 "perly.y" /* yacc.c:1646  */
+#line 636 "perly.y"
     { (yyval.ival) = '@'; }
 
     break;
 
   case 99:
-#line 638 "perly.y" /* yacc.c:1646  */
+#line 638 "perly.y"
     { (yyval.ival) = '%'; }
 
     break;
 
   case 100:
-#line 642 "perly.y" /* yacc.c:1646  */
+#line 642 "perly.y"
     {
                             I32 sigil   = (ps[-2].val.ival);
                             OP *var     = (ps[-1].val.opval);
@@ -818,25 +818,25 @@ case 2:
     break;
 
   case 101:
-#line 661 "perly.y" /* yacc.c:1646  */
+#line 661 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 102:
-#line 663 "perly.y" /* yacc.c:1646  */
+#line 663 "perly.y"
     { (yyval.opval) = newOP(OP_NULL, 0); }
 
     break;
 
   case 103:
-#line 665 "perly.y" /* yacc.c:1646  */
+#line 665 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 104:
-#line 671 "perly.y" /* yacc.c:1646  */
+#line 671 "perly.y"
     {
                             OP *var     = (ps[-1].val.opval);
                             OP *defexpr = (ps[0].val.opval);
@@ -901,25 +901,25 @@ case 2:
     break;
 
   case 105:
-#line 736 "perly.y" /* yacc.c:1646  */
+#line 736 "perly.y"
     { parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 106:
-#line 738 "perly.y" /* yacc.c:1646  */
+#line 738 "perly.y"
     { parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 107:
-#line 744 "perly.y" /* yacc.c:1646  */
+#line 744 "perly.y"
     { (yyval.opval) = (ps[-1].val.opval); }
 
     break;
 
   case 108:
-#line 746 "perly.y" /* yacc.c:1646  */
+#line 746 "perly.y"
     {
                          (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-2].val.opval), (ps[0].val.opval));
                        }
@@ -927,37 +927,37 @@ case 2:
     break;
 
   case 109:
-#line 750 "perly.y" /* yacc.c:1646  */
+#line 750 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 110:
-#line 755 "perly.y" /* yacc.c:1646  */
+#line 755 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 111:
-#line 757 "perly.y" /* yacc.c:1646  */
+#line 757 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 112:
-#line 761 "perly.y" /* yacc.c:1646  */
+#line 761 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 113:
-#line 763 "perly.y" /* yacc.c:1646  */
+#line 763 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 114:
-#line 767 "perly.y" /* yacc.c:1646  */
+#line 767 "perly.y"
     {
                             ENTER;
                             SAVEIV(parser->sig_elems);
@@ -972,7 +972,7 @@ case 2:
     break;
 
   case 115:
-#line 779 "perly.y" /* yacc.c:1646  */
+#line 779 "perly.y"
     {
                             OP            *sigops = (ps[-1].val.opval);
                             UNOP_AUX_item *aux;
@@ -1020,19 +1020,19 @@ case 2:
     break;
 
   case 116:
-#line 825 "perly.y" /* yacc.c:1646  */
+#line 825 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 117:
-#line 826 "perly.y" /* yacc.c:1646  */
+#line 826 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 118:
-#line 832 "perly.y" /* yacc.c:1646  */
+#line 832 "perly.y"
     {
                          if (parser->copline > (line_t)(ps[-2].val.ival))
                              parser->copline = (line_t)(ps[-2].val.ival);
@@ -1042,19 +1042,19 @@ case 2:
     break;
 
   case 119:
-#line 842 "perly.y" /* yacc.c:1646  */
+#line 842 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 120:
-#line 843 "perly.y" /* yacc.c:1646  */
+#line 843 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 121:
-#line 847 "perly.y" /* yacc.c:1646  */
+#line 847 "perly.y"
     {
                          if (parser->copline > (line_t)(ps[-2].val.ival))
                              parser->copline = (line_t)(ps[-2].val.ival);
@@ -1065,31 +1065,31 @@ case 2:
     break;
 
   case 122:
-#line 858 "perly.y" /* yacc.c:1646  */
+#line 858 "perly.y"
     { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 123:
-#line 860 "perly.y" /* yacc.c:1646  */
+#line 860 "perly.y"
     { (yyval.opval) = newLOGOP((ps[-1].val.ival), 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 124:
-#line 862 "perly.y" /* yacc.c:1646  */
+#line 862 "perly.y"
     { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 126:
-#line 868 "perly.y" /* yacc.c:1646  */
+#line 868 "perly.y"
     { (yyval.opval) = (ps[-1].val.opval); }
 
     break;
 
   case 127:
-#line 870 "perly.y" /* yacc.c:1646  */
+#line 870 "perly.y"
     {
                          OP* term = (ps[0].val.opval);
                          (yyval.opval) = op_append_elem(OP_LIST, (ps[-2].val.opval), term);
@@ -1098,7 +1098,7 @@ case 2:
     break;
 
   case 129:
-#line 879 "perly.y" /* yacc.c:1646  */
+#line 879 "perly.y"
     { (yyval.opval) = op_convert_list((ps[-2].val.ival), OPf_STACKED,
                                op_prepend_elem(OP_LIST, newGVREF((ps[-2].val.ival),(ps[-1].val.opval)), (ps[0].val.opval)) );
                        }
@@ -1106,7 +1106,7 @@ case 2:
     break;
 
   case 130:
-#line 883 "perly.y" /* yacc.c:1646  */
+#line 883 "perly.y"
     { (yyval.opval) = op_convert_list((ps[-4].val.ival), OPf_STACKED,
                                op_prepend_elem(OP_LIST, newGVREF((ps[-4].val.ival),(ps[-2].val.opval)), (ps[-1].val.opval)) );
                        }
@@ -1114,7 +1114,7 @@ case 2:
     break;
 
   case 131:
-#line 887 "perly.y" /* yacc.c:1646  */
+#line 887 "perly.y"
     { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, scalar((ps[-5].val.opval)), (ps[-1].val.opval)),
@@ -1124,7 +1124,7 @@ case 2:
     break;
 
   case 132:
-#line 893 "perly.y" /* yacc.c:1646  */
+#line 893 "perly.y"
     { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST, scalar((ps[-2].val.opval)),
                                    newMETHOP(OP_METHOD, 0, (ps[0].val.opval))));
@@ -1133,7 +1133,7 @@ case 2:
     break;
 
   case 133:
-#line 898 "perly.y" /* yacc.c:1646  */
+#line 898 "perly.y"
     { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, (ps[-1].val.opval), (ps[0].val.opval)),
@@ -1143,7 +1143,7 @@ case 2:
     break;
 
   case 134:
-#line 904 "perly.y" /* yacc.c:1646  */
+#line 904 "perly.y"
     { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, (ps[-3].val.opval), (ps[-1].val.opval)),
@@ -1153,32 +1153,32 @@ case 2:
     break;
 
   case 135:
-#line 910 "perly.y" /* yacc.c:1646  */
+#line 910 "perly.y"
     { (yyval.opval) = op_convert_list((ps[-1].val.ival), 0, (ps[0].val.opval)); }
 
     break;
 
   case 136:
-#line 912 "perly.y" /* yacc.c:1646  */
+#line 912 "perly.y"
     { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); }
 
     break;
 
   case 137:
-#line 914 "perly.y" /* yacc.c:1646  */
+#line 914 "perly.y"
     { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); }
 
     break;
 
   case 138:
-#line 916 "perly.y" /* yacc.c:1646  */
+#line 916 "perly.y"
     { SvREFCNT_inc_simple_void(PL_compcv);
                          (yyval.opval) = newANONATTRSUB((ps[-1].val.ival), 0, NULL, (ps[0].val.opval)); }
 
     break;
 
   case 139:
-#line 919 "perly.y" /* yacc.c:1646  */
+#line 919 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                 op_append_elem(OP_LIST,
                                   op_prepend_elem(OP_LIST, (ps[-1].val.opval), (ps[0].val.opval)), (ps[-4].val.opval)));
@@ -1187,20 +1187,20 @@ case 2:
     break;
 
   case 142:
-#line 934 "perly.y" /* yacc.c:1646  */
+#line 934 "perly.y"
     { (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[-4].val.opval), scalar((ps[-2].val.opval))); }
 
     break;
 
   case 143:
-#line 936 "perly.y" /* yacc.c:1646  */
+#line 936 "perly.y"
     { (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[-3].val.opval)), scalar((ps[-1].val.opval)));
                        }
 
     break;
 
   case 144:
-#line 939 "perly.y" /* yacc.c:1646  */
+#line 939 "perly.y"
     { (yyval.opval) = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF((ps[-4].val.opval)),OP_RV2AV),
                                        scalar((ps[-1].val.opval)));
@@ -1209,7 +1209,7 @@ case 2:
     break;
 
   case 145:
-#line 944 "perly.y" /* yacc.c:1646  */
+#line 944 "perly.y"
     { (yyval.opval) = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF((ps[-3].val.opval)),OP_RV2AV),
                                        scalar((ps[-1].val.opval)));
@@ -1218,14 +1218,14 @@ case 2:
     break;
 
   case 146:
-#line 949 "perly.y" /* yacc.c:1646  */
+#line 949 "perly.y"
     { (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[-4].val.opval)), jmaybe((ps[-2].val.opval)));
                        }
 
     break;
 
   case 147:
-#line 952 "perly.y" /* yacc.c:1646  */
+#line 952 "perly.y"
     { (yyval.opval) = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF((ps[-5].val.opval)),OP_RV2HV),
                                        jmaybe((ps[-2].val.opval))); }
@@ -1233,7 +1233,7 @@ case 2:
     break;
 
   case 148:
-#line 956 "perly.y" /* yacc.c:1646  */
+#line 956 "perly.y"
     { (yyval.opval) = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF((ps[-4].val.opval)),OP_RV2HV),
                                        jmaybe((ps[-2].val.opval))); }
@@ -1241,7 +1241,7 @@ case 2:
     break;
 
   case 149:
-#line 960 "perly.y" /* yacc.c:1646  */
+#line 960 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   newCVREF(0, scalar((ps[-3].val.opval))));
                          if (parser->expect == XBLOCK)
@@ -1251,7 +1251,7 @@ case 2:
     break;
 
   case 150:
-#line 966 "perly.y" /* yacc.c:1646  */
+#line 966 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   op_append_elem(OP_LIST, (ps[-1].val.opval),
                                       newCVREF(0, scalar((ps[-4].val.opval)))));
@@ -1262,7 +1262,7 @@ case 2:
     break;
 
   case 151:
-#line 974 "perly.y" /* yacc.c:1646  */
+#line 974 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   op_append_elem(OP_LIST, (ps[-1].val.opval),
                                               newCVREF(0, scalar((ps[-3].val.opval)))));
@@ -1273,7 +1273,7 @@ case 2:
     break;
 
   case 152:
-#line 981 "perly.y" /* yacc.c:1646  */
+#line 981 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   newCVREF(0, scalar((ps[-2].val.opval))));
                          if (parser->expect == XBLOCK)
@@ -1283,37 +1283,37 @@ case 2:
     break;
 
   case 153:
-#line 987 "perly.y" /* yacc.c:1646  */
+#line 987 "perly.y"
     { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-4].val.opval)); }
 
     break;
 
   case 154:
-#line 989 "perly.y" /* yacc.c:1646  */
+#line 989 "perly.y"
     { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-3].val.opval)); }
 
     break;
 
   case 155:
-#line 991 "perly.y" /* yacc.c:1646  */
+#line 991 "perly.y"
     { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), NULL); }
 
     break;
 
   case 156:
-#line 996 "perly.y" /* yacc.c:1646  */
+#line 996 "perly.y"
     { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[-2].val.opval), (ps[-1].val.ival), (ps[0].val.opval)); }
 
     break;
 
   case 157:
-#line 998 "perly.y" /* yacc.c:1646  */
+#line 998 "perly.y"
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
   case 158:
-#line 1000 "perly.y" /* yacc.c:1646  */
+#line 1000 "perly.y"
     {   if ((ps[-1].val.ival) != OP_REPEAT)
                                scalar((ps[-2].val.opval));
                            (yyval.opval) = newBINOP((ps[-1].val.ival), 0, (ps[-2].val.opval), scalar((ps[0].val.opval)));
@@ -1322,111 +1322,111 @@ case 2:
     break;
 
   case 159:
-#line 1005 "perly.y" /* yacc.c:1646  */
+#line 1005 "perly.y"
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
   case 160:
-#line 1007 "perly.y" /* yacc.c:1646  */
+#line 1007 "perly.y"
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
   case 161:
-#line 1009 "perly.y" /* yacc.c:1646  */
+#line 1009 "perly.y"
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
   case 162:
-#line 1011 "perly.y" /* yacc.c:1646  */
+#line 1011 "perly.y"
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
   case 163:
-#line 1013 "perly.y" /* yacc.c:1646  */
+#line 1013 "perly.y"
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
   case 164:
-#line 1015 "perly.y" /* yacc.c:1646  */
+#line 1015 "perly.y"
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
   case 165:
-#line 1017 "perly.y" /* yacc.c:1646  */
+#line 1017 "perly.y"
     { (yyval.opval) = newRANGE((ps[-1].val.ival), scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
   case 166:
-#line 1019 "perly.y" /* yacc.c:1646  */
+#line 1019 "perly.y"
     { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 167:
-#line 1021 "perly.y" /* yacc.c:1646  */
+#line 1021 "perly.y"
     { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 168:
-#line 1023 "perly.y" /* yacc.c:1646  */
+#line 1023 "perly.y"
     { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 169:
-#line 1025 "perly.y" /* yacc.c:1646  */
+#line 1025 "perly.y"
     { (yyval.opval) = bind_match((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 170:
-#line 1030 "perly.y" /* yacc.c:1646  */
+#line 1030 "perly.y"
     { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[0].val.opval))); }
 
     break;
 
   case 171:
-#line 1032 "perly.y" /* yacc.c:1646  */
+#line 1032 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 172:
-#line 1035 "perly.y" /* yacc.c:1646  */
+#line 1035 "perly.y"
     { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); }
 
     break;
 
   case 173:
-#line 1037 "perly.y" /* yacc.c:1646  */
+#line 1037 "perly.y"
     { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, scalar((ps[0].val.opval))); }
 
     break;
 
   case 174:
-#line 1039 "perly.y" /* yacc.c:1646  */
+#line 1039 "perly.y"
     { (yyval.opval) = newUNOP(OP_POSTINC, 0,
                                        op_lvalue(scalar((ps[-1].val.opval)), OP_POSTINC)); }
 
     break;
 
   case 175:
-#line 1042 "perly.y" /* yacc.c:1646  */
+#line 1042 "perly.y"
     { (yyval.opval) = newUNOP(OP_POSTDEC, 0,
                                        op_lvalue(scalar((ps[-1].val.opval)), OP_POSTDEC));}
 
     break;
 
   case 176:
-#line 1045 "perly.y" /* yacc.c:1646  */
+#line 1045 "perly.y"
     { (yyval.opval) = op_convert_list(OP_JOIN, 0,
                                       op_append_elem(
                                        OP_LIST,
@@ -1441,155 +1441,155 @@ case 2:
     break;
 
   case 177:
-#line 1056 "perly.y" /* yacc.c:1646  */
+#line 1056 "perly.y"
     { (yyval.opval) = newUNOP(OP_PREINC, 0,
                                        op_lvalue(scalar((ps[0].val.opval)), OP_PREINC)); }
 
     break;
 
   case 178:
-#line 1059 "perly.y" /* yacc.c:1646  */
+#line 1059 "perly.y"
     { (yyval.opval) = newUNOP(OP_PREDEC, 0,
                                        op_lvalue(scalar((ps[0].val.opval)), OP_PREDEC)); }
 
     break;
 
   case 179:
-#line 1066 "perly.y" /* yacc.c:1646  */
+#line 1066 "perly.y"
     { (yyval.opval) = newANONLIST((ps[-1].val.opval)); }
 
     break;
 
   case 180:
-#line 1068 "perly.y" /* yacc.c:1646  */
+#line 1068 "perly.y"
     { (yyval.opval) = newANONLIST(NULL);}
 
     break;
 
   case 181:
-#line 1070 "perly.y" /* yacc.c:1646  */
+#line 1070 "perly.y"
     { (yyval.opval) = newANONHASH((ps[-2].val.opval)); }
 
     break;
 
   case 182:
-#line 1072 "perly.y" /* yacc.c:1646  */
+#line 1072 "perly.y"
     { (yyval.opval) = newANONHASH(NULL); }
 
     break;
 
   case 183:
-#line 1074 "perly.y" /* yacc.c:1646  */
+#line 1074 "perly.y"
     { SvREFCNT_inc_simple_void(PL_compcv);
                          (yyval.opval) = newANONATTRSUB((ps[-3].val.ival), (ps[-2].val.opval), (ps[-1].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 184:
-#line 1077 "perly.y" /* yacc.c:1646  */
+#line 1077 "perly.y"
     { SvREFCNT_inc_simple_void(PL_compcv);
                          (yyval.opval) = newANONATTRSUB((ps[-2].val.ival), NULL, (ps[-1].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 185:
-#line 1083 "perly.y" /* yacc.c:1646  */
+#line 1083 "perly.y"
     { (yyval.opval) = dofile((ps[0].val.opval), (ps[-1].val.ival));}
 
     break;
 
   case 186:
-#line 1085 "perly.y" /* yacc.c:1646  */
+#line 1085 "perly.y"
     { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[0].val.opval)));}
 
     break;
 
   case 191:
-#line 1093 "perly.y" /* yacc.c:1646  */
+#line 1093 "perly.y"
     { (yyval.opval) = newCONDOP(0, (ps[-4].val.opval), (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 192:
-#line 1095 "perly.y" /* yacc.c:1646  */
+#line 1095 "perly.y"
     { (yyval.opval) = newUNOP(OP_REFGEN, 0, (ps[0].val.opval)); }
 
     break;
 
   case 193:
-#line 1097 "perly.y" /* yacc.c:1646  */
+#line 1097 "perly.y"
     { (yyval.opval) = newUNOP(OP_REFGEN, 0, localize((ps[0].val.opval),1)); }
 
     break;
 
   case 194:
-#line 1099 "perly.y" /* yacc.c:1646  */
+#line 1099 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 195:
-#line 1101 "perly.y" /* yacc.c:1646  */
+#line 1101 "perly.y"
     { (yyval.opval) = localize((ps[0].val.opval),0); }
 
     break;
 
   case 196:
-#line 1103 "perly.y" /* yacc.c:1646  */
+#line 1103 "perly.y"
     { (yyval.opval) = sawparens((ps[-1].val.opval)); }
 
     break;
 
   case 197:
-#line 1105 "perly.y" /* yacc.c:1646  */
+#line 1105 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 198:
-#line 1107 "perly.y" /* yacc.c:1646  */
+#line 1107 "perly.y"
     { (yyval.opval) = sawparens(newNULLLIST()); }
 
     break;
 
   case 199:
-#line 1109 "perly.y" /* yacc.c:1646  */
+#line 1109 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 200:
-#line 1111 "perly.y" /* yacc.c:1646  */
+#line 1111 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 201:
-#line 1113 "perly.y" /* yacc.c:1646  */
+#line 1113 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 202:
-#line 1115 "perly.y" /* yacc.c:1646  */
+#line 1115 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 203:
-#line 1117 "perly.y" /* yacc.c:1646  */
+#line 1117 "perly.y"
     { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[0].val.opval), OP_AV2ARYLEN));}
 
     break;
 
   case 204:
-#line 1119 "perly.y" /* yacc.c:1646  */
+#line 1119 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 205:
-#line 1121 "perly.y" /* yacc.c:1646  */
+#line 1121 "perly.y"
     { (yyval.opval) = op_prepend_elem(OP_ASLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_ASLICE, 0,
@@ -1603,7 +1603,7 @@ case 2:
     break;
 
   case 206:
-#line 1131 "perly.y" /* yacc.c:1646  */
+#line 1131 "perly.y"
     { (yyval.opval) = op_prepend_elem(OP_KVASLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_KVASLICE, 0,
@@ -1617,7 +1617,7 @@ case 2:
     break;
 
   case 207:
-#line 1141 "perly.y" /* yacc.c:1646  */
+#line 1141 "perly.y"
     { (yyval.opval) = op_prepend_elem(OP_HSLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_HSLICE, 0,
@@ -1631,7 +1631,7 @@ case 2:
     break;
 
   case 208:
-#line 1151 "perly.y" /* yacc.c:1646  */
+#line 1151 "perly.y"
     { (yyval.opval) = op_prepend_elem(OP_KVHSLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_KVHSLICE, 0,
@@ -1645,26 +1645,26 @@ case 2:
     break;
 
   case 209:
-#line 1161 "perly.y" /* yacc.c:1646  */
+#line 1161 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 210:
-#line 1163 "perly.y" /* yacc.c:1646  */
+#line 1163 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[0].val.opval))); }
 
     break;
 
   case 211:
-#line 1165 "perly.y" /* yacc.c:1646  */
+#line 1165 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[-2].val.opval)));
                        }
 
     break;
 
   case 212:
-#line 1168 "perly.y" /* yacc.c:1646  */
+#line 1168 "perly.y"
     {
                          (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST, (ps[-1].val.opval), scalar((ps[-3].val.opval))));
@@ -1673,7 +1673,7 @@ case 2:
     break;
 
   case 213:
-#line 1173 "perly.y" /* yacc.c:1646  */
+#line 1173 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            op_append_elem(OP_LIST, (ps[0].val.opval), scalar((ps[-1].val.opval))));
                        }
@@ -1681,130 +1681,130 @@ case 2:
     break;
 
   case 214:
-#line 1177 "perly.y" /* yacc.c:1646  */
+#line 1177 "perly.y"
     { (yyval.opval) = newSVREF((ps[-3].val.opval)); }
 
     break;
 
   case 215:
-#line 1179 "perly.y" /* yacc.c:1646  */
+#line 1179 "perly.y"
     { (yyval.opval) = newAVREF((ps[-3].val.opval)); }
 
     break;
 
   case 216:
-#line 1181 "perly.y" /* yacc.c:1646  */
+#line 1181 "perly.y"
     { (yyval.opval) = newHVREF((ps[-3].val.opval)); }
 
     break;
 
   case 217:
-#line 1183 "perly.y" /* yacc.c:1646  */
+#line 1183 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, 0,
                                       scalar(newCVREF((ps[-1].val.ival),(ps[-3].val.opval)))); }
 
     break;
 
   case 218:
-#line 1186 "perly.y" /* yacc.c:1646  */
+#line 1186 "perly.y"
     { (yyval.opval) = newGVREF(0,(ps[-3].val.opval)); }
 
     break;
 
   case 219:
-#line 1188 "perly.y" /* yacc.c:1646  */
+#line 1188 "perly.y"
     { (yyval.opval) = newOP((ps[0].val.ival), OPf_SPECIAL);
                            PL_hints |= HINT_BLOCK_SCOPE; }
 
     break;
 
   case 220:
-#line 1191 "perly.y" /* yacc.c:1646  */
+#line 1191 "perly.y"
     { (yyval.opval) = newLOOPEX((ps[-1].val.ival),(ps[0].val.opval)); }
 
     break;
 
   case 221:
-#line 1193 "perly.y" /* yacc.c:1646  */
+#line 1193 "perly.y"
     { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); }
 
     break;
 
   case 222:
-#line 1195 "perly.y" /* yacc.c:1646  */
+#line 1195 "perly.y"
     { (yyval.opval) = newOP((ps[0].val.ival), 0); }
 
     break;
 
   case 223:
-#line 1197 "perly.y" /* yacc.c:1646  */
+#line 1197 "perly.y"
     { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); }
 
     break;
 
   case 224:
-#line 1199 "perly.y" /* yacc.c:1646  */
+#line 1199 "perly.y"
     { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); }
 
     break;
 
   case 225:
-#line 1201 "perly.y" /* yacc.c:1646  */
+#line 1201 "perly.y"
     { (yyval.opval) = newOP(OP_REQUIRE, (ps[0].val.ival) ? OPf_SPECIAL : 0); }
 
     break;
 
   case 226:
-#line 1203 "perly.y" /* yacc.c:1646  */
+#line 1203 "perly.y"
     { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[-1].val.ival) ? OPf_SPECIAL : 0, (ps[0].val.opval)); }
 
     break;
 
   case 227:
-#line 1205 "perly.y" /* yacc.c:1646  */
+#line 1205 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); }
 
     break;
 
   case 228:
-#line 1207 "perly.y" /* yacc.c:1646  */
+#line 1207 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            op_append_elem(OP_LIST, (ps[0].val.opval), scalar((ps[-1].val.opval)))); }
 
     break;
 
   case 229:
-#line 1210 "perly.y" /* yacc.c:1646  */
+#line 1210 "perly.y"
     { (yyval.opval) = newOP((ps[0].val.ival), 0); }
 
     break;
 
   case 230:
-#line 1212 "perly.y" /* yacc.c:1646  */
+#line 1212 "perly.y"
     { (yyval.opval) = newOP((ps[-2].val.ival), 0);}
 
     break;
 
   case 231:
-#line 1214 "perly.y" /* yacc.c:1646  */
+#line 1214 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 232:
-#line 1216 "perly.y" /* yacc.c:1646  */
+#line 1216 "perly.y"
     { (yyval.opval) = (ps[-2].val.opval); }
 
     break;
 
   case 233:
-#line 1218 "perly.y" /* yacc.c:1646  */
+#line 1218 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); }
 
     break;
 
   case 234:
-#line 1220 "perly.y" /* yacc.c:1646  */
+#line 1220 "perly.y"
     { (yyval.opval) = ((ps[-2].val.ival) == OP_NOT)
                           ? newUNOP((ps[-2].val.ival), 0, newSVOP(OP_CONST, 0, newSViv(0)))
                           : newOP((ps[-2].val.ival), OPf_SPECIAL); }
@@ -1812,13 +1812,13 @@ case 2:
     break;
 
   case 235:
-#line 1224 "perly.y" /* yacc.c:1646  */
+#line 1224 "perly.y"
     { (yyval.opval) = newUNOP((ps[-3].val.ival), 0, (ps[-1].val.opval)); }
 
     break;
 
   case 236:
-#line 1226 "perly.y" /* yacc.c:1646  */
+#line 1226 "perly.y"
     {
                            if (   (ps[0].val.opval)->op_type != OP_TRANS
                                && (ps[0].val.opval)->op_type != OP_TRANSR
@@ -1833,115 +1833,115 @@ case 2:
     break;
 
   case 237:
-#line 1237 "perly.y" /* yacc.c:1646  */
+#line 1237 "perly.y"
     { (yyval.opval) = pmruntime((ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), 1, (ps[-4].val.ival)); }
 
     break;
 
   case 241:
-#line 1245 "perly.y" /* yacc.c:1646  */
+#line 1245 "perly.y"
     { (yyval.opval) = my_attrs((ps[-1].val.opval),(ps[0].val.opval)); }
 
     break;
 
   case 242:
-#line 1247 "perly.y" /* yacc.c:1646  */
+#line 1247 "perly.y"
     { (yyval.opval) = localize((ps[0].val.opval),1); }
 
     break;
 
   case 243:
-#line 1249 "perly.y" /* yacc.c:1646  */
+#line 1249 "perly.y"
     { (yyval.opval) = newUNOP(OP_REFGEN, 0, my_attrs((ps[-1].val.opval),(ps[0].val.opval))); }
 
     break;
 
   case 244:
-#line 1254 "perly.y" /* yacc.c:1646  */
+#line 1254 "perly.y"
     { (yyval.opval) = sawparens((ps[-1].val.opval)); }
 
     break;
 
   case 245:
-#line 1256 "perly.y" /* yacc.c:1646  */
+#line 1256 "perly.y"
     { (yyval.opval) = sawparens(newNULLLIST()); }
 
     break;
 
   case 246:
-#line 1259 "perly.y" /* yacc.c:1646  */
+#line 1259 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 247:
-#line 1261 "perly.y" /* yacc.c:1646  */
+#line 1261 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 248:
-#line 1263 "perly.y" /* yacc.c:1646  */
+#line 1263 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 249:
-#line 1268 "perly.y" /* yacc.c:1646  */
+#line 1268 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 250:
-#line 1270 "perly.y" /* yacc.c:1646  */
+#line 1270 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 251:
-#line 1274 "perly.y" /* yacc.c:1646  */
+#line 1274 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 252:
-#line 1276 "perly.y" /* yacc.c:1646  */
+#line 1276 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 253:
-#line 1280 "perly.y" /* yacc.c:1646  */
+#line 1280 "perly.y"
     { (yyval.opval) = NULL; }
 
     break;
 
   case 254:
-#line 1282 "perly.y" /* yacc.c:1646  */
+#line 1282 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 255:
-#line 1288 "perly.y" /* yacc.c:1646  */
+#line 1288 "perly.y"
     { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); }
 
     break;
 
   case 263:
-#line 1305 "perly.y" /* yacc.c:1646  */
+#line 1305 "perly.y"
     { (yyval.opval) = newCVREF((ps[-1].val.ival),(ps[0].val.opval)); }
 
     break;
 
   case 264:
-#line 1309 "perly.y" /* yacc.c:1646  */
+#line 1309 "perly.y"
     { (yyval.opval) = newSVREF((ps[0].val.opval)); }
 
     break;
 
   case 265:
-#line 1313 "perly.y" /* yacc.c:1646  */
+#line 1313 "perly.y"
     { (yyval.opval) = newAVREF((ps[0].val.opval));
                          if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival);
                        }
@@ -1949,7 +1949,7 @@ case 2:
     break;
 
   case 266:
-#line 1319 "perly.y" /* yacc.c:1646  */
+#line 1319 "perly.y"
     { (yyval.opval) = newHVREF((ps[0].val.opval));
                          if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival);
                        }
@@ -1957,71 +1957,72 @@ case 2:
     break;
 
   case 267:
-#line 1325 "perly.y" /* yacc.c:1646  */
+#line 1325 "perly.y"
     { (yyval.opval) = newAVREF((ps[0].val.opval)); }
 
     break;
 
   case 268:
-#line 1327 "perly.y" /* yacc.c:1646  */
+#line 1327 "perly.y"
     { (yyval.opval) = newAVREF((ps[-3].val.opval)); }
 
     break;
 
   case 269:
-#line 1331 "perly.y" /* yacc.c:1646  */
+#line 1331 "perly.y"
     { (yyval.opval) = newGVREF(0,(ps[0].val.opval)); }
 
     break;
 
   case 271:
-#line 1336 "perly.y" /* yacc.c:1646  */
+#line 1336 "perly.y"
     { (yyval.opval) = newAVREF((ps[-2].val.opval)); }
 
     break;
 
   case 273:
-#line 1341 "perly.y" /* yacc.c:1646  */
+#line 1341 "perly.y"
     { (yyval.opval) = newHVREF((ps[-2].val.opval)); }
 
     break;
 
   case 275:
-#line 1346 "perly.y" /* yacc.c:1646  */
+#line 1346 "perly.y"
     { (yyval.opval) = newGVREF(0,(ps[-2].val.opval)); }
 
     break;
 
   case 276:
-#line 1351 "perly.y" /* yacc.c:1646  */
+#line 1351 "perly.y"
     { (yyval.opval) = scalar((ps[0].val.opval)); }
 
     break;
 
   case 277:
-#line 1353 "perly.y" /* yacc.c:1646  */
+#line 1353 "perly.y"
     { (yyval.opval) = scalar((ps[0].val.opval)); }
 
     break;
 
   case 278:
-#line 1355 "perly.y" /* yacc.c:1646  */
+#line 1355 "perly.y"
     { (yyval.opval) = op_scope((ps[0].val.opval)); }
 
     break;
 
   case 279:
-#line 1358 "perly.y" /* yacc.c:1646  */
+#line 1358 "perly.y"
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
 
 
+
       default: break;
     
 
 /* Generated from:
  * 41d458c12a47d69d8ab1315970582b2055ecea77bfc8a582b557e9b3df1c290a perly.y
- * b6fae5748f9bef6db4740aa5e122b84ac5181852d42474d0ecad621fa4253306 regen_perly.pl
+ * 0947213b55d0ed11693554bea04987e886cf285f5c14cf9075fa1e7acc3f4061 regen_perly.pl
  * ex: set ro: */
diff --git a/perly.h b/perly.h
index 37b953c..2021a8b 100644 (file)
--- a/perly.h
+++ b/perly.h
@@ -4,14 +4,15 @@
    Any changes made here will be lost!
  */
 
-#define PERL_BISON_VERSION  30000
+#define PERL_BISON_VERSION  30004
 
 #ifdef PERL_CORE
-/* A Bison parser, made by GNU Bison 3.0.4.  */
+/* A Bison parser, made by GNU Bison 3.4.1.  */
 
 /* Bison interface for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation,
+   Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -39,6 +40,9 @@
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
+/* Undocumented macros, especially those whose name start with YY_,
+   are private implementation details.  Do not rely on them.  */
+
 /* Debug traces.  */
 #ifndef YYDEBUG
 # define YYDEBUG 0
@@ -165,7 +169,6 @@ S_is_opval_token(int type) {
 #endif /* PERL_IN_TOKE_C */
 #endif /* PERL_CORE */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-
 union YYSTYPE
 {
 
@@ -175,8 +178,8 @@ union YYSTYPE
     OP *opval;
     GV *gvval;
 
-};
 
+};
 typedef union YYSTYPE YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define YYSTYPE_IS_DECLARED 1
@@ -189,5 +192,5 @@ int yyparse (void);
 
 /* Generated from:
  * 41d458c12a47d69d8ab1315970582b2055ecea77bfc8a582b557e9b3df1c290a perly.y
- * b6fae5748f9bef6db4740aa5e122b84ac5181852d42474d0ecad621fa4253306 regen_perly.pl
+ * 0947213b55d0ed11693554bea04987e886cf285f5c14cf9075fa1e7acc3f4061 regen_perly.pl
  * ex: set ro: */
index 5f5658f..0d06e4d 100644 (file)
--- a/perly.tab
+++ b/perly.tab
 /* YYNSTATES -- Number of states.  */
 #define YYNSTATES  552
 
-/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
-   by yylex, with out-of-bounds checking.  */
 #define YYUNDEFTOK  2
 #define YYMAXUTOK   341
 
+/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
+   as returned by yylex, with out-of-bounds checking.  */
 #define YYTRANSLATE(YYX)                                                \
-  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+  ((unsigned) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
 
 /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
-   as returned by yylex, without out-of-bounds checking.  */
+   as returned by yylex.  */
 static const yytype_uint8 yytranslate[] =
 {
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -1131,5 +1131,5 @@ static const toketypes yy_type_tab[] =
 
 /* Generated from:
  * 41d458c12a47d69d8ab1315970582b2055ecea77bfc8a582b557e9b3df1c290a perly.y
- * b6fae5748f9bef6db4740aa5e122b84ac5181852d42474d0ecad621fa4253306 regen_perly.pl
+ * 0947213b55d0ed11693554bea04987e886cf285f5c14cf9075fa1e7acc3f4061 regen_perly.pl
  * ex: set ro: */
index 15e2d3e..642ad90 100644 (file)
  *     This symbol contains the ~name expanded version of PRIVLIB, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#define PRIVLIB "/sys/lib/perl/5.31.1"         /**/
-#define PRIVLIB_EXP "/sys/lib/perl/5.31.1"             /**/
+#define PRIVLIB "/sys/lib/perl/5.31.2"         /**/
+#define PRIVLIB_EXP "/sys/lib/perl/5.31.2"             /**/
 
 /* PTRSIZE:
  *     This symbol contains the size of a pointer, so that the C preprocessor
  *     removed.  The elements in inc_version_list (inc_version_list.U) can
  *     be tacked onto this variable to generate a list of directories to search.
  */
-#define SITELIB "/sys/lib/perl/5.31.1/site_perl"               /**/
-#define SITELIB_EXP "/sys/lib/perl/5.31.1/site_perl"           /**/
-#define SITELIB_STEM "/sys/lib/perl/5.31.1/site_perl"          /**/
+#define SITELIB "/sys/lib/perl/5.31.2/site_perl"               /**/
+#define SITELIB_EXP "/sys/lib/perl/5.31.2/site_perl"           /**/
+#define SITELIB_STEM "/sys/lib/perl/5.31.2/site_perl"          /**/
 
 /* Size_t_size:
  *     This symbol holds the size of a Size_t in bytes.
index 6921f50..472e20d 100644 (file)
@@ -31,12 +31,12 @@ afsroot='/afs'
 alignbytes='4'
 aphostname='/bin/uname -n'
 api_revision='5'
-api_subversion='1'
+api_subversion='2'
 api_version='31'
-api_versionstring='5.31.1'
+api_versionstring='5.31.2'
 ar='ar'
-archlib='/sys/lib/perl5/5.31.1/386'
-archlibexp='/sys/lib/perl5/5.31.1/386'
+archlib='/sys/lib/perl5/5.31.2/386'
+archlibexp='/sys/lib/perl5/5.31.2/386'
 archname64=''
 archname='386'
 archobjs=''
@@ -815,17 +815,17 @@ inc_version_list=' '
 inc_version_list_init='0'
 incpath=''
 inews=''
-installarchlib='/sys/lib/perl/5.31.1/386'
+installarchlib='/sys/lib/perl/5.31.2/386'
 installbin='/usr/bin'
 installman1dir='/sys/man/1pub'
 installman3dir='/sys/man/2pub'
 installprefix='/usr'
 installprefixexp='/usr'
-installprivlib='/sys/lib/perl/5.31.1'
+installprivlib='/sys/lib/perl/5.31.2'
 installscript='/usr/bin'
-installsitearch='/sys/lib/perl/5.31.1/site_perl/386'
+installsitearch='/sys/lib/perl/5.31.2/site_perl/386'
 installsitebin='/usr/bin'
-installsitelib='/sys/lib/perl/5.31.1/site_perl'
+installsitelib='/sys/lib/perl/5.31.2/site_perl'
 installstyle='lib/perl5'
 installusrbinperl='undef'
 installvendorarch=''
@@ -950,8 +950,8 @@ pmake=''
 pr=''
 prefix='/usr'
 prefixexp='/usr'
-privlib='/sys/lib/perl/5.31.1'
-privlibexp='/sys/lib/perl/5.31.1'
+privlib='/sys/lib/perl/5.31.2'
+privlibexp='/sys/lib/perl/5.31.2'
 procselfexe=''
 prototype='define'
 ptrsize='4'
@@ -1016,13 +1016,13 @@ sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 0'
 sig_size='50'
 signal_t='void'
-sitearch='/sys/lib/perl/5.31.1/site_perl/386'
+sitearch='/sys/lib/perl/5.31.2/site_perl/386'
 sitearchexp='/sys/lib/perl/site_perl/386'
 sitebin='/usr/bin'
 sitebinexp='/usr/bin'
-sitelib='/sys/lib/perl/5.31.1/site_perl'
-sitelib_stem='/sys/lib/perl/5.31.1/site_perl'
-sitelibexp='/sys/lib/perl/5.31.1/site_perl'
+sitelib='/sys/lib/perl/5.31.2/site_perl'
+sitelib_stem='/sys/lib/perl/5.31.2/site_perl'
+sitelibexp='/sys/lib/perl/5.31.2/site_perl'
 siteprefix='/usr'
 siteprefixexp='/usr'
 sizesize='4'
@@ -1055,7 +1055,7 @@ stdio_stream_array=''
 strerror_r_proto='0'
 strings='/sys/include/ape/string.h'
 submit=''
-subversion='1'
+subversion='2'
 sysman='/sys/man/1pub'
 tail=''
 tar=''
@@ -1136,8 +1136,8 @@ vendorlib_stem=''
 vendorlibexp=''
 vendorprefix=''
 vendorprefixexp=''
-version='5.31.1'
-version_patchlevel_string='version 31 subversion 1'
+version='5.31.2'
+version_patchlevel_string='version 31 subversion 2'
 versiononly='undef'
 vi=''
 xlibpth=''
@@ -1151,9 +1151,9 @@ config_args=''
 config_argc=0
 PERL_REVISION=5
 PERL_VERSION=31
-PERL_SUBVERSION=1
+PERL_SUBVERSION=2
 PERL_API_REVISION=5
 PERL_API_VERSION=31
-PERL_API_SUBVERSION=1
+PERL_API_SUBVERSION=2
 PERL_PATCHLEVEL=
 PERL_CONFIG_SH=true
index dcf717d..6e6ae58 100644 (file)
@@ -181,6 +181,7 @@ aux h2ph h2xs perlbug pl2pm pod2html pod2man splain xsubpp
 
     perlhist           Perl history records
     perldelta          Perl changes since previous version
+    perl5311delta      Perl changes in version 5.31.1
     perl5310delta      Perl changes in version 5.31.0
     perl5300delta      Perl changes in version 5.30.0
     perl5282delta      Perl changes in version 5.28.2
diff --git a/pod/perl5311delta.pod b/pod/perl5311delta.pod
new file mode 100644 (file)
index 0000000..eb29fb6
--- /dev/null
@@ -0,0 +1,418 @@
+=encoding utf8
+
+=head1 NAME
+
+perl5311delta - what is new for perl v5.31.1
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.31.0 release and the 5.31.1
+release.
+
+If you are upgrading from an earlier release such as 5.30.0, first read
+L<perl5310delta>, which describes differences between 5.30.0 and 5.31.0.
+
+=head1 Incompatible Changes
+
+=head2 Use of L<C<vec>|perlfunc/vec EXPR,OFFSET,BITS> on strings with code points above 0xFF is forbidden
+
+Such strings are represented internally in UTF-8, and C<vec> is a
+bit-oriented operation that will likely give unexpected results on those
+strings.  This was deprecated in perl 5.28.0.
+
+=head2 Use of code points over 0xFF in string bitwise operators
+
+Some uses of these were already illegal after a previous deprecation
+cycle.  The remaining uses are now prohibited, having been deprecated in perl
+5.28.0.  See L<perldeprecation>.
+
+=head2 C<Sys::Hostname::hostname()> does not accept arguments
+
+This usage was deprecated in perl 5.28.0 and is now fatal.
+
+=head1 Modules and Pragmata
+
+=head2 Updated Modules and Pragmata
+
+=over 4
+
+=item *
+
+L<Class::Struct> has been upgraded from version 0.65 to 0.66.
+
+=item *
+
+L<Compress::Raw::Bzip2> has been upgraded from version 2.084 to 2.086.
+
+=item *
+
+L<Compress::Raw::Zlib> has been upgraded from version 2.084 to 2.086.
+
+=item *
+
+L<CPAN> has been upgraded from version 2.22 to 2.27.
+
+=item *
+
+L<DB_File> has been upgraded from version 1.843 to 1.852.
+
+=item *
+
+L<Devel::PPPort> has been upgraded from version 3.52 to 3.53.
+
+=item *
+
+L<ExtUtils::CBuilder> has been upgraded from version 0.280231 to 0.280232.
+
+=item *
+
+L<ExtUtils::MakeMaker> has been upgraded from version 7.34 to 7.36.
+
+=item *
+
+L<I18N::LangTags> has been upgraded from version 0.43 to 0.44.
+
+=item *
+
+L<IO> has been upgraded from version 1.40 to 1.41.
+
+The supplied I<TO> is now always honoured on calls to the send()
+method.  L<[perl #133936]|https://rt.perl.org/Ticket/Display.html?id=133936>
+
+=item *
+
+L<IO::Compress> has been upgraded from version 2.084 to 2.086.
+
+=item *
+
+L<Module::CoreList> has been upgraded from version 5.20190524 to 5.20190620.
+
+=item *
+
+L<overload> has been upgraded from version 1.30 to 1.31.
+
+=item *
+
+L<Pod::Simple> has been upgraded from version 3.36 to 3.38.
+
+=item *
+
+L<podlators> has been upgraded from version 4.11 to 4.12.
+
+=item *
+
+L<POSIX> has been upgraded from version 1.88 to 1.89.
+
+=item *
+
+L<SelfLoader> has been upgraded from version 1.25 to 1.26.
+
+=item *
+
+L<Storable> has been upgraded from version 3.15 to 3.16.
+
+Regular expressions objects weren't properly counted for object id
+purposes on retrieve.  This would corrupt the resulting structure, or
+cause a runtime error in some cases.  L<[perl #134179]|https://rt.perl.org/Ticket/Display.html?id=134179>
+
+=item *
+
+L<Sys::Hostname> has been upgraded from version 1.22 to 1.23.
+
+=item *
+
+L<Test::Simple> has been upgraded from version 1.302162 to 1.302164.
+
+=item *
+
+L<Tie::File> has been upgraded from version 1.02 to 1.03.
+
+=item *
+
+L<Tie::Hash::NamedCapture> has been upgraded from version 0.10 to 0.11.
+
+=item *
+
+L<Time::HiRes> has been upgraded from version 1.9760 to 1.9761.
+
+=item *
+
+L<Unicode::Normalize> has been upgraded from version 1.26 to 1.27.
+
+=item *
+
+L<Unicode::UCD> has been upgraded from version 0.72 to 0.73.
+
+=item *
+
+L<warnings> has been upgraded from version 1.44 to 1.45.
+
+=item *
+
+L<XS::APItest> has been upgraded from version 1.00 to 1.01.
+
+=back
+
+=head2 Removed Modules and Pragmata
+
+=over 4
+
+=item *
+
+Pod::Parser has been removed from the core distribution.
+It still is available for download from CPAN.  This resolves L<[perl
+#119439]|https://rt.perl.org/Ticket/Display.html?id=119439>.
+
+=back
+
+=head1 Documentation
+
+=head2 Changes to Existing Documentation
+
+We have attempted to update the documentation to reflect the changes
+listed in this document.  If you find any we have missed, send email
+to L<perlbug@perl.org|mailto:perlbug@perl.org>.
+
+Additionally, the following selected changes have been made:
+
+=head3 L<perlguts>
+
+=over 4
+
+=item *
+
+Documentation about embed.fnc flags has been removed. F<embed.fnc> now has
+sufficient comments within it.  Anyone changing that file will see those
+comments first, so entries here are now redundant.
+
+=back
+
+=head3 L<perlpod>
+
+=over 4
+
+=item *
+
+Advice has been added regarding the usage of C<< ZE<lt>E<gt> >>.
+
+=back
+
+=head1 Configuration and Compilation
+
+=over 4
+
+=item *
+
+F<autodoc.pl>
+
+This tool that regenerates L<perlintern> and L<perlapi> has been overhauled
+significantly, restoring consistency in flags used in F<embed.fnc> and
+L<Devel::PPPort> and allowing removal of many redundant C<=for apidoc>
+entries in code.
+
+=back
+
+=head1 Platform Support
+
+=head2 Discontinued Platforms
+
+=over 4
+
+=item Windows CE
+
+Support for building perl on Windows CE has now been removed.
+
+=back
+
+=head1 Internal Changes
+
+=over 4
+
+=item *
+
+L<eval_pv()|perlapi/eval_pv> no longer stringifies the exception when
+C<croak_on_error> is true.  L<[perl #134175]|https://rt.perl.org/Ticket/Display.html?id=134175>
+
+=back
+
+=head1 Selected Bug Fixes
+
+=over 4
+
+=item *
+
+Setting C<$)> now properly sets supplementary group ids if you have
+the necessary privileges.  L<[perl #134169]|https://rt.perl.org/Ticket/Display.html?id=134169>
+
+=item *
+
+close() on a pipe now preemptively clears the PerlIO object from the
+IO SV.  This prevents a second attempt to close the already closed
+PerlIO object if a signal handler calls die() or exit() while close()
+is waiting for the child process to complete.  L<[perl #122112]|https://rt.perl.org/Ticket/Display.html?id=122112>
+
+=item *
+
+C<< sprintf("%.*a", -10000, $x) >> would cause a buffer overflow due
+to mishandling of the negative precision value.  L<[perl #134008]|https://rt.perl.org/Ticket/Display.html?id=134008>
+
+=item *
+
+scalar() on a reference could cause an erroneous assertion failure
+during compilation.  L<[perl #134045]|https://rt.perl.org/Ticket/Display.html?id=134045>
+
+=item *
+
+C<%{^CAPTURE_ALL}> is now an alias to C<%-> as documented, rather than
+incorrectly an alias for C<%+>.  L<[perl #131867]|https://rt.perl.org/Ticket/Display.html?id=131867>
+
+=item *
+
+C<%{^CAPTURE}> didn't work if C<@{^CAPTURE}> was mentioned first.
+Similarly for C<%{^CAPTURE_ALL}> and C<@{^CAPTURE_ALL}>, though
+C<@{^CAPTURE_ALL}> currently isn't used.  L<[perl #131193]|https://rt.perl.org/Ticket/Display.html?id=131193>
+
+=item *
+
+Extraordinarily large (over 2GB) floating point format widths could
+cause an integer overflow in the underlying call to snprintf(),
+resulting in an assertion.  Formatted floating point widths are now
+limited to the range of int, the return value of snprintf().  L<[perl
+#133913]|https://rt.perl.org/Ticket/Display.html?id=133913>
+
+=item *
+
+Parsing the following constructs within a sub-parse (such as with
+C<"${code here}"> or C<s/.../code here/e>) has changed to match how
+they're parsed normally:
+
+=over
+
+=item *
+
+C<print $fh ...> no longer produces a syntax error.
+
+=item *
+
+Code like C<s/.../ ${time} /e> now properly produces an "Ambiguous use
+of ${time} resolved to $time at ..." warning when warnings are enabled.
+
+=item *
+
+C<@x {"a"}> (with the space) in a sub-parse now properly produces a
+"better written as" warning when warnings are enabled.
+
+=item *
+
+attributes can now be used in a sub-parse.
+
+=back
+
+L<[perl #133850]|https://rt.perl.org/Ticket/Display.html?id=133850>
+
+=item *
+
+Incomplete hex and binary literals like C<0x> and C<0b> are now
+treated as if the C<x> or C<b> is part of the next token.  L<[perl
+#134125]|https://rt.perl.org/Ticket/Display.html?id=134125>
+
+=item *
+
+A spurious C<)> in a subparse, such as in C<s/.../code here/e> or
+C<"...${code here}">, no longer confuses the parser.
+
+Previously a subparse was bracketed with generated C<(> and C<)>
+tokens, so a spurious C<)> would close the construct without doing the
+normal subparse clean up, confusing the parser and possible causing an
+assertion failure.
+
+Such constructs are now surrounded by artificial tokens that can't be
+included in the source.  L<[perl #130585]|https://rt.perl.org/Ticket/Display.html?id=130585>
+
+=item *
+
+Reference assignment of a sub, such as C<\&foo = \&bar;>, silently did
+nothing in the C<main::> package.  L<[perl #134072]|https://rt.perl.org/Ticket/Display.html?id=134072>
+
+=item *
+
+sv_gets() now recovers better if the target SV is modified by a signal
+handler.  L<[perl #134035]|https://rt.perl.org/Ticket/Display.html?id=134035>
+
+=item *
+
+C<readline @foo> now evaluates C<@foo> in scalar context.  Previously
+it would be evalauted in list context, and since readline() pops only
+one argument from the stack, the stack could underflow, or be left
+with unexpected values on the stack.  L<[perl #133989]|https://rt.perl.org/Ticket/Display.html?id=133989>
+
+=back
+
+=head1 Acknowledgements
+
+Perl 5.31.1 represents approximately 4 weeks of development since Perl
+5.31.0 and contains approximately 37,000 lines of changes across 500 files
+from 20 authors.
+
+Excluding auto-generated files, documentation and release tools, there were
+approximately 19,000 lines of changes to 340 .pm, .t, .c and .h files.
+
+Perl continues to flourish into its fourth decade thanks to a vibrant
+community of users and developers. The following people are known to have
+contributed the improvements that became Perl 5.31.1:
+
+Alexandr Savca, Andreas König, Chris 'BinGOs' Williams, Dagfinn Ilmari
+MannsÃ¥ker, Dominic Hargreaves, Graham Knop, Hugo van der Sanden, James E
+Keenan, Jerome Duval, Karen Etheridge, Karl Williamson, Manuel Mausz,
+Michael Haardt, Nicolas R., Pali, Richard Leach, Sawyer X, Steve Hay, Tony
+Cook, Vickenty Fesunov.
+
+The list above is almost certainly incomplete as it is automatically
+generated from version control history. In particular, it does not include
+the names of the (very much appreciated) contributors who reported issues to
+the Perl bug tracker.
+
+Many of the changes included in this version originated in the CPAN modules
+included in Perl's core. We're grateful to the entire CPAN community for
+helping Perl to flourish.
+
+For a more complete list of all of Perl's historical contributors, please
+see the F<AUTHORS> file in the Perl source distribution.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the perl bug database
+at L<https://rt.perl.org/>.  There may also be information at
+L<http://www.perl.org/>, the Perl Home Page.
+
+If you believe you have an unreported bug, please run the L<perlbug> program
+included with your release.  Be sure to trim your bug down to a tiny but
+sufficient test case.  Your bug report, along with the output of C<perl -V>,
+will be sent off to perlbug@perl.org to be analysed by the Perl porting team.
+
+If the bug you are reporting has security implications which make it
+inappropriate to send to a publicly archived mailing list, then see
+L<perlsec/SECURITY VULNERABILITY CONTACT INFORMATION>
+for details of how to report the issue.
+
+=head1 Give Thanks
+
+If you wish to thank the Perl 5 Porters for the work we had done in Perl 5,
+you can do so by running the C<perlthanks> program:
+
+    perlthanks
+
+This will send an email to the Perl 5 Porters list with your show of thanks.
+
+=head1 SEE ALSO
+
+The F<Changes> file for an explanation of how to view exhaustive details on
+what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
index 8430e27..b924689 100644 (file)
@@ -611,11 +611,17 @@ will be lost.
  ANYOFPOSIXL      sv         Like ANYOFL, but matches [[:posix:]]
                   charclass_ classes
                   posixl
+
  ANYOFH           sv 1       Like ANYOF, but only has "High" matches,
-                             none in the bitmap;
+                             none in the bitmap; the flags field
+                             contains the lowest matchable UTF-8 start
+                             byte
  ANYOFHb          sv 1       Like ANYOFH, but all matches share the same
-                             first byte, the repurposed flags field
-                             contains it
+                             UTF-8 start byte, given in the flags field
+ ANYOFHr          sv 1       Like ANYOFH, but the flags field contains
+                             packed bounds for all matchable UTF-8 start
+                             bytes.
+
  ANYOFM           byte 1     Like ANYOF, but matches an invariant byte
                              as determined by the mask and arg
  NANYOFM          byte 1     complement of ANYOFM
index e274f62..f112a53 100644 (file)
@@ -2,33 +2,15 @@
 
 =head1 NAME
 
-perldelta - what is new for perl v5.31.1
+perldelta - what is new for perl v5.31.2
 
 =head1 DESCRIPTION
 
-This document describes differences between the 5.31.0 release and the 5.31.1
+This document describes differences between the 5.31.1 release and the 5.31.2
 release.
 
-If you are upgrading from an earlier release such as 5.30.0, first read
-L<perl5310delta>, which describes differences between 5.30.0 and 5.31.0.
-
-=head1 Incompatible Changes
-
-=head2 Use of L<C<vec>|perlfunc/vec EXPR,OFFSET,BITS> on strings with code points above 0xFF is forbidden
-
-Such strings are represented internally in UTF-8, and C<vec> is a
-bit-oriented operation that will likely give unexpected results on those
-strings.  This was deprecated in perl 5.28.0.
-
-=head2 Use of code points over 0xFF in string bitwise operators
-
-Some uses of these were already illegal after a previous deprecation
-cycle.  The remaining uses are now prohibited, having been deprecated in perl
-5.28.0.  See L<perldeprecation>.
-
-=head2 C<Sys::Hostname::hostname()> does not accept arguments
-
-This usage was deprecated in perl 5.28.0 and is now fatal.
+If you are upgrading from an earlier release such as 5.31.0, first read
+L<perl5311delta>, which describes differences between 5.31.0 and 5.31.1.
 
 =head1 Modules and Pragmata
 
@@ -38,351 +20,234 @@ This usage was deprecated in perl 5.28.0 and is now fatal.
 
 =item *
 
-L<Class::Struct> has been upgraded from version 0.65 to 0.66.
-
-=item *
-
-L<Compress::Raw::Bzip2> has been upgraded from version 2.084 to 2.086.
-
-=item *
-
-L<Compress::Raw::Zlib> has been upgraded from version 2.084 to 2.086.
-
-=item *
-
-L<CPAN> has been upgraded from version 2.22 to 2.27.
-
-=item *
-
-L<DB_File> has been upgraded from version 1.843 to 1.852.
-
-=item *
-
-L<Devel::PPPort> has been upgraded from version 3.52 to 3.53.
-
-=item *
-
-L<ExtUtils::CBuilder> has been upgraded from version 0.280231 to 0.280232.
-
-=item *
-
-L<ExtUtils::MakeMaker> has been upgraded from version 7.34 to 7.36.
-
-=item *
-
-L<I18N::LangTags> has been upgraded from version 0.43 to 0.44.
-
-=item *
-
-L<IO> has been upgraded from version 1.40 to 1.41.
-
-The supplied I<TO> is now always honoured on calls to the send()
-method.  L<[perl #133936]|https://rt.perl.org/Ticket/Display.html?id=133936>
-
-=item *
-
-L<IO::Compress> has been upgraded from version 2.084 to 2.086.
-
-=item *
-
-L<Module::CoreList> has been upgraded from version 5.20190524 to 5.20190620.
+L<Devel::PPPort> has been upgraded from version 3.53 to 3.54.
 
 =item *
 
-L<overload> has been upgraded from version 1.30 to 1.31.
+L<Exporter> has been upgraded from version 5.73 to 5.74.
 
 =item *
 
-L<Pod::Simple> has been upgraded from version 3.36 to 3.38.
+L<IPC::Cmd> has been upgraded from version 1.02 to 1.04.
 
 =item *
 
-L<podlators> has been upgraded from version 4.11 to 4.12.
+L<JSON::PP> has been upgraded from version 4.02 to 4.04.
 
 =item *
 
-L<POSIX> has been upgraded from version 1.88 to 1.89.
+L<Module::CoreList> has been upgraded from version 5.20190620 to 5.20190720.
 
 =item *
 
-L<SelfLoader> has been upgraded from version 1.25 to 1.26.
+L<Opcode> has been upgraded from version 1.43 to 1.44.
 
 =item *
 
-L<Storable> has been upgraded from version 3.15 to 3.16.
-
-Regular expressions objects weren't properly counted for object id
-purposes on retrieve.  This would corrupt the resulting structure, or
-cause a runtime error in some cases.  L<[perl #134179]|https://rt.perl.org/Ticket/Display.html?id=134179>
+L<PerlIO::encoding> has been upgraded from version 0.27 to 0.28.
 
 =item *
 
-L<Sys::Hostname> has been upgraded from version 1.22 to 1.23.
+L<Pod::Simple> has been upgraded from version 3.38 to 3.39.
 
 =item *
 
-L<Test::Simple> has been upgraded from version 1.302162 to 1.302164.
+L<threads::shared> has been upgraded from version 1.60 to 1.61.
 
-=item *
-
-L<Tie::File> has been upgraded from version 1.02 to 1.03.
-
-=item *
-
-L<Tie::Hash::NamedCapture> has been upgraded from version 0.10 to 0.11.
-
-=item *
-
-L<Time::HiRes> has been upgraded from version 1.9760 to 1.9761.
+=back
 
-=item *
+=head1 Diagnostics
 
-L<Unicode::Normalize> has been upgraded from version 1.26 to 1.27.
+=head2 New Diagnostics
 
-=item *
+=head3 New Errors
 
-L<Unicode::UCD> has been upgraded from version 0.72 to 0.73.
+=over 4
 
 =item *
 
-L<warnings> has been upgraded from version 1.44 to 1.45.
-
-=item *
+C<L<No digits found for %s literal|perldiag/"No digits found for %s literal">>
 
-L<XS::APItest> has been upgraded from version 1.00 to 1.01.
+(F) No hexadecimal digits were found following C<0x> or no binary digits were
+found following C<0b>.
 
 =back
 
-=head2 Removed Modules and Pragmata
+=head2 Changes to Existing Diagnostics
 
 =over 4
 
 =item *
 
-Pod::Parser has been removed from the core distribution.
-It still is available for download from CPAN.  This resolves L<[perl
-#119439]|https://rt.perl.org/Ticket/Display.html?id=119439>.
-
-=back
-
-=head1 Documentation
-
-=head2 Changes to Existing Documentation
-
-We have attempted to update the documentation to reflect the changes
-listed in this document.  If you find any we have missed, send email
-to L<perlbug@perl.org|mailto:perlbug@perl.org>.
-
-Additionally, the following selected changes have been made:
-
-=head3 L<perlguts>
-
-=over 4
-
-=item *
+C<\N{} here is restricted to one character> is now emitted in the same
+circumstances where previously C<\N{} in inverted character class or as a range
+end-point is restricted to one character> was.
 
-Documentation about embed.fnc flags has been removed. F<embed.fnc> now has
-sufficient comments within it.  Anyone changing that file will see those
-comments first, so entries here are now redundant.
+This is due to new circumstances having been added in Perl 5.30 that weren't
+covered by the earlier wording.
 
 =back
 
-=head3 L<perlpod>
+=head1 Configuration and Compilation
 
 =over 4
 
 =item *
 
-Advice has been added regarding the usage of C<< ZE<lt>E<gt> >>.
-
-=back
-
-=head1 Configuration and Compilation
-
-=over 4
+The C<ECHO> macro is now defined.  This is used in a C<dtrace> rule that was
+originally changed for FreeBSD, and the FreeBSD make apparently predefines it.
+The Solaris make does not predefine C<ECHO> which broke this rule on Solaris.
+L<[perl #134218]|https://rt.perl.org/Ticket/Display.html?id=134218>
 
 =item *
 
-F<autodoc.pl>
-
-This tool that regenerates L<perlintern> and L<perlapi> has been overhauled
-significantly, restoring consistency in flags used in F<embed.fnc> and
-L<Devel::PPPort> and allowing removal of many redundant C<=for apidoc>
-entries in code.
+Bison versions 3.1 through 3.4 are now supported.
 
 =back
 
 =head1 Platform Support
 
-=head2 Discontinued Platforms
+=head2 Platform-Specific Notes
 
 =over 4
 
-=item Windows CE
-
-Support for building perl on Windows CE has now been removed.
-
-=back
-
-=head1 Internal Changes
+=item Linux
 
-=over 4
+C<cc> will be used to populate C<plibpth> if C<cc> is C<clang>.
+L<[perl #134189]|https://rt.perl.org/Ticket/Display.html?id=134189>
 
-=item *
+=item VMS
 
-L<eval_pv()|perlapi/eval_pv> no longer stringifies the exception when
-C<croak_on_error> is true.  L<[perl #134175]|https://rt.perl.org/Ticket/Display.html?id=134175>
+C<-Duse64bitint> is now the default on VMS.
 
 =back
 
-=head1 Selected Bug Fixes
+=head1 Internal Changes
 
 =over 4
 
 =item *
 
-Setting C<$)> now properly sets supplementary group ids if you have
-the necessary privileges.  L<[perl #134169]|https://rt.perl.org/Ticket/Display.html?id=134169>
+The PERL_DESTRUCT_LEVEL environment variable was formerly only honoured on perl
+binaries built with DEBUGGING support.  It is now checked on all perl builds.
+Its normal use is to force perl to individually free every block of memory
+which it has allocated before exiting, which is useful when using automated
+leak detection tools such as valgrind.
 
 =item *
 
-close() on a pipe now preemptively clears the PerlIO object from the
-IO SV.  This prevents a second attempt to close the already closed
-PerlIO object if a signal handler calls die() or exit() while close()
-is waiting for the child process to complete.  L<[perl #122112]|https://rt.perl.org/Ticket/Display.html?id=122112>
+The API eval_sv() now accepts a C<G_RETHROW> flag.  If this flag is set and an
+exception is thrown while compiling or executing the supplied code, it will be
+rethrown, and eval_sv() will not return.
+L<[perl #134177]|https://rt.perl.org/Ticket/Display.html?id=134177>
 
 =item *
 
-C<< sprintf("%.*a", -10000, $x) >> would cause a buffer overflow due
-to mishandling of the negative precision value.  L<[perl #134008]|https://rt.perl.org/Ticket/Display.html?id=134008>
+As part of the fix for
+L<[perl #2754]|https://rt.perl.org/Ticket/Display.html?id=2754> perl_parse()
+now returns non-zero if exit(0) is called in a C<BEGIN>, C<UNITCHECK> or
+C<CHECK> block.
 
 =item *
 
-scalar() on a reference could cause an erroneous assertion failure
-during compilation.  L<[perl #134045]|https://rt.perl.org/Ticket/Display.html?id=134045>
+Most functions which recursively walked an op tree during compilation have been
+made non-recursive.  This avoids SEGVs from stack overflow when the op tree is
+deeply nested, such as C<$n == 1 ? "one" : $n == 2 ? "two" : ....> (especially
+in code which is auto-generated).
 
-=item *
+This is particularly noticeable where the code is compiled within a separate
+thread, as threads tend to have small stacks by default.
 
-C<%{^CAPTURE_ALL}> is now an alias to C<%-> as documented, rather than
-incorrectly an alias for C<%+>.  L<[perl #131867]|https://rt.perl.org/Ticket/Display.html?id=131867>
-
-=item *
-
-C<%{^CAPTURE}> didn't work if C<@{^CAPTURE}> was mentioned first.
-Similarly for C<%{^CAPTURE_ALL}> and C<@{^CAPTURE_ALL}>, though
-C<@{^CAPTURE_ALL}> currently isn't used.  L<[perl #131193]|https://rt.perl.org/Ticket/Display.html?id=131193>
+=back
 
-=item *
+=head1 Selected Bug Fixes
 
-Extraordinarily large (over 2GB) floating point format widths could
-cause an integer overflow in the underlying call to snprintf(),
-resulting in an assertion.  Formatted floating point widths are now
-limited to the range of int, the return value of snprintf().  L<[perl
-#133913]|https://rt.perl.org/Ticket/Display.html?id=133913>
+=over 4
 
 =item *
 
-Parsing the following constructs within a sub-parse (such as with
-C<"${code here}"> or C<s/.../code here/e>) has changed to match how
-they're parsed normally:
-
-=over
+Parsing incomplete hex or binary literals was changed in 5.31.1 to treat such a
+literal as just the 0, leaving the following C<x> or C<b> to be parsed as part
+of the next token.  This could lead to some silent changes in behaviour, so now
+incomplete hex or binary literals produce a fatal error.
+L<[perl #134125]|https://rt.perl.org/Ticket/Display.html?id=134125>
 
 =item *
 
-C<print $fh ...> no longer produces a syntax error.
+eval_pv()'s I<croak_on_error> flag will now throw even if the exception is a
+false overloaded value.
+L<[perl #134177]|https://rt.perl.org/Ticket/Display.html?id=134177>
 
 =item *
 
-Code like C<s/.../ ${time} /e> now properly produces an "Ambiguous use
-of ${time} resolved to $time at ..." warning when warnings are enabled.
+C<INIT> blocks and the program itself are no longer run if exit(0) is called
+within a C<BEGIN>, C<UNITCHECK> or C<CHECK> block.
+L<[perl #2754]|https://rt.perl.org/Ticket/Display.html?id=2754>
 
 =item *
 
-C<@x {"a"}> (with the space) in a sub-parse now properly produces a
-"better written as" warning when warnings are enabled.
+C<<< open my $fh, ">>+", undef >>> now opens the temporary file in append mode
+- writes will seek to the end of file before writing.
+L<[perl #134221]|https://rt.perl.org/Ticket/Display.html?id=134221>
 
 =item *
 
-attributes can now be used in a sub-parse.
+Fixed a SEGV when searching for the source of an uninitialized value warning on
+an op whose subtree includes an OP_MULTIDEREF.
+L<[perl #134275]|https://rt.perl.org/Ticket/Display.html?id=134275>
 
 =back
 
-L<[perl #133850]|https://rt.perl.org/Ticket/Display.html?id=133850>
-
-=item *
-
-Incomplete hex and binary literals like C<0x> and C<0b> are now
-treated as if the C<x> or C<b> is part of the next token.  L<[perl
-#134125]|https://rt.perl.org/Ticket/Display.html?id=134125>
-
-=item *
+=head1 Known Problems
 
-A spurious C<)> in a subparse, such as in C<s/.../code here/e> or
-C<"...${code here}">, no longer confuses the parser.
-
-Previously a subparse was bracketed with generated C<(> and C<)>
-tokens, so a spurious C<)> would close the construct without doing the
-normal subparse clean up, confusing the parser and possible causing an
-assertion failure.
-
-Such constructs are now surrounded by artificial tokens that can't be
-included in the source.  L<[perl #130585]|https://rt.perl.org/Ticket/Display.html?id=130585>
-
-=item *
-
-Reference assignment of a sub, such as C<\&foo = \&bar;>, silently did
-nothing in the C<main::> package.  L<[perl #134072]|https://rt.perl.org/Ticket/Display.html?id=134072>
+=over 4
 
 =item *
 
-sv_gets() now recovers better if the target SV is modified by a signal
-handler.  L<[perl #134035]|https://rt.perl.org/Ticket/Display.html?id=134035>
+The VC++ 6.0 build on Windows is currently broken.  Support for this compiler
+is likely to be removed in the near future.
 
 =item *
 
-C<readline @foo> now evaluates C<@foo> in scalar context.  Previously
-it would be evalauted in list context, and since readline() pops only
-one argument from the stack, the stack could underflow, or be left
-with unexpected values on the stack.  L<[perl #133989]|https://rt.perl.org/Ticket/Display.html?id=133989>
+Tests 9-11 in F<t/op/blocks.t> currently fail on Windows.
+L<[perl #134295]|https://rt.perl.org/Ticket/Display.html?id=134295>
 
 =back
 
 =head1 Acknowledgements
 
-Perl 5.31.1 represents approximately 4 weeks of development since Perl
-5.31.0 and contains approximately 37,000 lines of changes across 500 files
-from 20 authors.
+Perl 5.31.2 represents approximately 4 weeks of development since Perl 5.31.1
+and contains approximately 7,600 lines of changes across 190 files from 16
+authors.
 
 Excluding auto-generated files, documentation and release tools, there were
-approximately 19,000 lines of changes to 340 .pm, .t, .c and .h files.
+approximately 3,100 lines of changes to 99 .pm, .t, .c and .h files.
 
-Perl continues to flourish into its fourth decade thanks to a vibrant
-community of users and developers. The following people are known to have
-contributed the improvements that became Perl 5.31.1:
+Perl continues to flourish into its fourth decade thanks to a vibrant community
+of users and developers.  The following people are known to have contributed
+the improvements that became Perl 5.31.2:
 
-Alexandr Savca, Andreas König, Chris 'BinGOs' Williams, Dagfinn Ilmari
-MannsÃ¥ker, Dominic Hargreaves, Graham Knop, Hugo van der Sanden, James E
-Keenan, Jerome Duval, Karen Etheridge, Karl Williamson, Manuel Mausz,
-Michael Haardt, Nicolas R., Pali, Richard Leach, Sawyer X, Steve Hay, Tony
-Cook, Vickenty Fesunov.
+Alexandr Savca, Chris 'BinGOs' Williams, Craig A. Berry, Dagfinn Ilmari
+MannsÃ¥ker, David Mitchell, H.Merijn Brand, James E Keenan, Karen Etheridge,
+Karl Williamson, Nicolas R., Pali, Paul Evans, Richard Leach, Steve Hay,
+Svyatoslav, Tony Cook.
 
-The list above is almost certainly incomplete as it is automatically
-generated from version control history. In particular, it does not include
-the names of the (very much appreciated) contributors who reported issues to
-the Perl bug tracker.
+The list above is almost certainly incomplete as it is automatically generated
+from version control history.  In particular, it does not include the names of
+the (very much appreciated) contributors who reported issues to the Perl bug
+tracker.
 
 Many of the changes included in this version originated in the CPAN modules
-included in Perl's core. We're grateful to the entire CPAN community for
+included in Perl's core.  We're grateful to the entire CPAN community for
 helping Perl to flourish.
 
-For a more complete list of all of Perl's historical contributors, please
-see the F<AUTHORS> file in the Perl source distribution.
+For a more complete list of all of Perl's historical contributors, please see
+the F<AUTHORS> file in the Perl source distribution.
 
 =head1 Reporting Bugs
 
-If you find what you think is a bug, you might check the perl bug database
-at L<https://rt.perl.org/>.  There may also be information at
+If you find what you think is a bug, you might check the perl bug database at
+L<https://rt.perl.org/>.  There may also be information at
 L<http://www.perl.org/>, the Perl Home Page.
 
 If you believe you have an unreported bug, please run the L<perlbug> program
@@ -392,13 +257,13 @@ will be sent off to perlbug@perl.org to be analysed by the Perl porting team.
 
 If the bug you are reporting has security implications which make it
 inappropriate to send to a publicly archived mailing list, then see
-L<perlsec/SECURITY VULNERABILITY CONTACT INFORMATION>
-for details of how to report the issue.
+L<perlsec/SECURITY VULNERABILITY CONTACT INFORMATION> for details of how to
+report the issue.
 
 =head1 Give Thanks
 
-If you wish to thank the Perl 5 Porters for the work we had done in Perl 5,
-you can do so by running the C<perlthanks> program:
+If you wish to thank the Perl 5 Porters for the work we had done in Perl 5, you
+can do so by running the C<perlthanks> program:
 
     perlthanks
 
index 166d29b..f9c023d 100644 (file)
@@ -4007,7 +4007,7 @@ bracketed character class, for the same reason that C<.> in a character
 class loses its specialness: it matches almost everything, which is
 probably not what you want.
 
-=item \N{} in inverted character class or as a range end-point is restricted to one character in regex; marked by <-- HERE in m/%s/
+=item \N{} here is restricted to one character in regex; marked by <-- HERE in m/%s/
 
 (F) Named Unicode character escapes (C<\N{...}>) may return a
 multi-character sequence.  Even though a character class is
@@ -4100,6 +4100,11 @@ for some reason the current debugger (e.g. F<perl5db.pl> or a C<Devel::>
 module) didn't define a C<DB::sub> routine to be called at the beginning
 of each ordinary subroutine call.
 
+=item No digits found for %s literal
+
+(F) No hexadecimal digits were found following C<0x> or no binary digits
+were found following C<0b>.
+
 =item No directory specified for -I
 
 (F) The B<-I> command-line switch requires a directory name as part of the
index cef9a77..5444c48 100644 (file)
@@ -672,6 +672,7 @@ the strings?).
 
  Sawyer X  5.31.0       2018-May-24     The 5.31 development track
  Ether     5.31.1       2019-Jun-20
+ Steve     5.31.2       2019-Jul-20
 
 =head2 SELECTED RELEASE SIZES
 
index 5c168c1..5ba3afb 100644 (file)
@@ -248,8 +248,8 @@ To get at hash elements:
 You can get at lists of keys and values with C<keys()> and
 C<values()>.
 
- my @fruits = keys %fruit_colors;
- my @colors = values %fruit_colors;
+ my @fruits = keys %fruit_color;
+ my @colors = values %fruit_color;
 
 Hashes have no particular internal order, though you can sort the keys
 and loop through them.
index 15498d9..905be3c 100644 (file)
@@ -42,9 +42,13 @@ C<ge>.  Starting in v5.26, Perl can handle these reasonably as well,
 depending on the platform's implementation.  However, for earlier
 releases or for better control, use L<Unicode::Collate>.  There are
 actually two slightly different types of UTF-8 locales: one for Turkic
-languages and one for everything else.  Starting in Perl v5.30, Perl
-seamlessly handles both types; previously only the non-Turkic one was
-supported.
+languages and one for everything else.
+
+Starting in Perl v5.30, Perl detects Turkic locales by their
+behaviour, and seamlessly handles both types; previously only the
+non-Turkic one was supported.  The name of the locale is ignored, if
+your system has a C<tr_TR.UTF-8> locale and it doesn't behave like a
+Turkic locale, perl will treat it like a non-Turkic locale.
 
 Perl continues to support the old non UTF-8 locales as well.  There are
 currently no UTF-8 locales for EBCDIC platforms.
diff --git a/pp.h b/pp.h
index 54a19ed..d4176db 100644 (file)
--- a/pp.h
+++ b/pp.h
 /*
 =head1 Stack Manipulation Macros
 
-=for apidoc AmU||SP
+=for apidoc AmnU||SP
 Stack pointer.  This is usually handled by C<xsubpp>.  See C<L</dSP>> and
 C<SPAGAIN>.
 
-=for apidoc AmU||MARK
+=for apidoc AmnU||MARK
 Stack marker variable for the XSUB.  See C<L</dMARK>>.
 
 =for apidoc Am|void|PUSHMARK|SP
@@ -42,7 +42,7 @@ C<L</dORIGMARK>>.
 =for apidoc Amns||dORIGMARK
 Saves the original stack mark for the XSUB.  See C<L</ORIGMARK>>.
 
-=for apidoc AmU||ORIGMARK
+=for apidoc AmnU||ORIGMARK
 The original stack mark for the XSUB.  See C<L</dORIGMARK>>.
 
 =for apidoc Amns||SPAGAIN
@@ -243,7 +243,7 @@ Push an SV onto the stack and mortalizes the SV.  The stack must have room
 for this element.  Does not use C<TARG>.  See also C<L</PUSHs>> and
 C<L</mXPUSHs>>.
 
-=for apidoc Am|void|PUSHmortal
+=for apidoc Amn|void|PUSHmortal
 Push a new mortal SV onto the stack.  The stack must have room for this
 element.  Does not use C<TARG>.  See also C<L</PUSHs>>, C<L</XPUSHmortal>> and
 C<L</XPUSHs>>.
@@ -270,7 +270,7 @@ C<L</XPUSHu>>.
 Push an SV onto the stack, extending the stack if necessary and mortalizes
 the SV.  Does not use C<TARG>.  See also C<L</XPUSHs>> and C<L</mPUSHs>>.
 
-=for apidoc Am|void|XPUSHmortal
+=for apidoc Amn|void|XPUSHmortal
 Push a new mortal SV onto the stack, extending the stack if necessary.
 Does not use C<TARG>.  See also C<L</XPUSHs>>, C<L</PUSHmortal>> and
 C<L</PUSHs>>.
@@ -638,7 +638,7 @@ Does not use C<TARG>.  See also C<L</XPUSHu>>, C<L</mPUSHu>> and C<L</PUSHu>>.
 #define opASSIGN (PL_op->op_flags & OPf_STACKED)
 
 /*
-=for apidoc mU||LVRET
+=for apidoc mnU||LVRET
 True if this op will be the return value of an lvalue subroutine
 
 =cut */
index 304e1b5..0214367 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -5279,8 +5279,8 @@ PP(pp_shostent)
        DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
 #endif
        break;
-#ifdef HAS_SETNETENT
     case OP_SNETENT:
+#ifdef HAS_SETNETENT
        PerlSock_setnetent(stayopen);
 #else
        DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
diff --git a/proto.h b/proto.h
index 0fc2adc..58b0816 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -143,6 +143,11 @@ PERL_CALLCONV UV   Perl__to_utf8_title_flags(pTHX_ const U8 *p, const U8* e, U8* u
 PERL_CALLCONV UV       Perl__to_utf8_upper_flags(pTHX_ const U8 *p, const U8 *e, U8* ustrp, STRLEN *lenp, bool flags, const char * const file, const int line);
 #define PERL_ARGS_ASSERT__TO_UTF8_UPPER_FLAGS  \
        assert(p); assert(ustrp); assert(file)
+#ifndef PERL_NO_INLINE_FUNCTIONS
+PERL_STATIC_INLINE UV  S__utf8_to_uvchr_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen);
+#define PERL_ARGS_ASSERT__UTF8_TO_UVCHR_BUF    \
+       assert(s); assert(send)
+#endif
 PERL_CALLCONV UV       Perl__utf8n_to_uvchr_msgs_helper(const U8 *s, STRLEN curlen, STRLEN *retlen, const U32 flags, U32 * errors, AV ** msgs);
 #define PERL_ARGS_ASSERT__UTF8N_TO_UVCHR_MSGS_HELPER   \
        assert(s)
@@ -2270,6 +2275,11 @@ PERL_CALLCONV Pid_t      Perl_my_fork(void);
 PERL_CALLCONV I32      Perl_my_lstat(pTHX);
 #endif
 PERL_CALLCONV I32      Perl_my_lstat_flags(pTHX_ const U32 flags);
+PERL_CALLCONV int      Perl_my_mkostemp_cloexec(char *templte, int flags)
+                       __attribute__warn_unused_result__;
+#define PERL_ARGS_ASSERT_MY_MKOSTEMP_CLOEXEC   \
+       assert(templte)
+
 PERL_CALLCONV int      Perl_my_mkstemp_cloexec(char *templte)
                        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_MY_MKSTEMP_CLOEXEC    \
@@ -5050,7 +5060,7 @@ STATIC OP*        S_force_list(pTHX_ OP* arg, bool nullit);
 STATIC void    S_forget_pmop(pTHX_ PMOP *const o);
 #define PERL_ARGS_ASSERT_FORGET_PMOP   \
        assert(o)
-STATIC OP*     S_gen_constant_list(pTHX_ OP* o);
+STATIC void    S_gen_constant_list(pTHX_ OP* o);
 STATIC void    S_inplace_aassign(pTHX_ OP* o);
 #define PERL_ARGS_ASSERT_INPLACE_AASSIGN       \
        assert(o)
index cf25342..cc8dc6d 100644 (file)
  * 78e2600e24fa7d5ab62117de50b382f8b31b08401c37a0782c38dacb340b64e7 lib/unicore/extracted/DLineBreak.txt
  * 1bde4ad73e271c6349fbd1972e54f38bba5cc1900c28f678e79b9e8909b31793 lib/unicore/extracted/DNumType.txt
  * 6278722699123f3890e4b1cc42011e96d8960e4958a3b93484361530983d2611 lib/unicore/extracted/DNumValues.txt
- * a53648677d262457dda0b22efba8820d2a45ca6ebae01f8c73d30db380eb83b5 lib/unicore/mktables
+ * a74b5e334b78d45bfc61718c8ef302d19884bdcfe348d0f24ddcbf4fa0a17118 lib/unicore/mktables
  * a712c758275b460d18fa77a26ed3589689bb3f69dcc1ea99b913e32db92a5cd2 lib/unicore/version
  * 2680b9254eb236c5c090f11b149605043e8c8433661b96efc4a42fb4709342a5 regen/charset_translations.pl
  * 830144f6afdd047b009754ffa06134397268f6638837fe85283483eb0cfdd558 regen/regcharclass.pl
index 5068a0a..370221f 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -1582,7 +1582,9 @@ S_get_ANYOF_cp_list_for_ssc(pTHX_ const RExC_state_t *pRExC_state,
     unsigned int i;
     const U32 n = ARG(node);
     bool new_node_has_latin1 = FALSE;
-    const U8 flags = OP(node) == ANYOFHb ? 0 : ANYOF_FLAGS(node);
+    const U8 flags = (inRANGE(OP(node), ANYOFH, ANYOFHr))
+                      ? 0
+                      : ANYOF_FLAGS(node);
 
     PERL_ARGS_ASSERT_GET_ANYOF_CP_LIST_FOR_SSC;
 
@@ -1635,7 +1637,7 @@ S_get_ANYOF_cp_list_for_ssc(pTHX_ const RExC_state_t *pRExC_state,
     }
 
     /* Add in the points from the bit map */
-    if (OP(node) != ANYOFH && OP(node) != ANYOFHb) {
+    if (! inRANGE(OP(node), ANYOFH, ANYOFHr)) {
         for (i = 0; i < NUM_ANYOF_CODE_POINTS; i++) {
             if (ANYOF_BITMAP_TEST(node, i)) {
                 unsigned int start = i++;
@@ -1722,7 +1724,9 @@ S_ssc_and(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc,
      * another SSC or a regular ANYOF class.  Can create false positives. */
 
     SV* anded_cp_list;
-    U8  and_with_flags = (OP(and_with) == ANYOFHb) ? 0 : ANYOF_FLAGS(and_with);
+    U8  and_with_flags = inRANGE(OP(and_with), ANYOFH, ANYOFHr)
+                          ? 0
+                          : ANYOF_FLAGS(and_with);
     U8  anded_flags;
 
     PERL_ARGS_ASSERT_SSC_AND;
@@ -1906,7 +1910,9 @@ S_ssc_or(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc,
 
     SV* ored_cp_list;
     U8 ored_flags;
-    U8  or_with_flags = (OP(or_with) == ANYOFHb) ? 0 : ANYOF_FLAGS(or_with);
+    U8  or_with_flags = inRANGE(OP(or_with), ANYOFH, ANYOFHr)
+                         ? 0
+                         : ANYOF_FLAGS(or_with);
 
     PERL_ARGS_ASSERT_SSC_OR;
 
@@ -5845,6 +5851,7 @@ Perl_re_printf( aTHX_  "LHS=%" UVuf " RHS=%" UVuf "\n",
                 case ANYOFPOSIXL:
                 case ANYOFH:
                 case ANYOFHb:
+                case ANYOFHr:
                 case ANYOF:
                    if (flags & SCF_DO_STCLASS_AND)
                        ssc_and(pRExC_state, data->start_class,
@@ -13793,7 +13800,7 @@ S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
                         && num >= RExC_npar
                         /* cannot be an octal escape if it starts with 8 */
                         && *RExC_parse != '8'
-                        /* cannot be an octal escape it it starts with 9 */
+                        /* cannot be an octal escape if it starts with 9 */
                         && *RExC_parse != '9'
                     ) {
                         /* Probably not meant to be a backref, instead likely
@@ -14788,7 +14795,7 @@ S_populate_ANYOF_from_invlist(pTHX_ regnode *node, SV** invlist_ptr)
     assert(PL_regkind[OP(node)] == ANYOF);
 
     /* There is no bitmap for this node type */
-    if (OP(node) == ANYOFH || OP(node) == ANYOFHb) {
+    if (inRANGE(OP(node), ANYOFH, ANYOFHr)) {
         return;
     }
 
@@ -17013,7 +17020,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
                                 {
                                     if (strict) {
                                         RExC_parse--;
-                                        vFAIL("\\N{} in inverted character class or as a range end-point is restricted to one character");
+                                        vFAIL("\\N{} here is restricted to one character");
                                     }
                                     ckWARNreg(RExC_parse, "Using just the first character returned by \\N{} in character class");
                                     break; /* <value> contains the first code
@@ -19017,35 +19024,76 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
             SvREFCNT_dec(intersection);
         }
 
-        /* If didn't find an optimization and there is no need for a
-        * bitmap, optimize to indicate that */
+        /* If didn't find an optimization and there is no need for a bitmap,
+         * optimize to indicate that */
         if (     start[0] >= NUM_ANYOF_CODE_POINTS
             && ! LOC
             && ! upper_latin1_only_utf8_matches
             &&   anyof_flags == 0)
         {
+            U8 low_utf8[UTF8_MAXBYTES+1];
             UV highest_cp = invlist_highest(cp_list);
 
-            /* If the lowest and highest code point in the class have the same
-             * UTF-8 first byte, then all do, and we can store that byte for
-             * regexec.c to use so that it can more quickly scan the target
-             * string for potential matches for this class.  We co-opt the
-             * flags field for this, and make the node ANYOFb.  We do accept
-             * here very large code points (for future use), but don't do
-             * this optimization for them, as it would cause other
-             * complications */
             op = ANYOFH;
+
+            /* Currently the maximum allowed code point by the system is
+             * IV_MAX.  Higher ones are reserved for future internal use.  This
+             * particular regnode can be used for higher ones, but we can't
+             * calculate the code point of those.  IV_MAX suffices though, as
+             * it will be a large first byte */
+            (void) uvchr_to_utf8(low_utf8, MIN(start[0], IV_MAX));
+
+            /* We store the lowest possible first byte of the UTF-8
+             * representation, using the flags field.  This allows for quick
+             * ruling out of some inputs without having to convert from UTF-8
+             * to code point.  For EBCDIC, this has to be I8. */
+            anyof_flags = NATIVE_UTF8_TO_I8(low_utf8[0]);
+
+            /* If the first UTF-8 start byte for the highest code point in the
+             * range is suitably small, we may be able to get an upper bound as
+             * well */
             if (highest_cp <= IV_MAX) {
-                U8 low_utf8[UTF8_MAXBYTES+1];
                 U8 high_utf8[UTF8_MAXBYTES+1];
 
-                (void) uvchr_to_utf8(low_utf8, start[0]);
-                (void) uvchr_to_utf8(high_utf8, invlist_highest(cp_list));
+                (void) uvchr_to_utf8(high_utf8, highest_cp);
 
+                /* If the lowest and highest are the same, we can get an exact
+                 * first byte instead of a just minimum.  We signal this with a
+                 * different regnode */
                 if (low_utf8[0] == high_utf8[0]) {
+
+                    /* No need to convert to I8 for EBCDIC as this is an exact
+                     * match */
                     anyof_flags = low_utf8[0];
                     op = ANYOFHb;
                 }
+                else if (NATIVE_UTF8_TO_I8(high_utf8[0]) <= MAX_ANYOF_HRx_BYTE)
+                {
+
+                    /* Here, the high byte is not the same as the low, but is
+                     * small enough that its reasonable to have a loose upper
+                     * bound, which is packed in with the strict lower bound.
+                     * See comments at the definition of MAX_ANYOF_HRx_BYTE.
+                     * On EBCDIC platforms, I8 is used.  On ASCII platforms I8
+                     * is the same thing as UTF-8 */
+
+                    U8 bits = 0;
+                    U8 max_range_diff = MAX_ANYOF_HRx_BYTE - anyof_flags;
+                    U8 range_diff = NATIVE_UTF8_TO_I8(high_utf8[0])
+                                  - anyof_flags;
+
+                    if (range_diff <= max_range_diff / 8) {
+                        bits = 3;
+                    }
+                    else if (range_diff <= max_range_diff / 4) {
+                        bits = 2;
+                    }
+                    else if (range_diff <= max_range_diff / 2) {
+                        bits = 1;
+                    }
+                    anyof_flags = (anyof_flags - 0xC0) << 2 | bits;
+                    op = ANYOFHr;
+                }
             }
 
             goto done_finding_op;
@@ -20348,7 +20396,9 @@ Perl_regprop(pTHX_ const regexp *prog, SV *sv, const regnode *o, const regmatch_
         /* 2: embedded, otherwise 1 */
        Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags);
     else if (k == ANYOF) {
-       const U8 flags = (OP(o) == ANYOFHb) ? 0 : ANYOF_FLAGS(o);
+       const U8 flags = inRANGE(OP(o), ANYOFH, ANYOFHr)
+                          ? 0
+                          : ANYOF_FLAGS(o);
         bool do_sep = FALSE;    /* Do we need to separate various components of
                                    the output? */
         /* Set if there is still an unresolved user-defined property */
@@ -20404,7 +20454,7 @@ Perl_regprop(pTHX_ const regexp *prog, SV *sv, const regnode *o, const regmatch_
         /* Ready to start outputting.  First, the initial left bracket */
        Perl_sv_catpvf(aTHX_ sv, "[%s", PL_colors[0]);
 
-        if (OP(o) != ANYOFH && OP(o) != ANYOFHb) {
+        if (! inRANGE(OP(o), ANYOFH, ANYOFHr)) {
             /* Then all the things that could fit in the bitmap */
             do_sep = put_charclass_bitmap_innards(sv,
                                                   ANYOF_BITMAP(o),
@@ -20502,11 +20552,22 @@ Perl_regprop(pTHX_ const regexp *prog, SV *sv, const regnode *o, const regmatch_
         /* And finally the matching, closing ']' */
        Perl_sv_catpvf(aTHX_ sv, "%s]", PL_colors[1]);
 
-        if (OP(o) == ANYOFHb) {
-            Perl_sv_catpvf(aTHX_ sv, " (First UTF-8 byte=\\x%02x)", FLAGS(o));
+        if (inRANGE(OP(o), ANYOFH, ANYOFHr)) {
+            U8 lowest = (OP(o) != ANYOFHr)
+                         ? FLAGS(o)
+                         : LOWEST_ANYOF_HRx_BYTE(FLAGS(o));
+            U8 highest = (OP(o) == ANYOFHb)
+                         ? lowest
+                         : OP(o) == ANYOFH
+                           ? 0xFF
+                           : HIGHEST_ANYOF_HRx_BYTE(FLAGS(o));
+            Perl_sv_catpvf(aTHX_ sv, " (First UTF-8 byte=%02X", lowest);
+            if (lowest != highest) {
+                Perl_sv_catpvf(aTHX_ sv, "-%02X", highest);
+            }
+            Perl_sv_catpvf(aTHX_ sv, ")");
         }
 
-
         SvREFCNT_dec(unresolved);
     }
     else if (k == ANYOFM) {
index 5002e2b..aaf65c3 100644 (file)
--- a/regcomp.h
+++ b/regcomp.h
@@ -1126,6 +1126,31 @@ typedef enum {
        WB_BOUND
 } bound_type;
 
+/* This unpacks the FLAGS field of ANYOFHx nodes.  The value it contains
+ * gives the strict lower bound for the UTF-8 start byte of any code point
+ * matchable by the node, and a loose upper bound as well.
+ *
+ * The low bound is stored in the upper 6 bits, plus 0xC0.
+ * The loose upper bound is determined from the lowest 2 bits and the low bound
+ * (called x) as follows:
+ *
+ * 11  The upper limit of the range can be as much as (EF - x) / 8
+ * 10  The upper limit of the range can be as much as (EF - x) / 4
+ * 01  The upper limit of the range can be as much as (EF - x) / 2
+ * 00  The upper limit of the range can be as much as  EF
+ *
+ * For motivation of this design, see commit message in
+ * 3146c00a633e9cbed741e10146662fbcedfdb8d3 */
+#ifdef EBCDIC
+#  define MAX_ANYOF_HRx_BYTE  0xF4
+#else
+#  define MAX_ANYOF_HRx_BYTE  0xEF
+#endif
+#define LOWEST_ANYOF_HRx_BYTE(b) (((b) >> 2) + 0xC0)
+#define HIGHEST_ANYOF_HRx_BYTE(b)                                           \
+                                  (LOWEST_ANYOF_HRx_BYTE(b)                 \
+          + ((MAX_ANYOF_HRx_BYTE - LOWEST_ANYOF_HRx_BYTE(b)) >> ((b) & 3)))
+
 #endif /* PERL_REGCOMP_H_ */
 
 /*
index b702c43..522293c 100644 (file)
@@ -62,8 +62,12 @@ ANYOF       ANYOF,      sv charclass S    ; Match character in (or not in) this
 ANYOFD      ANYOF,      sv charclass S    ; Like ANYOF, but /d is in effect
 ANYOFL      ANYOF,      sv charclass S    ; Like ANYOF, but /l is in effect
 ANYOFPOSIXL ANYOF,      sv charclass_posixl S    ; Like ANYOFL, but matches [[:posix:]] classes
-ANYOFH      ANYOF,      sv 1 S    ; Like ANYOF, but only has "High" matches, none in the bitmap;
-ANYOFHb     ANYOF,      sv 1 S    ; Like ANYOFH, but all matches share the same first byte, the repurposed flags field contains it
+
+# Must be sequential
+ANYOFH      ANYOF,      sv 1 S    ; Like ANYOF, but only has "High" matches, none in the bitmap; the flags field contains the lowest matchable UTF-8 start byte
+ANYOFHb     ANYOF,      sv 1 S    ; Like ANYOFH, but all matches share the same UTF-8 start byte, given in the flags field
+ANYOFHr     ANYOF,      sv 1 S    ; Like ANYOFH, but the flags field contains packed bounds for all matchable UTF-8 start bytes.
+
 ANYOFM      ANYOFM      byte 1 S  ; Like ANYOF, but matches an invariant byte as determined by the mask and arg
 NANYOFM     ANYOFM      byte 1 S  ; complement of ANYOFM
 
index c3fa70a..b2c8c36 100644 (file)
@@ -31,7 +31,7 @@ print $out_fh <<END;
 /*
 =head1 Unicode Support
 
-=for apidoc AmU|placeholder|BOM_UTF8
+=for apidoc AmnU|const char *|BOM_UTF8
 
 This is a macro that evaluates to a string constant of the  UTF-8 bytes that
 define the Unicode BYTE ORDER MARK (U+FEFF) for the platform that perl
@@ -40,7 +40,7 @@ works on both ASCII and EBCDIC platforms.
 S<C<sizeof(BOM_UTF8) - 1>> can be used to get its length in
 bytes.
 
-=for apidoc AmU|placeholder|REPLACEMENT_CHARACTER_UTF8
+=for apidoc AmnU|const char *|REPLACEMENT_CHARACTER_UTF8
 
 This is a macro that evaluates to a string constant of the  UTF-8 bytes that
 define the Unicode REPLACEMENT CHARACTER (U+FFFD) for the platform that perl
index 2abe8e7..ac5f13a 100644 (file)
@@ -76,10 +76,10 @@ EOF
 
 # Don't change this to add new bison versions without testing that the generated
 # files actually work :-) Win32 in particular may not like them. :-(
-unless ($version =~ /\b(1\.875[a-z]?|2\.[0134567]|3\.[0])\b/) { die <<EOF; }
+unless ($version =~ /\b(1\.875[a-z]?|2\.[0134567]|3\.[0-4])\b/) { die <<EOF; }
 
 You have the wrong version of bison in your path; currently versions
-1.875, 2.0-2.7 or 3.0 are known to work.  Try installing
+1.875, 2.0-2.7 or 3.0-3.4 are known to work.  Try installing
     http://ftp.gnu.org/gnu/bison/bison-2.5.1.tar.gz
 or similar.  Your bison identifies itself as:
 
index eaaef94..e4ec07e 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -2179,7 +2179,8 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
     case ANYOFH:
         if (utf8_target) {  /* Can't possibly match a non-UTF-8 target */
             REXEC_FBC_CLASS_SCAN(TRUE,
-                      reginclass(prog, c, (U8*)s, (U8*) strend, utf8_target));
+                  (   (U8) NATIVE_UTF8_TO_I8(*s) >= ANYOF_FLAGS(c)
+                   && reginclass(prog, c, (U8*)s, (U8*) strend, utf8_target)));
         }
         break;
 
@@ -2194,6 +2195,16 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
         }
         break;
 
+    case ANYOFHr:
+        if (utf8_target) {  /* Can't possibly match a non-UTF-8 target */
+            REXEC_FBC_CLASS_SCAN(TRUE,
+                  (   inRANGE((U8) NATIVE_UTF8_TO_I8(*s),
+                              LOWEST_ANYOF_HRx_BYTE(ANYOF_FLAGS(c)),
+                              HIGHEST_ANYOF_HRx_BYTE(ANYOF_FLAGS(c)))
+                   && reginclass(prog, c, (U8*)s, (U8*) strend, utf8_target)));
+        }
+        break;
+
     case EXACTFAA_NO_TRIE: /* This node only generated for non-utf8 patterns */
         assert(! is_utf8_pat);
        /* FALLTHROUGH */
@@ -6805,6 +6816,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
         case ANYOFH:
             if (   ! utf8_target
                 ||   NEXTCHR_IS_EOS
+                ||   ANYOF_FLAGS(scan) > NATIVE_UTF8_TO_I8((U8) *locinput)
                || ! reginclass(rex, scan, (U8*)locinput, (U8*) loceol,
                                                                    utf8_target))
             {
@@ -6825,6 +6837,20 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
             goto increment_locinput;
             break;
 
+        case ANYOFHr:
+            if (   ! utf8_target
+                ||   NEXTCHR_IS_EOS
+                || ! inRANGE((U8) NATIVE_UTF8_TO_I8(*locinput),
+                             LOWEST_ANYOF_HRx_BYTE(ANYOF_FLAGS(scan)),
+                             HIGHEST_ANYOF_HRx_BYTE(ANYOF_FLAGS(scan)))
+               || ! reginclass(rex, scan, (U8*)locinput, (U8*) loceol,
+                                                                   utf8_target))
+            {
+                sayNO;
+            }
+            goto increment_locinput;
+            break;
+
         /* The argument (FLAGS) to all the POSIX node types is the class number
          * */
 
@@ -9592,6 +9618,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
         if (utf8_target) {  /* ANYOFH only can match UTF-8 targets */
             while (  hardcount < max
                    && scan < this_eol
+                   && NATIVE_UTF8_TO_I8((U8) *scan) >= ANYOF_FLAGS(p)
                    && reginclass(prog, p, (U8*)scan, (U8*) this_eol, TRUE))
             {
                 scan += UTF8SKIP(scan);
@@ -9616,6 +9643,22 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
         }
         break;
 
+    case ANYOFHr:
+        if (utf8_target) {  /* ANYOFH only can match UTF-8 targets */
+            while (  hardcount < max
+                   && scan < this_eol
+                   && inRANGE((U8) NATIVE_UTF8_TO_I8(*scan),
+                              LOWEST_ANYOF_HRx_BYTE(ANYOF_FLAGS(p)),
+                              HIGHEST_ANYOF_HRx_BYTE(ANYOF_FLAGS(p)))
+                   && NATIVE_UTF8_TO_I8((U8) *scan) >= ANYOF_FLAGS(p)
+                   && reginclass(prog, p, (U8*)scan, (U8*) this_eol, TRUE))
+            {
+                scan += UTF8SKIP(scan);
+                hardcount++;
+            }
+        }
+        break;
+
     /* The argument (FLAGS) to all the POSIX node types is the class number */
 
     case NPOSIXL:
@@ -9859,7 +9902,9 @@ STATIC bool
 S_reginclass(pTHX_ regexp * const prog, const regnode * const n, const U8* const p, const U8* const p_end, const bool utf8_target)
 {
     dVAR;
-    const char flags = (OP(n) == ANYOFHb) ? 0 : ANYOF_FLAGS(n);
+    const char flags = (inRANGE(OP(n), ANYOFH, ANYOFHr))
+                        ? 0
+                        : ANYOF_FLAGS(n);
     bool match = FALSE;
     UV c = *p;
 
@@ -9886,7 +9931,7 @@ S_reginclass(pTHX_ regexp * const prog, const regnode * const n, const U8* const
     }
 
     /* If this character is potentially in the bitmap, check it */
-    if (c < NUM_ANYOF_CODE_POINTS && OP(n) != ANYOFH && OP(n) != ANYOFHb) {
+    if (c < NUM_ANYOF_CODE_POINTS && ! inRANGE(OP(n), ANYOFH, ANYOFHb)) {
        if (ANYOF_BITMAP_TEST(n, c))
            match = TRUE;
        else if ((flags
index add1947..211980d 100644 (file)
@@ -6,8 +6,8 @@
 
 /* Regops and State definitions */
 
-#define REGNODE_MAX            102
-#define REGMATCH_STATE_MAX     142
+#define REGNODE_MAX            103
+#define REGMATCH_STATE_MAX     143
 
 #define        END                     0       /* 0000 End of program. */
 #define        SUCCEED                 1       /* 0x01 Return from a subroutine, basically. */
 #define        ANYOFD                  19      /* 0x13 Like ANYOF, but /d is in effect */
 #define        ANYOFL                  20      /* 0x14 Like ANYOF, but /l is in effect */
 #define        ANYOFPOSIXL             21      /* 0x15 Like ANYOFL, but matches [[:posix:]] classes */
-#define        ANYOFH                  22      /* 0x16 Like ANYOF, but only has "High" matches, none in the bitmap; */
-#define        ANYOFHb                 23      /* 0x17 Like ANYOFH, but all matches share the same first byte, the repurposed flags field contains it */
-#define        ANYOFM                  24      /* 0x18 Like ANYOF, but matches an invariant byte as determined by the mask and arg */
-#define        NANYOFM                 25      /* 0x19 complement of ANYOFM */
-#define        POSIXD                  26      /* 0x1a Some [[:class:]] under /d; the FLAGS field gives which one */
-#define        POSIXL                  27      /* 0x1b Some [[:class:]] under /l; the FLAGS field gives which one */
-#define        POSIXU                  28      /* 0x1c Some [[:class:]] under /u; the FLAGS field gives which one */
-#define        POSIXA                  29      /* 0x1d Some [[:class:]] under /a; the FLAGS field gives which one */
-#define        NPOSIXD                 30      /* 0x1e complement of POSIXD, [[:^class:]] */
-#define        NPOSIXL                 31      /* 0x1f complement of POSIXL, [[:^class:]] */
-#define        NPOSIXU                 32      /* 0x20 complement of POSIXU, [[:^class:]] */
-#define        NPOSIXA                 33      /* 0x21 complement of POSIXA, [[:^class:]] */
-#define        CLUMP                   34      /* 0x22 Match any extended grapheme cluster sequence */
-#define        BRANCH                  35      /* 0x23 Match this alternative, or the next... */
-#define        EXACT                   36      /* 0x24 Match this string (preceded by length). */
-#define        EXACTL                  37      /* 0x25 Like EXACT, but /l is in effect (used so locale-related warnings can be checked for). */
-#define        EXACTF                  38      /* 0x26 Match this string using /id rules (w/len); (string not UTF-8, not guaranteed to be folded). */
-#define        EXACTFL                 39      /* 0x27 Match this string using /il rules (w/len); (string not guaranteed to be folded). */
-#define        EXACTFU                 40      /* 0x28 Match this string using /iu rules (w/len); (string folded iff in UTF-8; non-UTF8 folded length <= unfolded). */
-#define        EXACTFAA                41      /* 0x29 Match this string using /iaa rules (w/len) (string folded iff in UTF-8; non-UTF8 folded length <= unfolded). */
-#define        EXACTFUP                42      /* 0x2a Match this string using /iu rules (w/len); (string not UTF-8, not guaranteed to be folded; and its Problematic). */
-#define        EXACTFLU8               43      /* 0x2b Like EXACTFU, but use /il, UTF-8, folded, and everything in it is above 255. */
-#define        EXACTFAA_NO_TRIE        44      /* 0x2c Match this string using /iaa rules (w/len) (string not UTF-8, not guaranteed to be folded, not currently trie-able). */
-#define        EXACT_ONLY8             45      /* 0x2d Like EXACT, but only UTF-8 encoded targets can match */
-#define        EXACTFU_ONLY8           46      /* 0x2e Like EXACTFU, but only UTF-8 encoded targets can match */
-#define        EXACTFU_S_EDGE          47      /* 0x2f /di rules, but nothing in it precludes /ui, except begins and/or ends with [Ss]; (string not UTF-8; compile-time only). */
-#define        NOTHING                 48      /* 0x30 Match empty string. */
-#define        TAIL                    49      /* 0x31 Match empty string. Can jump here from outside. */
-#define        STAR                    50      /* 0x32 Match this (simple) thing 0 or more times. */
-#define        PLUS                    51      /* 0x33 Match this (simple) thing 1 or more times. */
-#define        CURLY                   52      /* 0x34 Match this simple thing {n,m} times. */
-#define        CURLYN                  53      /* 0x35 Capture next-after-this simple thing */
-#define        CURLYM                  54      /* 0x36 Capture this medium-complex thing {n,m} times. */
-#define        CURLYX                  55      /* 0x37 Match this complex thing {n,m} times. */
-#define        WHILEM                  56      /* 0x38 Do curly processing and see if rest matches. */
-#define        OPEN                    57      /* 0x39 Mark this point in input as start of #n. */
-#define        CLOSE                   58      /* 0x3a Close corresponding OPEN of #n. */
-#define        SROPEN                  59      /* 0x3b Same as OPEN, but for script run */
-#define        SRCLOSE                 60      /* 0x3c Close preceding SROPEN */
-#define        REF                     61      /* 0x3d Match some already matched string */
-#define        REFF                    62      /* 0x3e Match already matched string, using /di rules. */
-#define        REFFL                   63      /* 0x3f Match already matched string, using /li rules. */
-#define        REFFU                   64      /* 0x40 Match already matched string, usng /ui. */
-#define        REFFA                   65      /* 0x41 Match already matched string, using /aai rules. */
-#define        REFN                    66      /* 0x42 Match some already matched string */
-#define        REFFN                   67      /* 0x43 Match already matched string, using /di rules. */
-#define        REFFLN                  68      /* 0x44 Match already matched string, using /li rules. */
-#define        REFFUN                  69      /* 0x45 Match already matched string, using /ui rules. */
-#define        REFFAN                  70      /* 0x46 Match already matched string, using /aai rules. */
-#define        LONGJMP                 71      /* 0x47 Jump far away. */
-#define        BRANCHJ                 72      /* 0x48 BRANCH with long offset. */
-#define        IFMATCH                 73      /* 0x49 Succeeds if the following matches; non-zero flags "f", next_off "o" means lookbehind assertion starting "f..(f-o)" characters before current */
-#define        UNLESSM                 74      /* 0x4a Fails if the following matches; non-zero flags "f", next_off "o" means lookbehind assertion starting "f..(f-o)" characters before current */
-#define        SUSPEND                 75      /* 0x4b "Independent" sub-RE. */
-#define        IFTHEN                  76      /* 0x4c Switch, should be preceded by switcher. */
-#define        GROUPP                  77      /* 0x4d Whether the group matched. */
-#define        EVAL                    78      /* 0x4e Execute some Perl code. */
-#define        MINMOD                  79      /* 0x4f Next operator is not greedy. */
-#define        LOGICAL                 80      /* 0x50 Next opcode should set the flag only. */
-#define        RENUM                   81      /* 0x51 Group with independently numbered parens. */
-#define        TRIE                    82      /* 0x52 Match many EXACT(F[ALU]?)? at once. flags==type */
-#define        TRIEC                   83      /* 0x53 Same as TRIE, but with embedded charclass data */
-#define        AHOCORASICK             84      /* 0x54 Aho Corasick stclass. flags==type */
-#define        AHOCORASICKC            85      /* 0x55 Same as AHOCORASICK, but with embedded charclass data */
-#define        GOSUB                   86      /* 0x56 recurse to paren arg1 at (signed) ofs arg2 */
-#define        GROUPPN                 87      /* 0x57 Whether the group matched. */
-#define        INSUBP                  88      /* 0x58 Whether we are in a specific recurse. */
-#define        DEFINEP                 89      /* 0x59 Never execute directly. */
-#define        ENDLIKE                 90      /* 0x5a Used only for the type field of verbs */
-#define        OPFAIL                  91      /* 0x5b Same as (?!), but with verb arg */
-#define        ACCEPT                  92      /* 0x5c Accepts the current matched string, with verbar */
-#define        VERB                    93      /* 0x5d Used only for the type field of verbs */
-#define        PRUNE                   94      /* 0x5e Pattern fails at this startpoint if no-backtracking through this */
-#define        MARKPOINT               95      /* 0x5f Push the current location for rollback by cut. */
-#define        SKIP                    96      /* 0x60 On failure skip forward (to the mark) before retrying */
-#define        COMMIT                  97      /* 0x61 Pattern fails outright if backtracking through this */
-#define        CUTGROUP                98      /* 0x62 On failure go to the next alternation in the group */
-#define        KEEPS                   99      /* 0x63 $& begins here. */
-#define        LNBREAK                 100     /* 0x64 generic newline pattern */
-#define        OPTIMIZED               101     /* 0x65 Placeholder for dump. */
-#define        PSEUDO                  102     /* 0x66 Pseudo opcode for internal use. */
+#define        ANYOFH                  22      /* 0x16 Like ANYOF, but only has "High" matches, none in the bitmap; the flags field contains the lowest matchable UTF-8 start byte */
+#define        ANYOFHb                 23      /* 0x17 Like ANYOFH, but all matches share the same UTF-8 start byte, given in the flags field */
+#define        ANYOFHr                 24      /* 0x18 Like ANYOFH, but the flags field contains packed bounds for all matchable UTF-8 start bytes. */
+#define        ANYOFM                  25      /* 0x19 Like ANYOF, but matches an invariant byte as determined by the mask and arg */
+#define        NANYOFM                 26      /* 0x1a complement of ANYOFM */
+#define        POSIXD                  27      /* 0x1b Some [[:class:]] under /d; the FLAGS field gives which one */
+#define        POSIXL                  28      /* 0x1c Some [[:class:]] under /l; the FLAGS field gives which one */
+#define        POSIXU                  29      /* 0x1d Some [[:class:]] under /u; the FLAGS field gives which one */
+#define        POSIXA                  30      /* 0x1e Some [[:class:]] under /a; the FLAGS field gives which one */
+#define        NPOSIXD                 31      /* 0x1f complement of POSIXD, [[:^class:]] */
+#define        NPOSIXL                 32      /* 0x20 complement of POSIXL, [[:^class:]] */
+#define        NPOSIXU                 33      /* 0x21 complement of POSIXU, [[:^class:]] */
+#define        NPOSIXA                 34      /* 0x22 complement of POSIXA, [[:^class:]] */
+#define        CLUMP                   35      /* 0x23 Match any extended grapheme cluster sequence */
+#define        BRANCH                  36      /* 0x24 Match this alternative, or the next... */
+#define        EXACT                   37      /* 0x25 Match this string (preceded by length). */
+#define        EXACTL                  38      /* 0x26 Like EXACT, but /l is in effect (used so locale-related warnings can be checked for). */
+#define        EXACTF                  39      /* 0x27 Match this string using /id rules (w/len); (string not UTF-8, not guaranteed to be folded). */
+#define        EXACTFL                 40      /* 0x28 Match this string using /il rules (w/len); (string not guaranteed to be folded). */
+#define        EXACTFU                 41      /* 0x29 Match this string using /iu rules (w/len); (string folded iff in UTF-8; non-UTF8 folded length <= unfolded). */
+#define        EXACTFAA                42      /* 0x2a Match this string using /iaa rules (w/len) (string folded iff in UTF-8; non-UTF8 folded length <= unfolded). */
+#define        EXACTFUP                43      /* 0x2b Match this string using /iu rules (w/len); (string not UTF-8, not guaranteed to be folded; and its Problematic). */
+#define        EXACTFLU8               44      /* 0x2c Like EXACTFU, but use /il, UTF-8, folded, and everything in it is above 255. */
+#define        EXACTFAA_NO_TRIE        45      /* 0x2d Match this string using /iaa rules (w/len) (string not UTF-8, not guaranteed to be folded, not currently trie-able). */
+#define        EXACT_ONLY8             46      /* 0x2e Like EXACT, but only UTF-8 encoded targets can match */
+#define        EXACTFU_ONLY8           47      /* 0x2f Like EXACTFU, but only UTF-8 encoded targets can match */
+#define        EXACTFU_S_EDGE          48      /* 0x30 /di rules, but nothing in it precludes /ui, except begins and/or ends with [Ss]; (string not UTF-8; compile-time only). */
+#define        NOTHING                 49      /* 0x31 Match empty string. */
+#define        TAIL                    50      /* 0x32 Match empty string. Can jump here from outside. */
+#define        STAR                    51      /* 0x33 Match this (simple) thing 0 or more times. */
+#define        PLUS                    52      /* 0x34 Match this (simple) thing 1 or more times. */
+#define        CURLY                   53      /* 0x35 Match this simple thing {n,m} times. */
+#define        CURLYN                  54      /* 0x36 Capture next-after-this simple thing */
+#define        CURLYM                  55      /* 0x37 Capture this medium-complex thing {n,m} times. */
+#define        CURLYX                  56      /* 0x38 Match this complex thing {n,m} times. */
+#define        WHILEM                  57      /* 0x39 Do curly processing and see if rest matches. */
+#define        OPEN                    58      /* 0x3a Mark this point in input as start of #n. */
+#define        CLOSE                   59      /* 0x3b Close corresponding OPEN of #n. */
+#define        SROPEN                  60      /* 0x3c Same as OPEN, but for script run */
+#define        SRCLOSE                 61      /* 0x3d Close preceding SROPEN */
+#define        REF                     62      /* 0x3e Match some already matched string */
+#define        REFF                    63      /* 0x3f Match already matched string, using /di rules. */
+#define        REFFL                   64      /* 0x40 Match already matched string, using /li rules. */
+#define        REFFU                   65      /* 0x41 Match already matched string, usng /ui. */
+#define        REFFA                   66      /* 0x42 Match already matched string, using /aai rules. */
+#define        REFN                    67      /* 0x43 Match some already matched string */
+#define        REFFN                   68      /* 0x44 Match already matched string, using /di rules. */
+#define        REFFLN                  69      /* 0x45 Match already matched string, using /li rules. */
+#define        REFFUN                  70      /* 0x46 Match already matched string, using /ui rules. */
+#define        REFFAN                  71      /* 0x47 Match already matched string, using /aai rules. */
+#define        LONGJMP                 72      /* 0x48 Jump far away. */
+#define        BRANCHJ                 73      /* 0x49 BRANCH with long offset. */
+#define        IFMATCH                 74      /* 0x4a Succeeds if the following matches; non-zero flags "f", next_off "o" means lookbehind assertion starting "f..(f-o)" characters before current */
+#define        UNLESSM                 75      /* 0x4b Fails if the following matches; non-zero flags "f", next_off "o" means lookbehind assertion starting "f..(f-o)" characters before current */
+#define        SUSPEND                 76      /* 0x4c "Independent" sub-RE. */
+#define        IFTHEN                  77      /* 0x4d Switch, should be preceded by switcher. */
+#define        GROUPP                  78      /* 0x4e Whether the group matched. */
+#define        EVAL                    79      /* 0x4f Execute some Perl code. */
+#define        MINMOD                  80      /* 0x50 Next operator is not greedy. */
+#define        LOGICAL                 81      /* 0x51 Next opcode should set the flag only. */
+#define        RENUM                   82      /* 0x52 Group with independently numbered parens. */
+#define        TRIE                    83      /* 0x53 Match many EXACT(F[ALU]?)? at once. flags==type */
+#define        TRIEC                   84      /* 0x54 Same as TRIE, but with embedded charclass data */
+#define        AHOCORASICK             85      /* 0x55 Aho Corasick stclass. flags==type */
+#define        AHOCORASICKC            86      /* 0x56 Same as AHOCORASICK, but with embedded charclass data */
+#define        GOSUB                   87      /* 0x57 recurse to paren arg1 at (signed) ofs arg2 */
+#define        GROUPPN                 88      /* 0x58 Whether the group matched. */
+#define        INSUBP                  89      /* 0x59 Whether we are in a specific recurse. */
+#define        DEFINEP                 90      /* 0x5a Never execute directly. */
+#define        ENDLIKE                 91      /* 0x5b Used only for the type field of verbs */
+#define        OPFAIL                  92      /* 0x5c Same as (?!), but with verb arg */
+#define        ACCEPT                  93      /* 0x5d Accepts the current matched string, with verbar */
+#define        VERB                    94      /* 0x5e Used only for the type field of verbs */
+#define        PRUNE                   95      /* 0x5f Pattern fails at this startpoint if no-backtracking through this */
+#define        MARKPOINT               96      /* 0x60 Push the current location for rollback by cut. */
+#define        SKIP                    97      /* 0x61 On failure skip forward (to the mark) before retrying */
+#define        COMMIT                  98      /* 0x62 Pattern fails outright if backtracking through this */
+#define        CUTGROUP                99      /* 0x63 On failure go to the next alternation in the group */
+#define        KEEPS                   100     /* 0x64 $& begins here. */
+#define        LNBREAK                 101     /* 0x65 generic newline pattern */
+#define        OPTIMIZED               102     /* 0x66 Placeholder for dump. */
+#define        PSEUDO                  103     /* 0x67 Pseudo opcode for internal use. */
        /* ------------ States ------------- */
 #define        TRIE_next               (REGNODE_MAX + 1)       /* state for TRIE */
 #define        TRIE_next_fail          (REGNODE_MAX + 2)       /* state for TRIE */
@@ -186,6 +187,7 @@ EXTCONST U8 PL_regkind[] = {
        ANYOF,          /* ANYOFPOSIXL            */
        ANYOF,          /* ANYOFH                 */
        ANYOF,          /* ANYOFHb                */
+       ANYOF,          /* ANYOFHr                */
        ANYOFM,         /* ANYOFM                 */
        ANYOFM,         /* NANYOFM                */
        POSIXD,         /* POSIXD                 */
@@ -338,6 +340,7 @@ static const U8 regarglen[] = {
        EXTRA_SIZE(struct regnode_charclass_posixl),    /* ANYOFPOSIXL  */
        EXTRA_SIZE(struct regnode_1),           /* ANYOFH       */
        EXTRA_SIZE(struct regnode_1),           /* ANYOFHb      */
+       EXTRA_SIZE(struct regnode_1),           /* ANYOFHr      */
        EXTRA_SIZE(struct regnode_1),           /* ANYOFM       */
        EXTRA_SIZE(struct regnode_1),           /* NANYOFM      */
        0,                                      /* POSIXD       */
@@ -446,6 +449,7 @@ static const char reg_off_by_arg[] = {
        0,      /* ANYOFPOSIXL  */
        0,      /* ANYOFH       */
        0,      /* ANYOFHb      */
+       0,      /* ANYOFHr      */
        0,      /* ANYOFM       */
        0,      /* NANYOFM      */
        0,      /* POSIXD       */
@@ -560,85 +564,86 @@ EXTCONST char * const PL_reg_name[] = {
        "ANYOFPOSIXL",                  /* 0x15 */
        "ANYOFH",                       /* 0x16 */
        "ANYOFHb",                      /* 0x17 */
-       "ANYOFM",                       /* 0x18 */
-       "NANYOFM",                      /* 0x19 */
-       "POSIXD",                       /* 0x1a */
-       "POSIXL",                       /* 0x1b */
-       "POSIXU",                       /* 0x1c */
-       "POSIXA",                       /* 0x1d */
-       "NPOSIXD",                      /* 0x1e */
-       "NPOSIXL",                      /* 0x1f */
-       "NPOSIXU",                      /* 0x20 */
-       "NPOSIXA",                      /* 0x21 */
-       "CLUMP",                        /* 0x22 */
-       "BRANCH",                       /* 0x23 */
-       "EXACT",                        /* 0x24 */
-       "EXACTL",                       /* 0x25 */
-       "EXACTF",                       /* 0x26 */
-       "EXACTFL",                      /* 0x27 */
-       "EXACTFU",                      /* 0x28 */
-       "EXACTFAA",                     /* 0x29 */
-       "EXACTFUP",                     /* 0x2a */
-       "EXACTFLU8",                    /* 0x2b */
-       "EXACTFAA_NO_TRIE",             /* 0x2c */
-       "EXACT_ONLY8",                  /* 0x2d */
-       "EXACTFU_ONLY8",                /* 0x2e */
-       "EXACTFU_S_EDGE",               /* 0x2f */
-       "NOTHING",                      /* 0x30 */
-       "TAIL",                         /* 0x31 */
-       "STAR",                         /* 0x32 */
-       "PLUS",                         /* 0x33 */
-       "CURLY",                        /* 0x34 */
-       "CURLYN",                       /* 0x35 */
-       "CURLYM",                       /* 0x36 */
-       "CURLYX",                       /* 0x37 */
-       "WHILEM",                       /* 0x38 */
-       "OPEN",                         /* 0x39 */
-       "CLOSE",                        /* 0x3a */
-       "SROPEN",                       /* 0x3b */
-       "SRCLOSE",                      /* 0x3c */
-       "REF",                          /* 0x3d */
-       "REFF",                         /* 0x3e */
-       "REFFL",                        /* 0x3f */
-       "REFFU",                        /* 0x40 */
-       "REFFA",                        /* 0x41 */
-       "REFN",                         /* 0x42 */
-       "REFFN",                        /* 0x43 */
-       "REFFLN",                       /* 0x44 */
-       "REFFUN",                       /* 0x45 */
-       "REFFAN",                       /* 0x46 */
-       "LONGJMP",                      /* 0x47 */
-       "BRANCHJ",                      /* 0x48 */
-       "IFMATCH",                      /* 0x49 */
-       "UNLESSM",                      /* 0x4a */
-       "SUSPEND",                      /* 0x4b */
-       "IFTHEN",                       /* 0x4c */
-       "GROUPP",                       /* 0x4d */
-       "EVAL",                         /* 0x4e */
-       "MINMOD",                       /* 0x4f */
-       "LOGICAL",                      /* 0x50 */
-       "RENUM",                        /* 0x51 */
-       "TRIE",                         /* 0x52 */
-       "TRIEC",                        /* 0x53 */
-       "AHOCORASICK",                  /* 0x54 */
-       "AHOCORASICKC",                 /* 0x55 */
-       "GOSUB",                        /* 0x56 */
-       "GROUPPN",                      /* 0x57 */
-       "INSUBP",                       /* 0x58 */
-       "DEFINEP",                      /* 0x59 */
-       "ENDLIKE",                      /* 0x5a */
-       "OPFAIL",                       /* 0x5b */
-       "ACCEPT",                       /* 0x5c */
-       "VERB",                         /* 0x5d */
-       "PRUNE",                        /* 0x5e */
-       "MARKPOINT",                    /* 0x5f */
-       "SKIP",                         /* 0x60 */
-       "COMMIT",                       /* 0x61 */
-       "CUTGROUP",                     /* 0x62 */
-       "KEEPS",                        /* 0x63 */
-       "LNBREAK",                      /* 0x64 */
-       "OPTIMIZED",                    /* 0x65 */
-       "PSEUDO",                       /* 0x66 */
+       "ANYOFHr",                      /* 0x18 */
+       "ANYOFM",                       /* 0x19 */
+       "NANYOFM",                      /* 0x1a */
+       "POSIXD",                       /* 0x1b */
+       "POSIXL",                       /* 0x1c */
+       "POSIXU",                       /* 0x1d */
+       "POSIXA",                       /* 0x1e */
+       "NPOSIXD",                      /* 0x1f */
+       "NPOSIXL",                      /* 0x20 */
+       "NPOSIXU",                      /* 0x21 */
+       "NPOSIXA",                      /* 0x22 */
+       "CLUMP",                        /* 0x23 */
+       "BRANCH",                       /* 0x24 */
+       "EXACT",                        /* 0x25 */
+       "EXACTL",                       /* 0x26 */
+       "EXACTF",                       /* 0x27 */
+       "EXACTFL",                      /* 0x28 */
+       "EXACTFU",                      /* 0x29 */
+       "EXACTFAA",                     /* 0x2a */
+       "EXACTFUP",                     /* 0x2b */
+       "EXACTFLU8",                    /* 0x2c */
+       "EXACTFAA_NO_TRIE",             /* 0x2d */
+       "EXACT_ONLY8",                  /* 0x2e */
+       "EXACTFU_ONLY8",                /* 0x2f */
+       "EXACTFU_S_EDGE",               /* 0x30 */
+       "NOTHING",                      /* 0x31 */
+       "TAIL",                         /* 0x32 */
+       "STAR",                         /* 0x33 */
+       "PLUS",                         /* 0x34 */
+       "CURLY",                        /* 0x35 */
+       "CURLYN",                       /* 0x36 */
+       "CURLYM",                       /* 0x37 */
+       "CURLYX",                       /* 0x38 */
+       "WHILEM",                       /* 0x39 */
+       "OPEN",                         /* 0x3a */
+       "CLOSE",                        /* 0x3b */
+       "SROPEN",                       /* 0x3c */
+       "SRCLOSE",                      /* 0x3d */
+       "REF",                          /* 0x3e */
+       "REFF",                         /* 0x3f */
+       "REFFL",                        /* 0x40 */
+       "REFFU",                        /* 0x41 */
+       "REFFA",                        /* 0x42 */
+       "REFN",                         /* 0x43 */
+       "REFFN",                        /* 0x44 */
+       "REFFLN",                       /* 0x45 */
+       "REFFUN",                       /* 0x46 */
+       "REFFAN",                       /* 0x47 */
+       "LONGJMP",                      /* 0x48 */
+       "BRANCHJ",                      /* 0x49 */
+       "IFMATCH",                      /* 0x4a */
+       "UNLESSM",                      /* 0x4b */
+       "SUSPEND",                      /* 0x4c */
+       "IFTHEN",                       /* 0x4d */
+       "GROUPP",                       /* 0x4e */
+       "EVAL",                         /* 0x4f */
+       "MINMOD",                       /* 0x50 */
+       "LOGICAL",                      /* 0x51 */
+       "RENUM",                        /* 0x52 */
+       "TRIE",                         /* 0x53 */
+       "TRIEC",                        /* 0x54 */
+       "AHOCORASICK",                  /* 0x55 */
+       "AHOCORASICKC",                 /* 0x56 */
+       "GOSUB",                        /* 0x57 */
+       "GROUPPN",                      /* 0x58 */
+       "INSUBP",                       /* 0x59 */
+       "DEFINEP",                      /* 0x5a */
+       "ENDLIKE",                      /* 0x5b */
+       "OPFAIL",                       /* 0x5c */
+       "ACCEPT",                       /* 0x5d */
+       "VERB",                         /* 0x5e */
+       "PRUNE",                        /* 0x5f */
+       "MARKPOINT",                    /* 0x60 */
+       "SKIP",                         /* 0x61 */
+       "COMMIT",                       /* 0x62 */
+       "CUTGROUP",                     /* 0x63 */
+       "KEEPS",                        /* 0x64 */
+       "LNBREAK",                      /* 0x65 */
+       "OPTIMIZED",                    /* 0x66 */
+       "PSEUDO",                       /* 0x67 */
        /* ------------ States ------------- */
        "TRIE_next",                    /* REGNODE_MAX +0x01 */
        "TRIE_next_fail",               /* REGNODE_MAX +0x02 */
@@ -773,7 +778,7 @@ EXTCONST U8 PL_varies[] __attribute__deprecated__ = {
 EXTCONST U8 PL_varies_bitmask[];
 #else
 EXTCONST U8 PL_varies_bitmask[] = {
-    0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xFC, 0xE1, 0x7F, 0x19, 0x00, 0x00, 0x00
+    0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0xF8, 0xC3, 0xFF, 0x32, 0x00, 0x00, 0x00
 };
 #endif /* DOINIT */
 
@@ -786,8 +791,8 @@ EXTCONST U8 PL_simple[] __attribute__deprecated__;
 #else
 EXTCONST U8 PL_simple[] __attribute__deprecated__ = {
     REG_ANY, SANY, ANYOF, ANYOFD, ANYOFL, ANYOFPOSIXL, ANYOFH, ANYOFHb,
-    ANYOFM, NANYOFM, POSIXD, POSIXL, POSIXU, POSIXA, NPOSIXD, NPOSIXL,
-    NPOSIXU, NPOSIXA,
+    ANYOFHr, ANYOFM, NANYOFM, POSIXD, POSIXL, POSIXU, POSIXA, NPOSIXD,
+    NPOSIXL, NPOSIXU, NPOSIXA,
     0
 };
 #endif /* DOINIT */
@@ -796,7 +801,7 @@ EXTCONST U8 PL_simple[] __attribute__deprecated__ = {
 EXTCONST U8 PL_simple_bitmask[];
 #else
 EXTCONST U8 PL_simple_bitmask[] = {
-    0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+    0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 };
 #endif /* DOINIT */
 
diff --git a/sv.c b/sv.c
index 83de536..4315fe9 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -16662,8 +16662,11 @@ S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
 
         if (agg_targ)
            sv = PAD_SV(agg_targ);
-        else if (agg_gv)
+        else if (agg_gv) {
             sv = is_hv ? MUTABLE_SV(GvHV(agg_gv)) : MUTABLE_SV(GvAV(agg_gv));
+            if (!sv)
+                break;
+            }
         else
             break;
 
diff --git a/sv.h b/sv.h
index 15adf03..24c728d 100644 (file)
--- a/sv.h
+++ b/sv.h
@@ -15,7 +15,7 @@
 /*
 =head1 SV Flags
 
-=for apidoc AmU||svtype
+=for apidoc AmnU||svtype
 An enum of flags for Perl types.  These are found in the file F<sv.h>
 in the C<svtype> enum.  Test these flags with the C<SvTYPE> macro.
 
@@ -72,52 +72,52 @@ hold C<undef> or a string.  C<SVt_PVIV> is a superset of C<SVt_PV> and C<SVt_IV>
 C<SVt_PVNV> is similar.  C<SVt_PVMG> can hold anything C<SVt_PVNV> can hold, but it
 can, but does not have to, be blessed or magical.
 
-=for apidoc AmU||SVt_NULL
+=for apidoc AmnU||SVt_NULL
 Type flag for scalars.  See L</svtype>.
 
-=for apidoc AmU||SVt_IV
+=for apidoc AmnU||SVt_IV
 Type flag for scalars.  See L</svtype>.
 
-=for apidoc AmU||SVt_NV
+=for apidoc AmnU||SVt_NV
 Type flag for scalars.  See L</svtype>.
 
-=for apidoc AmU||SVt_PV
+=for apidoc AmnU||SVt_PV
 Type flag for scalars.  See L</svtype>.
 
-=for apidoc AmU||SVt_PVIV
+=for apidoc AmnU||SVt_PVIV
 Type flag for scalars.  See L</svtype>.
 
-=for apidoc AmU||SVt_PVNV
+=for apidoc AmnU||SVt_PVNV
 Type flag for scalars.  See L</svtype>.
 
-=for apidoc AmU||SVt_PVMG
+=for apidoc AmnU||SVt_PVMG
 Type flag for scalars.  See L</svtype>.
 
-=for apidoc AmU||SVt_INVLIST
+=for apidoc AmnU||SVt_INVLIST
 Type flag for scalars.  See L</svtype>.
 
-=for apidoc AmU||SVt_REGEXP
+=for apidoc AmnU||SVt_REGEXP
 Type flag for regular expressions.  See L</svtype>.
 
-=for apidoc AmU||SVt_PVGV
+=for apidoc AmnU||SVt_PVGV
 Type flag for typeglobs.  See L</svtype>.
 
-=for apidoc AmU||SVt_PVLV
+=for apidoc AmnU||SVt_PVLV
 Type flag for scalars.  See L</svtype>.
 
-=for apidoc AmU||SVt_PVAV
+=for apidoc AmnU||SVt_PVAV
 Type flag for arrays.  See L</svtype>.
 
-=for apidoc AmU||SVt_PVHV
+=for apidoc AmnU||SVt_PVHV
 Type flag for hashes.  See L</svtype>.
 
-=for apidoc AmU||SVt_PVCV
+=for apidoc AmnU||SVt_PVCV
 Type flag for subroutines.  See L</svtype>.
 
-=for apidoc AmU||SVt_PVFM
+=for apidoc AmnU||SVt_PVFM
 Type flag for formats.  See L</svtype>.
 
-=for apidoc AmU||SVt_PVIO
+=for apidoc AmnU||SVt_PVIO
 Type flag for I/O objects.  See L</svtype>.
 
 =cut
index 99d7e51..56c354b 100644 (file)
@@ -11,7 +11,7 @@ BEGIN {
 use strict;
 use warnings;
 
-plan tests => 6;
+plan tests => 10;
 
 use Fcntl qw(:seek);
 
@@ -31,6 +31,16 @@ use Fcntl qw(:seek);
     is($data, "the right read stuff", "found the right stuff");
 }
 
-
+SKIP:
+{
+    ok((open my $fh, "+>>", undef), "open my \$fh, '+>>', undef")
+      or skip "can't open temp for append: $!", 3;
+    print $fh "abc";
+    ok(seek($fh, 0, SEEK_SET), "seek to zero");
+    print $fh "xyz";
+    ok(seek($fh, 0, SEEK_SET), "seek to zero again");
+    my $data = <$fh>;
+    is($data, "abcxyz", "check the second write appended");
+}
 
 
index 9f5bb3b..bdf743c 100644 (file)
@@ -125,6 +125,18 @@ wait;                              # Collect from $pid
 pipe(READER,WRITER) || die "Can't open pipe";
 close READER;
 
+eval {
+    # one platform at least appears to block SIGPIPE by default (see #122112)
+    # so make sure it's unblocked.
+    # The eval wrapper should ensure this does nothing if these aren't
+    # implemented.
+    require POSIX;
+    my $mask = POSIX::SigSet->new(POSIX::SIGPIPE());
+    my $old = POSIX::SigSet->new();
+    POSIX::sigprocmask(POSIX::SIG_UNBLOCK(), $mask, $old);
+    note "Yes, SIGPIPE was blocked" if $old->ismember(POSIX::SIGPIPE());
+};
+
 $SIG{'PIPE'} = 'broken_pipe';
 
 sub broken_pipe {
index e7bf609..4ef6f72 100644 (file)
@@ -507,16 +507,12 @@ Execution of - aborted due to compilation errors.
 0x x 2;
 0xx 2;
 0x_;
+0b;
 EXPECT
-Number found where operator expected at - line 1, near "x 2"
-       (Do you need to predeclare x?)
-Bareword found where operator expected at - line 2, near "0xx"
-       (Missing operator before xx?)
-Number found where operator expected at - line 2, near "xx 2"
-       (Do you need to predeclare xx?)
-Bareword found where operator expected at - line 3, near "0x_"
-       (Missing operator before x_?)
-syntax error at - line 1, near "x 2"
+No digits found for hexadecimal literal at - line 1, near "0x "
+No digits found for hexadecimal literal at - line 2, near "0xx"
+No digits found for hexadecimal literal at - line 3, near "0x_;"
+No digits found for binary literal at - line 4, near "0b;"
 Execution of - aborted due to compilation errors.
 ########
 # NAME [perl #130585] close paren in subparse
index 774c6ee..5c173fd 100644 (file)
@@ -2206,3 +2206,13 @@ use warnings 'uninitialized';
 undef $0;
 EXPECT
 Use of uninitialized value in undef operator at - line 5.
+########
+# RT #134275
+# This was SEGVing due to the multideref code in S_find_uninit_var not
+# handling a GV with a null gp_hv slot.
+use warnings 'uninitialized';
+"" =~ /$foo{a}${*foo=*bar}$x/;
+EXPECT
+Use of uninitialized value in regexp compilation at - line 5.
+Use of uninitialized value in regexp compilation at - line 5.
+Use of uninitialized value $x in regexp compilation at - line 5.
index 8529783..4d0b002 100644 (file)
@@ -2021,3 +2021,45 @@ $a.$b.$c;
 EXPECT
 Useless use of concatenation (.) or string in void context at - line 4.
 Useless use of concatenation (.) or string in void context at - line 5.
+########
+# PL_curcop tracked correctly in Perl_scalar()
+use warnings;
+my $scalar = do {
+    no warnings 'void';
+    1,2,3,4,5;
+};
+EXPECT
+########
+# PL_curcop tracked correctly in Perl_list()
+use warnings;
+my @array = do {
+    no warnings 'void';
+    1,2,3,4,5;
+};
+EXPECT
+########
+# TODO PL_curcop restored correctly in Perl_scalar()
+use warnings;
+my $scalar = do {
+    my $x = 1;
+    11,12,
+    do {
+        no warnings 'void';
+        my $x = 2;
+        21,22,
+    },
+    31,32,
+    do {
+        my $x = 3;
+        41,42,
+    },
+    51,52
+};
+EXPECT
+Useless use of a constant (11) in void context at - line 5.
+Useless use of a constant (12) in void context at - line 5.
+Useless use of a constant (31) in void context at - line 11.
+Useless use of a constant (32) in void context at - line 11.
+Useless use of a constant (41) in void context at - line 14.
+Useless use of a constant (42) in void context at - line 14.
+Useless use of a constant (51) in void context at - line 16.
index 1fb369a..ea6ca4d 100644 (file)
@@ -167,23 +167,23 @@ SKIP: {
     skip "VMS doesn't have the perl #2754 bug", 3 if $^O eq 'VMS';
     fresh_perl_is(
         "$testblocks BEGIN { exit 0; }",
-        "begin\nunitcheck\ncheck\ninit\nend",
+        "begin\nunitcheck\ncheck\nend",
         {},
-        "BEGIN{exit 0} doesn't exit yet"
+        "BEGIN{exit 0} should exit"
     );
 
     fresh_perl_is(
         "$testblocks UNITCHECK { exit 0; }",
-        "begin\nunitcheck\ncheck\ninit\nmain\nend",
+        "begin\nunitcheck\ncheck\nend",
         {},
-        "UNITCHECK{exit 0} doesn't exit yet"
+        "UNITCHECK{exit 0} should exit"
     );
 
     fresh_perl_is(
         "$testblocks CHECK { exit 0; }",
-        "begin\nunitcheck\ncheck\ninit\nmain\nend",
+        "begin\nunitcheck\ncheck\nend",
         {},
-        "CHECK{exit 0} doesn't exit yet"
+        "CHECK{exit 0} should exit"
     );
 }
 
index 25d5060..ae381c9 100644 (file)
@@ -13,4 +13,19 @@ $x = 1;
 is(  $x ? 1 : 0, 1, 'run time, true');
 is( !$x ? 0 : 1, 1, 'run time, false');
 
+# This used to SEGV due to deep recursion in Perl_scalar().
+# (Actually it only SEGVed with the depth being about 100_000; but
+# compiling the nested condition goes quadratic in some way, so I've
+# reduced to the count to a manageable size. So this is not so much a
+# proper test, as it is a comment on the sort of thing that used to break)
+
+{
+    my $e = "1";
+    $e = "(\$x ? 1 : $e)" for 1..20_000;
+    $e = "\$x = $e";
+    eval $e;
+    is $@, "", "SEGV in Perl_scalar";
+}
+
+
 done_testing();
index 8904c48..eeb2c9d 100644 (file)
@@ -138,7 +138,7 @@ sub get_warn() {
 
 { # Test certain things that are not hexfloats and should stay that way.
     eval '0xp3';
-    like(get_warn(), qr/Missing operator before xp3/);
+    like(get_warn(), qr/Missing operator before p3/);
 
     eval '5p3';
     like(get_warn(), qr/Missing operator before p3/);
@@ -149,7 +149,7 @@ sub get_warn() {
 
     undef $a;
     eval '$a = eval "0x.3"';
-    is($a, ''); # 0 x .3
+    is($a, undef); # throws an error
 
     undef $a;
     eval '$a = eval "0xc.3"';
index 2acb03a..30ec3d8 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     set_up_inc(qw(. ../lib));
 }
 
-plan( tests => 72 );
+plan( tests => 73 );
 
 @foo = (1, 2, 3, 4);
 cmp_ok($foo[0], '==', 1, 'first elem');
@@ -268,3 +268,10 @@ q[ x
  ];
 }
 EOS
+
+# this used to SEGV due to deep recursion in Perl_list()
+
+{
+    my $e = "1"; $e = "(1,$e)" for 1..100_000; $e = "() = $e"; eval $e;
+    is $@, "", "SEGV in Perl_list";
+}
index f710639..76b5044 100644 (file)
@@ -1,6 +1,7 @@
 # Regenerate this file using:
 #     cd t
 #     ./perl -I../lib porting/customized.t --regen
+Config::Perl::V cpan/Config-Perl-V/V.pm 0a0f7207e6505b78ee345a933acb0246a13579f5
 Digest cpan/Digest/Digest.pm 43f7f544cb11842b2f55c73e28930da50774e081
 Locale::Maketext::Simple cpan/Locale-Maketext-Simple/lib/Locale/Maketext/Simple.pm 57ed38905791a17c150210cd6f42ead22a7707b6
 Math::Complex cpan/Math-Complex/lib/Math/Complex.pm 198ea6c6c584f5ea79a0fd7e9d411d0878f3b2af
@@ -9,10 +10,6 @@ Math::Complex cpan/Math-Complex/t/Trig.t 2682526e23a161d54732c2a66393fe4a234d186
 Memoize cpan/Memoize/Memoize.pm 902092ff91cdec9c7b4bd06202eb179e1ce26ca2
 NEXT cpan/NEXT/lib/NEXT.pm 2c83d03ee361816e53ccb931137d314ab878d19f
 NEXT cpan/NEXT/t/next.t 66fd60eb0f75b6f3eea95d1dee745f9a7a348146
-Net::Ping dist/Net-Ping/lib/Net/Ping.pm e2e7053673ead1eff8f3ca8ecdd9b838598c1d8c
-Net::Ping dist/Net-Ping/t/000_load.t deff5dc2ca54dae28cb19d3631427db127279ac2
-Net::Ping dist/Net-Ping/t/500_ping_icmp.t 3eeb60181c01b85f876bd6658644548fdf2e24d4
-Net::Ping dist/Net-Ping/t/501_ping_icmpv6.t 54373de5858f8fb7e078e4998a4b3b8dbca91783
 Pod::Checker cpan/Pod-Checker/t/pod/contains_bad_pod.xr 73538fd80dfe6e19ad561fe034009b44460208f6
 Pod::Checker cpan/Pod-Checker/t/pod/selfcheck.t 8ce3cfd38e4b9bcf5bc7fe7f2a14195e49aed7d8
 Pod::Checker cpan/Pod-Checker/t/pod/testcmp.pl a0cd5c8eca775c7753f4464eee96fa916e3d8a16
index 1c648a2..45e1491 100644 (file)
@@ -388,7 +388,7 @@ pod/perltie.pod     Verbatim line length including indents exceeds 79 by    3
 pod/perltru64.pod      Verbatim line length including indents exceeds 79 by    1
 pod/perlwin32.pod      Verbatim line length including indents exceeds 79 by    7
 porting/epigraphs.pod  Verbatim line length including indents exceeds 79 by    -1
-porting/release_managers_guide.pod     Verbatim line length including indents exceeds 79 by    1
+porting/release_managers_guide.pod     Verbatim line length including indents exceeds 79 by    2
 porting/todo.pod       ? Should you be using F<...> or maybe L<...> instead of 1
 lib/benchmark.pm       Verbatim line length including indents exceeds 79 by    2
 lib/config.pod ? Should you be using L<...> instead of -1
index aafcdb0..b7656d6 100644 (file)
@@ -874,7 +874,7 @@ while (defined (my $test = shift @tests)) {
         my $result = get_compiled($test);
         if ($expected =~ / ^ ANYOFH /x) {
             like($result, qr/ ^ \Q$expected\E (?:\Q (First UTF-8 byte=\x\E
-                              [[:xdigit:]]{2}\) )? $ /x, $test_name);
+                              [[:xdigit:]]{2} )? /x, $test_name);
         }
         else {
             is($result, $expected,
index d10fa2c..9eb32ab 100644 (file)
@@ -260,7 +260,7 @@ my @death =
  'm/(?[[\w-x]])/' => 'False [] range "\w-" {#} m/(?[[\w-{#}x]])/',
  'm/(?[[a-\pM]])/' => 'False [] range "a-\pM" {#} m/(?[[a-\pM{#}]])/',
  'm/(?[[\pM-x]])/' => 'False [] range "\pM-" {#} m/(?[[\pM-{#}x]])/',
- 'm/(?[[^\N{LATIN CAPITAL LETTER A WITH MACRON AND GRAVE}]])/' => '\N{} in inverted character class or as a range end-point is restricted to one character {#} m/(?[[^\N{U+100.300{#}}]])/',
+ 'm/(?[[^\N{LATIN CAPITAL LETTER A WITH MACRON AND GRAVE}]])/' => '\N{} here is restricted to one character {#} m/(?[[^\N{U+100.300{#}}]])/',
  'm/(?[ \p{Digit} & (?^(?[ \p{Thai} | \p{Lao} ]))])/' => 'Sequence (?^(...) not recognized {#} m/(?[ \p{Digit} & (?^({#}?[ \p{Thai} | \p{Lao} ]))])/',
  'm/(?[ \p{Digit} & (?(?[ \p{Thai} | \p{Lao} ]))])/' => 'Unexpected character {#} m/(?[ \p{Digit} & (?{#}(?[ \p{Thai} | \p{Lao} ]))])/',
  'm/\o{/' => 'Missing right brace on \o{ {#} m/\o{{#}/',
@@ -317,7 +317,7 @@ my @death =
  '/\p{Is_Other_Alphabetic=F}/ ' => 'Can\'t find Unicode property definition "Is_Other_Alphabetic=F" {#} m/\p{Is_Other_Alphabetic=F}{#}/',
  '/\p{Is_Other_Alphabetic=F}/ ' => 'Can\'t find Unicode property definition "Is_Other_Alphabetic=F" {#} m/\p{Is_Other_Alphabetic=F}{#}/',
  '/\x{100}(?(/' => 'Unknown switch condition (?(...)) {#} m/\\x{100}(?({#}/', # [perl #133896]
- '/(?[\N{KEYCAP DIGIT NINE}/' => '\N{} in inverted character class or as a range end-point is restricted to one character {#} m/(?[\\N{U+39.FE0F.20E3{#}}/', # [perl #133988]
+ '/(?[\N{KEYCAP DIGIT NINE}/' => '\N{} here is restricted to one character {#} m/(?[\\N{U+39.FE0F.20E3{#}}/', # [perl #133988]
  '/0000000000000000[\N{U+0.00}0000/' => 'Unmatched [ {#} m/0000000000000000[{#}\N{U+0.00}0000/', # [perl #134059]
 );
 
@@ -363,11 +363,11 @@ my @death_only_under_strict = (
     'm/[\pM-x]\x{100}/' => 'False [] range "\pM-" {#} m/[\pM-{#}x]\x{100}/',
                         => 'False [] range "\pM-" {#} m/[\pM-{#}x]\x{100}/',
     'm/[^\N{LATIN CAPITAL LETTER A WITH MACRON AND GRAVE}]/' => 'Using just the first character returned by \N{} in character class {#} m/[^\N{U+100.300}{#}]/',
-                                       => '\N{} in inverted character class or as a range end-point is restricted to one character {#} m/[^\N{U+100.300{#}}]/',
+                                       => '\N{} here is restricted to one character {#} m/[^\N{U+100.300{#}}]/',
     'm/[\x03-\N{LATIN CAPITAL LETTER A WITH MACRON AND GRAVE}]/' => 'Using just the first character returned by \N{} in character class {#} m/[\x03-\N{U+100.300}{#}]/',
-                                            => '\N{} in inverted character class or as a range end-point is restricted to one character {#} m/[\x03-\N{U+100.300{#}}]/',
+                                            => '\N{} here is restricted to one character {#} m/[\x03-\N{U+100.300{#}}]/',
     'm/[\N{LATIN CAPITAL LETTER A WITH MACRON AND GRAVE}-\x{10FFFF}]/' => 'Using just the first character returned by \N{} in character class {#} m/[\N{U+100.300}{#}-\x{10FFFF}]/',
-                                                  => '\N{} in inverted character class or as a range end-point is restricted to one character {#} m/[\N{U+100.300{#}}-\x{10FFFF}]/',
+                                                  => '\N{} here is restricted to one character {#} m/[\N{U+100.300{#}}-\x{10FFFF}]/',
     '/[\08]/'   => '\'\08\' resolved to \'\o{0}8\' {#} m/[\08{#}]/',
                 => 'Need exactly 3 octal digits {#} m/[\08{#}]/',
     '/[\018]/'  => '\'\018\' resolved to \'\o{1}8\' {#} m/[\018{#}]/',
diff --git a/toke.c b/toke.c
index 694b008..31aa672 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -25,7 +25,7 @@
 =head1 Lexer interface
 This is the lower layer of the Perl parser, managing characters and tokens.
 
-=for apidoc AmU|yy_parser *|PL_parser
+=for apidoc AmnU|yy_parser *|PL_parser
 
 Pointer to a structure encapsulating the state of the parsing operation
 currently in progress.  The pointer can be locally changed to perform
@@ -833,7 +833,7 @@ Perl_parser_free_nexttoke_ops(pTHX_  yy_parser *parser, OPSLAB *slab)
 
 
 /*
-=for apidoc AmxUN|SV *|PL_parser-E<gt>linestr
+=for apidoc AmnxUN|SV *|PL_parser-E<gt>linestr
 
 Buffer scalar containing the chunk currently under consideration of the
 text currently being lexed.  This is always a plain string scalar (for
@@ -860,7 +860,7 @@ lexing position is pointed to by L</PL_parser-E<gt>bufptr>.  Direct use
 of these pointers is usually preferable to examination of the scalar
 through normal scalar means.
 
-=for apidoc AmxUN|char *|PL_parser-E<gt>bufend
+=for apidoc AmnxUN|char *|PL_parser-E<gt>bufend
 
 Direct pointer to the end of the chunk of text currently being lexed, the
 end of the lexer buffer.  This is equal to C<SvPVX(PL_parser-E<gt>linestr)
@@ -868,7 +868,7 @@ end of the lexer buffer.  This is equal to C<SvPVX(PL_parser-E<gt>linestr)
 always located at the end of the buffer, and does not count as part of
 the buffer's contents.
 
-=for apidoc AmxUN|char *|PL_parser-E<gt>bufptr
+=for apidoc AmnxUN|char *|PL_parser-E<gt>bufptr
 
 Points to the current position of lexing inside the lexer buffer.
 Characters around this point may be freely examined, within
@@ -886,7 +886,7 @@ Interpretation of the buffer's octets can be abstracted out by
 using the slightly higher-level functions L</lex_peek_unichar> and
 L</lex_read_unichar>.
 
-=for apidoc AmxUN|char *|PL_parser-E<gt>linestart
+=for apidoc AmnxUN|char *|PL_parser-E<gt>linestart
 
 Points to the start of the current line inside the lexer buffer.
 This is useful for indicating at which column an error occurred, and
@@ -9559,9 +9559,9 @@ S_scan_ident(pTHX_ char *s, char *dest, STRLEN destlen, I32 ck_uni)
             s = skipspace(s);
         }
     }
-    if ((s <= PL_bufend - (is_utf8)
+    if ((s <= PL_bufend - ((is_utf8)
                           ? UTF8SKIP(s)
-                          : 1)
+                          : 1))
         && VALID_LEN_ONE_IDENT(s, PL_bufend, is_utf8))
     {
         if (is_utf8) {
@@ -11336,10 +11336,16 @@ Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
             }
 
             if (shift != 3 && !has_digs) {
-                /* 0x or 0b with no digits, treat it as if the x or b is part of the
-                   next token
+                /* 0x or 0b with no digits, treat it as an error.
+                   Originally this backed up the parse before the b or
+                   x, but that has the potential for silent changes in
+                   behaviour, like for: "0x.3" and "0x+$foo".
                 */
-                s = start + 1;
+                const char *d = s;
+                if (*d) ++d; /* so the user sees the bad non-digit */
+                PL_bufptr = (char *)d; /* so yyerror reports the context */
+                yyerror(Perl_form(aTHX_ "No digits found for %s literal",
+                                  shift == 4 ? "hexadecimal" : "binary"));
             }
 
            if (overflowed) {
index 3b7ccf9..09fd622 100644 (file)
--- a/uconfig.h
+++ b/uconfig.h
 /*#define      USE_64_BIT_ALL          / **/
 #endif
 
-/* USE_CBACKTRACE:
+/* USE_C_BACKTRACE:
  *     This symbol, if defined, indicates that Perl should
  *     be built with support for backtrace.
  */
-/*#define USE_CBACKTRACE               / **/
+/*#define USE_C_BACKTRACE              / **/
 
 /* USE_DTRACE:
  *     This symbol, if defined, indicates that Perl should
 #endif
 
 /* Generated from:
- * 6608de918c3c876975f74b684da2536ab1ee23459783d691ae02ce2526a497a7 config_h.SH
+ * e3dbc17ac938c9df0df81930ccebf94a0425dbff9d20c3edd18a84075eff4fc2 config_h.SH
  * a11d95f56af200907b9285ed0da243a4c20db34f5684af313d18195eaba2b18b uconfig.sh
  * ex: set ro: */
index d0d20e0..9529c8e 100644 (file)
@@ -7284,7 +7284,7 @@ MPH_VALt match_uniprop( const unsigned char * const key, const U16 key_len ) {
  * 78e2600e24fa7d5ab62117de50b382f8b31b08401c37a0782c38dacb340b64e7 lib/unicore/extracted/DLineBreak.txt
  * 1bde4ad73e271c6349fbd1972e54f38bba5cc1900c28f678e79b9e8909b31793 lib/unicore/extracted/DNumType.txt
  * 6278722699123f3890e4b1cc42011e96d8960e4958a3b93484361530983d2611 lib/unicore/extracted/DNumValues.txt
- * a53648677d262457dda0b22efba8820d2a45ca6ebae01f8c73d30db380eb83b5 lib/unicore/mktables
+ * a74b5e334b78d45bfc61718c8ef302d19884bdcfe348d0f24ddcbf4fa0a17118 lib/unicore/mktables
  * a712c758275b460d18fa77a26ed3589689bb3f69dcc1ea99b913e32db92a5cd2 lib/unicore/version
  * 2680b9254eb236c5c090f11b149605043e8c8433661b96efc4a42fb4709342a5 regen/charset_translations.pl
  * 03e51b0f07beebd5da62ab943899aa4934eee1f792fa27c1fb638c33bf4ac6ea regen/mk_PL_charclass.pl
index d7ccd90..4102f4b 100644 (file)
@@ -24,7 +24,7 @@
 /*
 =head1 Unicode Support
 
-=for apidoc AmU|placeholder|BOM_UTF8
+=for apidoc AmnU|const char *|BOM_UTF8
 
 This is a macro that evaluates to a string constant of the  UTF-8 bytes that
 define the Unicode BYTE ORDER MARK (U+FEFF) for the platform that perl
@@ -33,7 +33,7 @@ works on both ASCII and EBCDIC platforms.
 S<C<sizeof(BOM_UTF8) - 1>> can be used to get its length in
 bytes.
 
-=for apidoc AmU|placeholder|REPLACEMENT_CHARACTER_UTF8
+=for apidoc AmnU|const char *|REPLACEMENT_CHARACTER_UTF8
 
 This is a macro that evaluates to a string constant of the  UTF-8 bytes that
 define the Unicode REPLACEMENT CHARACTER (U+FFFD) for the platform that perl
diff --git a/utf8.c b/utf8.c
index 84db2f6..07e4df7 100644 (file)
--- a/utf8.c
+++ b/utf8.c
@@ -2271,10 +2271,7 @@ Perl_utf8_to_uvchr_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen)
 {
     PERL_ARGS_ASSERT_UTF8_TO_UVCHR_BUF;
 
-    assert(s < send);
-
-    return utf8n_to_uvchr(s, send - s, retlen,
-                     ckWARN_d(WARN_UTF8) ? 0 : UTF8_ALLOW_ANY);
+    return _utf8_to_uvchr_buf(s, send, retlen);
 }
 
 /* This is marked as deprecated
diff --git a/utf8.h b/utf8.h
index d0b8742..88e74de 100644 (file)
--- a/utf8.h
+++ b/utf8.h
@@ -69,9 +69,7 @@ the string is invariant.
 #define uvchr_to_utf8_flags_msgs(d,uv,flags,msgs)                              \
                 uvoffuni_to_utf8_flags_msgs(d,NATIVE_TO_UNI(uv),flags, msgs)
 #define utf8_to_uvchr_buf(s, e, lenp)                                          \
-                                (__ASSERT_((U8*) (e) > (U8*) (s))              \
-                                 utf8n_to_uvchr(s, (U8*)(e) - (U8*)(s), lenp,  \
-                                    ckWARN_d(WARN_UTF8) ? 0 : UTF8_ALLOW_ANY))
+                   _utf8_to_uvchr_buf((const U8 *) (s), (const U8 *) e, lenp)
 #define utf8n_to_uvchr(s, len, lenp, flags)                                    \
                                 utf8n_to_uvchr_error(s, len, lenp, flags, 0)
 #define utf8n_to_uvchr_error(s, len, lenp, flags, errors)                      \
diff --git a/util.c b/util.c
index e6863f6..165d13a 100644 (file)
--- a/util.c
+++ b/util.c
@@ -5712,6 +5712,11 @@ S_my_mkostemp(char *templte, int flags) {
     STRLEN len = strlen(templte);
     int fd;
     int attempts = 0;
+#ifdef VMS
+    int delete_on_close = flags & O_VMS_DELETEONCLOSE;
+
+    flags &= ~O_VMS_DELETEONCLOSE;
+#endif
 
     if (len < 6 ||
         templte[len-1] != 'X' || templte[len-2] != 'X' || templte[len-3] != 'X' ||
@@ -5725,7 +5730,15 @@ S_my_mkostemp(char *templte, int flags) {
         for (i = 1; i <= 6; ++i) {
             templte[len-i] = TEMP_FILE_CH[(int)(Perl_internal_drand48() * TEMP_FILE_CH_COUNT)];
         }
-        fd = PerlLIO_open3(templte, O_RDWR | O_CREAT | O_EXCL | flags, 0600);
+#ifdef VMS
+        if (delete_on_close) {
+            fd = open(templte, O_RDWR | O_CREAT | O_EXCL | flags, 0600, "fop=dlt");
+        }
+        else
+#endif
+        {
+            fd = PerlLIO_open3(templte, O_RDWR | O_CREAT | O_EXCL | flags, 0600);
+        }
     } while (fd == -1 && errno == EEXIST && ++attempts <= 100);
 
     return fd;
diff --git a/util.h b/util.h
index d8fa3e8..d9df7b3 100644 (file)
--- a/util.h
+++ b/util.h
@@ -248,6 +248,17 @@ means arg not present, 1 is empty string/null byte */
 int mkstemp(char*);
 #endif
 
+#ifdef PERL_CORE
+#   if defined(VMS)
+/* only useful for calls to our mkostemp() emulation */
+#       define O_VMS_DELETEONCLOSE 0x40000000
+#       ifdef HAS_MKOSTEMP
+#           error 134221 will need a new solution for VMS
+#       endif
+#   else
+#       define O_VMS_DELETEONCLOSE 0
+#   endif
+#endif
 #if defined(HAS_MKOSTEMP) && defined(PERL_CORE)
 #   define Perl_my_mkostemp(templte, flags) mkostemp(templte, flags)
 #endif
index 5d334ef..3484866 100644 (file)
@@ -313,7 +313,7 @@ utils : $(utils1) $(utils2) $(utils3) $(utils4) $(utils5)
 extra.pods : miniperl
        @ @extra_pods.com
 
-PERLDELTA_CURRENT = [.pod]perl5311delta.pod
+PERLDELTA_CURRENT = [.pod]perl5312delta.pod
 
 $(PERLDELTA_CURRENT) : [.pod]perldelta.pod
        Copy/NoConfirm/Log $(MMS$SOURCE) $(PERLDELTA_CURRENT)
@@ -345,11 +345,11 @@ miniperl : $(DBG)miniperl$(E)  vmspipe.com
        @ Continue
 
 [.lib]buildcustomize.pl :  miniperlmain$(O), $(DBG)libperlmini$(OLB) $(CRTL) write_buildcustomize.pl
-       Link $(LINKFLAGS)/NoDebug/Trace/NoMap/NoFull/NoCross/Exe=$(MINIPERL_EXE) miniperlmain$(O), $(DBG)libperlmini$(OLB)/Library/Include=globals $(CRTLOPTS)
+       Link $(LINKFLAGS)/NoDebug/Trace/NoMap/NoFull/NoCross/Exe=$(MINIPERL_EXE) miniperlmain$(O),$(DBG)libperlmini$(OLB)/Library $(CRTLOPTS)
        $(MINIPERL) "-f" write_buildcustomize.pl
 
 $(DBG)miniperl$(E) :  miniperlmain$(O), $(DBG)libperlmini$(OLB) $(CRTL)
-       Link $(LINKFLAGS)/Trace/Exe=$(MMS$TARGET) miniperlmain$(O), $(DBG)libperlmini$(OLB)/Library/Include=globals  $(CRTLOPTS)
+       Link $(LINKFLAGS)/Trace/Exe=$(MMS$TARGET) miniperlmain$(O), $(DBG)libperlmini$(OLB)/Library $(CRTLOPTS)
 
 $(DBG)libperl$(OLB) : $(obj)
        @ If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)
index 6ed7eca..c3842c0 100644 (file)
@@ -172,7 +172,7 @@ else {
 }
 close OPTATTR;
 
-my $incstr = 'PERL,GLOBALS';
+my $incstr = 'perl,globals';
 my (@symfiles, $drvrname);
 
 # Initial hack to permit building of compatible shareable images for a
index a350fa1..e7ec0c8 100644 (file)
@@ -64,7 +64,7 @@ INST_TOP := $(INST_DRV)\perl
 # versioned installation can be obtained by setting INST_TOP above to a
 # path that includes an arbitrary version string.
 #
-#INST_VER      := \5.31.1
+#INST_VER      := \5.31.2
 
 #
 # Comment this out if you DON'T want your perl installation to have
@@ -1761,7 +1761,7 @@ utils: $(HAVEMINIPERL) ..\utils\Makefile
        copy ..\README.tw       ..\pod\perltw.pod
        copy ..\README.vos      ..\pod\perlvos.pod
        copy ..\README.win32    ..\pod\perlwin32.pod
-       copy ..\pod\perldelta.pod ..\pod\perl5311delta.pod
+       copy ..\pod\perldelta.pod ..\pod\perl5312delta.pod
        $(MINIPERL) -I..\lib $(PL2BAT) $(UTILS)
        $(MINIPERL) -I..\lib ..\autodoc.pl ..
        $(MINIPERL) -I..\lib ..\pod\perlmodlib.PL -q ..
@@ -1859,7 +1859,7 @@ distclean: realclean
        -if exist $(LIBDIR)\Win32API rmdir /s /q $(LIBDIR)\Win32API
        -if exist $(LIBDIR)\XS rmdir /s /q $(LIBDIR)\XS
        -cd $(PODDIR) && del /f *.html *.bat roffitall \
-           perl5311delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
+           perl5312delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
            perlapi.pod perlbs2000.pod perlcn.pod perlcygwin.pod \
            perldos.pod perlfreebsd.pod perlhaiku.pod perlhpux.pod \
            perlhurd.pod perlintern.pod perlirix.pod perljp.pod perlko.pod \
index 3dea8c5..9750b3a 100644 (file)
@@ -38,7 +38,7 @@ INST_TOP      = $(INST_DRV)\perl
 # versioned installation can be obtained by setting INST_TOP above to a
 # path that includes an arbitrary version string.
 #
-#INST_VER      = \5.31.1
+#INST_VER      = \5.31.2
 
 #
 # Comment this out if you DON'T want your perl installation to have
@@ -1282,7 +1282,7 @@ utils: $(PERLEXE) ..\utils\Makefile
        copy ..\README.tw       ..\pod\perltw.pod
        copy ..\README.vos      ..\pod\perlvos.pod
        copy ..\README.win32    ..\pod\perlwin32.pod
-       copy ..\pod\perldelta.pod ..\pod\perl5311delta.pod
+       copy ..\pod\perldelta.pod ..\pod\perl5312delta.pod
        cd ..\win32
        $(PERLEXE) $(PL2BAT) $(UTILS)
        $(MINIPERL) -I..\lib ..\autodoc.pl ..
@@ -1381,7 +1381,7 @@ distclean: realclean
        -if exist $(LIBDIR)\Win32API rmdir /s /q $(LIBDIR)\Win32API
        -if exist $(LIBDIR)\XS rmdir /s /q $(LIBDIR)\XS
        -cd $(PODDIR) && del /f *.html *.bat roffitall \
-           perl5311delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
+           perl5312delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
            perlapi.pod perlbs2000.pod perlcn.pod perlcygwin.pod \
            perldos.pod perlfreebsd.pod perlhaiku.pod perlhpux.pod \
            perlhurd.pod perlintern.pod perlirix.pod perljp.pod perlko.pod \
index 5a255b4..115c88c 100644 (file)
 /*#define      USE_64_BIT_ALL          / **/
 #endif
 
-/* USE_CBACKTRACE:
+/* USE_C_BACKTRACE:
  *     This symbol, if defined, indicates that Perl should
  *     be built with support for backtrace.
  */
-/*#define USE_CBACKTRACE               / **/
+/*#define USE_C_BACKTRACE              / **/
 
 /* USE_DTRACE:
  *     This symbol, if defined, indicates that Perl should
index b0fc347..05c8093 100644 (file)
 /*#define      USE_64_BIT_ALL          / **/
 #endif
 
-/* USE_CBACKTRACE:
+/* USE_C_BACKTRACE:
  *     This symbol, if defined, indicates that Perl should
  *     be built with support for backtrace.
  */
-/*#define USE_CBACKTRACE               / **/
+/*#define USE_C_BACKTRACE              / **/
 
 /* USE_DTRACE:
  *     This symbol, if defined, indicates that Perl should
index e3f2d4b..6f22d14 100644 (file)
@@ -45,7 +45,7 @@ INST_TOP      *= $(INST_DRV)\perl
 # versioned installation can be obtained by setting INST_TOP above to a
 # path that includes an arbitrary version string.
 #
-#INST_VER      *= \5.31.1
+#INST_VER      *= \5.31.2
 
 #
 # Comment this out if you DON'T want your perl installation to have
@@ -1678,7 +1678,7 @@ utils: $(HAVEMINIPERL) ..\utils\Makefile
        copy ..\README.tw       ..\pod\perltw.pod
        copy ..\README.vos      ..\pod\perlvos.pod
        copy ..\README.win32    ..\pod\perlwin32.pod
-       copy ..\pod\perldelta.pod ..\pod\perl5311delta.pod
+       copy ..\pod\perldelta.pod ..\pod\perl5312delta.pod
        $(MINIPERL) -I..\lib $(PL2BAT) $(UTILS)
        $(MINIPERL) -I..\lib ..\autodoc.pl ..
        $(MINIPERL) -I..\lib ..\pod\perlmodlib.PL -q ..
@@ -1776,7 +1776,7 @@ distclean: realclean
        -if exist $(LIBDIR)\Win32API rmdir /s /q $(LIBDIR)\Win32API
        -if exist $(LIBDIR)\XS rmdir /s /q $(LIBDIR)\XS
        -cd $(PODDIR) && del /f *.html *.bat roffitall \
-           perl5311delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
+           perl5312delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
            perlapi.pod perlbs2000.pod perlcn.pod perlcygwin.pod \
            perldos.pod perlfreebsd.pod perlhaiku.pod perlhpux.pod \
            perlhurd.pod perlintern.pod perlirix.pod perljp.pod perlko.pod \
index 8fe14ea..7579103 100644 (file)
@@ -60,6 +60,7 @@ POD = perl.pod        \
        perl5300delta.pod       \
        perl5310delta.pod       \
        perl5311delta.pod       \
+       perl5312delta.pod       \
        perl561delta.pod        \
        perl56delta.pod \
        perl581delta.pod        \
@@ -215,6 +216,7 @@ MAN = perl.man      \
        perl5300delta.man       \
        perl5310delta.man       \
        perl5311delta.man       \
+       perl5312delta.man       \
        perl561delta.man        \
        perl56delta.man \
        perl581delta.man        \
@@ -370,6 +372,7 @@ HTML = perl.html    \
        perl5300delta.html      \
        perl5310delta.html      \
        perl5311delta.html      \
+       perl5312delta.html      \
        perl561delta.html       \
        perl56delta.html        \
        perl581delta.html       \
@@ -525,6 +528,7 @@ TEX = perl.tex      \
        perl5300delta.tex       \
        perl5310delta.tex       \
        perl5311delta.tex       \
+       perl5312delta.tex       \
        perl561delta.tex        \
        perl56delta.tex \
        perl581delta.tex        \
index 8104d86..91fdffe 100644 (file)
@@ -2908,9 +2908,17 @@ win32_rewind(FILE *pf)
 DllExport int
 win32_tmpfd(void)
 {
+    return win32_tmpfd_mode(0);
+}
+
+DllExport int
+win32_tmpfd_mode(int mode)
+{
     char prefix[MAX_PATH+1];
     char filename[MAX_PATH+1];
     DWORD len = GetTempPath(MAX_PATH, prefix);
+    mode &= ~( O_ACCMODE | O_CREAT | O_EXCL );
+    mode |= O_RDWR;
     if (len && len < MAX_PATH) {
        if (GetTempFileName(prefix, "plx", 0, filename)) {
            HANDLE fh = CreateFile(filename,
@@ -2922,7 +2930,7 @@ win32_tmpfd(void)
                                   | FILE_FLAG_DELETE_ON_CLOSE,
                                   NULL);
            if (fh != INVALID_HANDLE_VALUE) {
-               int fd = win32_open_osfhandle((intptr_t)fh, 0);
+               int fd = win32_open_osfhandle((intptr_t)fh, mode);
                if (fd >= 0) {
                    PERL_DEB(dTHX;)
                    DEBUG_p(PerlIO_printf(Perl_debug_log,
index 6db4dc0..6311115 100644 (file)
@@ -735,5 +735,9 @@ DllExport void *win32_signal_context(void);
 #define Win_GetModuleFileName GetModuleFileName
 #define Win_CreateSemaphore   CreateSemaphore
 
+#if defined(PERL_CORE) && !defined(O_ACCMODE)
+#  define O_ACCMODE (O_RDWR | O_WRONLY | O_RDONLY)
+#endif
+
 #endif /* _INC_WIN32_PERL5 */
 
index 53330e5..559e1f9 100644 (file)
@@ -64,6 +64,7 @@ DllExport  int                win32_fgetpos(FILE *pf,fpos_t *p);
 DllExport  int         win32_fsetpos(FILE *pf,const fpos_t *p);
 DllExport  void                win32_rewind(FILE *pf);
 DllExport  int         win32_tmpfd(void);
+DllExport  int         win32_tmpfd_mode(int mode);
 DllExport  FILE*       win32_tmpfile(void);
 DllExport  void                win32_abort(void);
 DllExport  int         win32_fstat(int fd,Stat_t *sbufptr);